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 包含三个关键增强功能:

  1. 灵活的序列长度:序列长度现在可以在运行之间自由修改。
  2. 输入可用性:所有模型输入均可用于推理。
  3. 分组输出:当使用 output_hidden_states=Trueoutput_attentions=True 时,hidden statesattention 会被分组为一个单一输出。

自定义推理签名

用户可以通过继承模型子类来定义自定义推理签名。当传递 inputs_embeds (token embeddings) 而不是 input_ids (token IDs) 时,这是必要的。通过重写 serving 方法并使用带有特定 input_signature@tf.function 装饰器,开发人员可以为 SavedModel 定义预期输入的准确名称、数据类型和形状。

部署工作流

部署用于情感分类的 BERT 模型涉及三个步骤:

  1. 模型创建:加载一个模型(例如 nateraw/bert-base-uncased-imdb)并使用 model.save_pretrained("my_model", saved_model=True) 保存它,以生成 SavedModel 版本以及 h5 权重。
  2. 容器化:使用 Docker 拉取 tensorflow/serving 镜像,将 SavedModel 复制到容器的 models 文件夹中,并提交镜像,同时设置 MODEL_NAME 环境变量。
  3. 推理:使用 REST API(通过 HTTP POST 请求)或 gRPC API(使用 tensorflow_serving.apis)查询已部署的模型。

未来方向

Hugging Face 计划将预处理阶段直接集成到 SavedModel 中,以进一步简化部署流程。

Sources