TF Serving を使用した Kubernetes 上の Hugging Face ViT デプロイ

Hugging Face は、🤗 Transformers ライブラリの Vision Transformer (ViT) モデルのデプロイを Docker と Kubernetes、TensorFlow Serving を用いてスケールさせるワークフローを詳述しています。このアプローチにより、開発者はコンテナ化と自動オーケストレーションにより高トラフィックを処理できる本番環境へと移行できます。

Docker と Kubernetes を用いたモデルデプロイのスケーリング

実運用プロジェクトでモデルデプロイをスケールさせるために、Hugging Face は 2 段階のワークフローを推奨しています。まずアプリケーションロジックをコンテナ化し、次にそのコンテナを Kubernetes クラスタにデプロイします。SageMaker や Vertex AI といったマネージドサービスもありますが、Docker と Kubernetes を使用することで、デプロイに対するより細かな制御が可能になり、複雑なインフラ管理を抽象化できます。

この実装では、Google Kubernetes Engine (GKE) を使用してクラスタをプロビジョニングおよび管理していますが、同様の概念は Amazon EKS やローカルツールの Minikube など他のプラットフォームでも適用可能です。

Docker を用いたコンテナ化プロセス

TensorFlow Serving は、モデルが SavedModel 形式で、特定のディレクトリ構造 <MODEL_NAME>/<VERSION>/<SavedModel> に配置されていることを要求します。この構造により、TensorFlow Serving はモデルの複数バージョンを同時に管理できます。

カスタムイメージのビルド

本番環境向けイメージを作成するプロセスは以下の通りです:

  1. ディレクトリ設定: SavedModel を構造化されたパス(例: models/hf-vit/1)に配置する。
  2. ベースイメージの統合: 公式の tensorflow/serving イメージを起動し、models ディレクトリを実行中のコンテナにコピーする。
  3. イメージのコミット: docker commit を使用して新しいイメージを作成し、MODEL_NAME 環境変数(例: hf-vit)を設定して、TensorFlow Serving にデプロイするモデルを指定する。

ローカルでのテストと配布

クラスタへデプロイする前に、ポート 8500(gRPC)と 8501(HTTP/REST)をマッピングしてローカルでイメージをテストします。検証が完了したら、gcloud auth configure-dockerdocker push を使用して、Google Container Registry (GCR) などのレジストリへイメージをプッシュします。

Kubernetes デプロイとオーケストレーション

Kubernetes クラスタへのデプロイは、インフラのプロビジョニングと、YAML マニフェストを通じてアプリケーションの望ましい状態を定義することを含みます。

インフラストラクチャのプロビジョニング

GKE を使用して、特定のマシンタイプ(例: n1-standard-8)とノード数でクラスタをプロビジョニングします。認証と接続は gcloud container clusters get-credentials コマンドで行われます。

Kubernetes マニフェスト

関心事を分離するために、3 つの主要なマニフェストファイルが使用されます:

  • deployment.yaml: Docker イメージ URI、リソース制限(例: cpu: 800m)および TensorFlow Serving 固有の引数を定義します。主なチューニングパラメータは tensorflow_inter_op_parallelism(推奨値: 2)と tensorflow_intra_op_parallelism(推奨値: 物理 CPU コア数)です。
  • service.yaml: LoadBalancer を設定し、gRPC(ポート 8500)と REST(ポート 8501)のエンドポイントを外部に公開します。
  • hpa.yaml: Horizontal Pod Autoscaler(HPA)を実装し、targetCPUUtilizationPercentage(例: 80%)に基づいてレプリカ数(例: 1〜3)を自動的に調整します。

複数のマニフェストを管理するために、Hugging Face は Kustomize の使用を推奨しています。kustomize build . | kubectl apply -f - という単一コマンドでデプロイできます。

テストと最適化

エンドポイントの検証

kubectl get svc で外部 IP を取得したら、REST API に base64 エンコードされた画像バイト列を送信してエンドポイントをテストできます。リクエストが成功すると、予測ラベルと信頼度スコアが返されます。

TensorFlow Serving の設定

パフォーマンスをさらに最適化するために、TensorFlow Serving は以下の設定を提供します:

  • enable_batching: タイミングウィンドウ内で受信リクエストを収集し、バッチ推論を実行します。個別の即時予測が不要なアプリケーションに対して非常に効率的です。
  • enable_model_warmup: ダミー入力データを使用して TensorFlow コンポーネントを遅延初期化し、実際のサービス開始時の遅延を排除します。

ハードウェア最適化

TensorFlow Serving は AVX512 などハードウェア固有の命令セットを利用して高速化できます。デプロイ対象のハードウェアに合わせて最適化された TensorFlow Serving イメージを使用することで、ディープラーニングモデルの推論を大幅に高速化できます。

Sources