Hugging Face で TF Serving を使用した TensorFlow ビジョンモデルのデプロイ

Hugging Face は、Transformers ライブラリから TensorFlow ベースのビジョンモデルを TensorFlow Serving (TF Serving) を使用してデプロイするワークフローを詳しく解説しています。このアプローチにより、開発者は Vision Transformer (ViT)、Masked Autoencoders、RegNet、ConvNeXt などの最先端モデルを、サーバー側バッチ処理やモデルのウォームアップを組み込んだ高性能な REST または gRPC エンドポイントとして公開できます。

TF Serving 用のモデル保存

TF Serving でモデルをデプロイするには、モデルが SavedModel 形式である必要があります。Hugging Face Transformers ライブラリの TensorFlow モデルには、save_pretrained() メソッドがあり、重みを h5 と SavedModel の両方の形式でシリアライズできます。

Vision Transformer (ViT) モデルの場合、TFViTForImageClassification.from_pretrained() でモデルをロードし、save_pretrained(saved_model=True) を呼び出す手順になります。デフォルトでは、TF Serving が必要とするバージョン付きディレクトリ構造(例: {model_dir}/saved_model/{version})が作成されます。

前処理と後処理のためのモデルサージェリーの実装

標準的な機械学習モデルは特定の前処理と後処理が必要です。トレーニングとサービングのずれを減らし、開発者の認知負荷を下げるために、これらの操作は「モデルサージェリー」を通じてモデルの計算グラフに直接埋め込むことができます。

前処理パイプライン

ViT モデルに対して必要な前処理ステップは以下の通りです:

  • Scaling: 画像のピクセル値を [0, 1] の範囲に変換する。
  • Normalization: モデル固有の平均と標準偏差を使用してピクセル値を [-1, 1] の範囲にスケーリングする。
  • Resizing: 画像を 224x224 の空間解像度にリサイズする。
  • Transposition: チャネル次元を前方に移動させ、Hugging Face モデルで使用される channel-first 形式に合わせる。

リクエストペイロードを最適化しサイズの膨張を防ぐために、ガイドでは入力として base64 エンコードされた文字列を受け取り、tf.io.decode_base64tf.io.decode_jpeg を使用してグラフ内でデコード・処理することが推奨されています。

後処理とエクスポート

後処理は生のモデルロジットを人間が読めるラベルに変換します。モデルの call() メソッドから具体的な関数を導出することで、開発者はモデルを serving_fn でラップできます。この関数は:

  1. 前処理パイプラインを実行する。
  2. モデル推論を実行する。
  3. ロジットに softmax 関数を適用して信頼度スコアを算出する。
  4. 結果のインデックスをモデルの id2label 設定を用いて文字列ラベルにマッピングする。

このラップされた関数は tf.saved_model.save() を使用して serving_default シグネチャとしてエクスポートされ、モデルの入力要件が 4D テンソルから文字列に、出力がラベルと信頼度スコアを含む辞書に変更されます。

TensorFlow Serving を用いたデプロイ

モデルがエクスポートされたら、tensorflow_model_server コマンドを使用してデプロイできます。主な設定パラメータは以下の通りです:

  • rest_api_port: REST エンドポイントのポート(デフォルトは通常 8501)。
  • model_name: API 呼び出し時に使用する識別子。
  • model_base_path: TF Serving が最新のモデルバージョンをロードするディレクトリ。

TF Serving はデプロイされたモデルに対して主に 2 つの問い合わせ方法を提供します:

REST エンドポイント

REST API はオンライン予測シナリオに適しています。リクエストは instances リスト内に base64 エンコードされた画像を含む JSON ペイロードとして送信されます。エンドポイントの形式は http://localhost:8501/v1/models/{model_name}:predict です。

gRPC エンドポイント

低レイテンシで高スケーラビリティ、分散システム向けには gRPC が推奨されるデプロイ方法です。grpc.insecure_channel で通信チャネルを開き、PredictionServiceStub を使用して PredictRequest ペイロードを送信します。gRPC は信頼度スコアと予測ラベルを含む構造化された出力を返します。

Sources