Hugging Face Transformers v4.2.0 TensorFlow 性能与推理服务更新
Hugging Face 更新了多个关键模型的 TensorFlow 实现,以提高鲁棒性和推理速度。这些改进专门针对 BERT、RoBERTa、ELECTRA 和 MPNet,在 graph/eager 模式、TensorFlow Serving 以及 CPU、GPU 和 TPU 设备上均提供了性能提升。
计算性能提升
Transformers v4.2.0 为 TensorFlow 模型带来了显著的计算速度提升。在 GPU V100 上,使用 128 的序列长度将 v4.2.0 的 BERT 实现与 Google 官方实现进行基准测试对比,v4.2.0 版本快了约 10%。
| Batch size | Google implementation (ms) | v4.2.0 implementation (ms) | Relative difference |
|---|---|---|---|
| 1 | 6.7 | 6.26 | 6.79% |
| 2 | 9.4 | 8.68 | 7.96% |
| 4 | 14.4 | 13.1 | 9.45% |
| 8 | 24 | 21.5 | 10.99% |
| 16 | 46.6 | 42.3 | 9.67% |
| 32 | 83.9 | 80.4 | 4.26% |
| 64 | 171.5 | 156 | 9.47% |
| 128 | 338.5 | 309 | 9.11% |
此外,v4.2.0 的实现速度是 4.1.1 版本中的实现的两倍。
TensorFlow Serving 集成
为了在生产环境中利用这些性能提升,Hugging Face 优化了与 TensorFlow Serving 的集成,TensorFlow Serving 是 TensorFlow Extended (TFX) 的一个组件,允许通过 HTTP 和 gRPC API 部署模型。
SavedModel 格式
TensorFlow Serving 要求模型采用 SavedModel 格式,该格式将模型架构和权重包含在一个独立的包中。这种格式允许模型在无需原始源代码的情况下运行,并支持 C++、Java、Go 和 JavaScript 等后端。
自 Transformers v4.2.0 起,创建 SavedModel 包含三个关键增强功能:
- 灵活的序列长度:序列长度现在可以在运行之间自由修改。
- 输入可用性:所有模型输入均可用于推理。
- 分组输出:当使用
output_hidden_states=True或output_attentions=True时,hidden states或attention会被分组为一个单一输出。
自定义推理签名
用户可以通过继承模型子类来定义自定义推理签名。当传递 inputs_embeds (token embeddings) 而不是 input_ids (token IDs) 时,这是必要的。通过重写 serving 方法并使用带有特定 input_signature 的 @tf.function 装饰器,开发人员可以为 SavedModel 定义预期输入的准确名称、数据类型和形状。
部署工作流
部署用于情感分类的 BERT 模型涉及三个步骤:
- 模型创建:加载一个模型(例如
nateraw/bert-base-uncased-imdb)并使用model.save_pretrained("my_model", saved_model=True)保存它,以生成SavedModel版本以及 h5 权重。 - 容器化:使用 Docker 拉取
tensorflow/serving镜像,将SavedModel复制到容器的 models 文件夹中,并提交镜像,同时设置MODEL_NAME环境变量。 - 推理:使用 REST API(通过 HTTP POST 请求)或 gRPC API(使用
tensorflow_serving.apis)查询已部署的模型。
未来方向
Hugging Face 计划将预处理阶段直接集成到 SavedModel 中,以进一步简化部署流程。