Hugging Face Transformers v4.2.0 TensorFlow 效能與服務更新
Hugging Face 已更新其多個關鍵模型的 TensorFlow 實作,以提高穩健性與推論速度。這些改進特別針對 BERT、RoBERTa、ELECTRA 和 MPNet,在 graph/eager mode、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 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會被分組為單一輸出。
自定義服務簽章 (Custom Serving Signatures)
使用者可以透過繼承模型類別來定義自定義服務簽章。當傳遞 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 中,以進一步簡化部署流程。