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 包含三項關鍵增強功能:

  1. 靈活的序列長度:序列長度現在可以在每次執行之間自由修改。
  2. 輸入可用性:所有模型輸入皆可用於推論。
  3. 分組輸出:當使用 output_hidden_states=Trueoutput_attentions=True 時,hidden statesattention 會被分組為單一輸出。

自定義服務簽章 (Custom Serving Signatures)

使用者可以透過繼承模型類別來定義自定義服務簽章。當傳遞 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