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 リリースで見られたバージョンよりも 2 倍高速です。

TensorFlow Serving の統合

本番環境でこれらのパフォーマンス向上を活用するために、Hugging Face は、HTTP および gRPC API を介してモデルをデプロイできる TensorFlow Extended (TFX) のコンポーネントである TensorFlow Serving との統合を最適化しました。

SavedModel フォーマット

TensorFlow Serving は、モデルが SavedModel フォーマットであることを要求します。これは、モデルのアーキテクチャと重みをスタンドアロンのパッケージとして含んでいます。このフォーマットにより、元のソースコードなしでモデルを実行でき、C++、Java、Go、および JavaScript などのバックエンドをサポートします。

Transformers v4.2.0 以降、SavedModel の作成には 3 つの主要な強化が含まれます:

  1. Flexible Sequence Length: シーケンス長は、実行間で自由に変更できます。
  2. Input Availability: すべてのモデル入力が推論に使用可能です。
  3. Grouped Outputs: output_hidden_states=True または output_attentions=True が使用される場合、hidden states または attention は単一の出力にグループ化されます。

カスタムサービングシグネチャ

ユーザーはモデルをサブクラス化して、カスタムサービングシグネチャを定義できます。これは、input_ids (token IDs) の代わりに inputs_embeds (token embeddings) を渡す場合に必要です。serving メソッドをオーバーライドし、特定の input_signature を持つ @tf.function デコレータを使用することで、開発者は SavedModel に期待される入力の名前、データ型、および形状を正確に定義できます。

デプロイメントワークフロー

感情分類のための BERT モデルのデプロイは、3 つのステップのプロセスで行われます:

  1. Model Creation: モデル (例: nateraw/bert-base-uncased-imdb) をロードし、model.save_pretrained("my_model", saved_model=True) を使用して保存することで、h5 重みとともに SavedModel バージョンを生成します。
  2. Containerization: Docker を使用して tensorflow/serving イメージをプルし、SavedModel をコンテナの models フォルダにコピーし、MODEL_NAME 環境変数に設定してイメージをコミットします。
  3. Inference: REST API (HTTP POST リクエスト経由) または gRPC API (tensorflow_serving.apis を使用) を使用して、デプロイされたモデルにクエリを送信します。

将来の方向性

Hugging Face は、デプロイメントパイプラインをさらに簡略化するために、前処理ステージを SavedModel に直接統合することを目指しています。

Sources