このチュートリアルでは、TorchServe フレームワークを使用して、GKE クラスタで事前トレーニング済みの PyTorch ML モデルを提供する方法について説明します。このチュートリアルで使用する ML モデルは、ユーザー リクエストに基づいて予測を生成します。このチュートリアルの情報は、GKE で独自のモデルを大規模にデプロイして提供するのに役立ちます。
チュートリアルのアプリケーションについて
このアプリケーションは、Fast Dash フレームワークを使用して作成された小さな Python ウェブ アプリケーションです。このアプリケーションを使用して、予測リクエストを T5 モデルに送信します。このアプリケーションは、ユーザーのテキスト入力と言語ペアをキャプチャし、その情報をモデルに送信します。このモデルはテキストを翻訳してアプリケーションに結果を返し、その結果をユーザーに表示します。Fast Dash の詳細については、Fast Dash のドキュメントをご覧ください。
仕組み
このチュートリアルでは、GKE Autopilot クラスタにワークロードをデプロイします。GKE は Autopilot ノードを完全に管理するため、ノード構成、スケーリング、アップグレードの管理オーバーヘッドが削減されます。ML ワークロードとアプリケーションを Autopilot にデプロイすると、GKE はワークロードを実行するために基盤となる適切なマシンタイプとサイズを選択します。詳細については、Autopilot の概要をご覧ください。
モデルをデプロイすると、アプリケーションで予測リクエストをモデルに送信するために使用できる予測 URL を取得できます。この方法では、モデルがアプリから切り離されるため、ウェブ アプリケーションから独立してモデルをスケーリングできます。
目標
- 事前トレーニング済みの T5 モデルを Hugging Face リポジトリから取得して、コンテナ イメージとしてパッケージ化し Artifact Registry に push することによりサービング用に準備する
- Autopilot クラスタにモデルをデプロイする
- モデルと通信する Fast Dash アプリケーションをデプロイする
- Prometheus 指標に基づいてモデルを自動スケーリングする
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine, Cloud Storage, Artifact Registry, and Cloud Build APIs:
gcloud services enable container.googleapis.com
storage.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine, Cloud Storage, Artifact Registry, and Cloud Build APIs:
gcloud services enable container.googleapis.com
storage.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
環境を準備する
サンプル リポジトリのクローンを作成し、チュートリアル ディレクトリを開きます。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/ai-ml/t5-model-serving
クラスタを作成する
次のコマンドを実行します。
gcloud container clusters create-auto ml-cluster \
--release-channel=RELEASE_CHANNEL \
--cluster-version=CLUSTER_VERSION \
--location=us-central1
次のように置き換えます。
RELEASE_CHANNEL
: クラスタのリリース チャンネル。rapid
、regular
、stable
のいずれかにする必要があります。L4 GPU を使用するため、GKE バージョン 1.28.3-gke.1203000 以降のチャンネルを選択します。特定のチャンネルで利用可能なバージョンを確認するには、リリース チャンネルのデフォルト バージョンと利用可能なバージョンを表示するをご覧ください。CLUSTER_VERSION
: 使用する GKE のバージョン。1.28.3-gke.1203000
以降にする必要があります。
オペレーションが完了するまでに数分かかります。
Artifact Registry リポジトリを作成する
クラスタと同じリージョンに、Docker 形式で新しい Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create models \ --repository-format=docker \ --location=us-central1 \ --description="Repo for T5 serving image"
リポジトリ名を確認します。
gcloud artifacts repositories describe models \ --location=us-central1
出力は次のようになります。
Encryption: Google-managed key Repository Size: 0.000MB createTime: '2023-06-14T15:48:35.267196Z' description: Repo for T5 serving image format: DOCKER mode: STANDARD_REPOSITORY name: projects/PROJECT_ID/locations/us-central1/repositories/models updateTime: '2023-06-14T15:48:35.267196Z'
モデルをパッケージ化する
このセクションでは、Cloud Build を使用してモデルとサービング フレームワークを単一のコンテナ イメージにパッケージ化し、生成されたイメージを Artifact Registry リポジトリに push します。
コンテナ イメージの Dockerfile を確認します。
この Dockerfile では、次の複数のステージのビルドプロセスを定義します。
- Hugging Face リポジトリからモデル アーティファクトをダウンロードします。
- PyTorch Serving Archive ツールを使用してモデルをパッケージ化します。これにより、推論サーバーがモデルを読み込むために使用するモデル アーカイブ(.mar)ファイルが作成されます。
- PyTorch Serve を使用して最終的なイメージをビルドします。
Cloud Build を使用してイメージをビルドして push します。
gcloud builds submit model/ \ --region=us-central1 \ --config=model/cloudbuild.yaml \ --substitutions=_LOCATION=us-central1,_MACHINE=gpu,_MODEL_NAME=t5-small,_MODEL_VERSION=1.0
ビルドプロセスの完了には数分かかります。モデルサイズが
t5-small
よりも大きい場合、ビルドプロセスに著しく時間がかかる可能性があります。イメージがリポジトリにあることを確認します。
gcloud artifacts docker images list us-central1-docker.pkg.dev/PROJECT_ID/models
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。出力は次のようになります。
IMAGE DIGEST CREATE_TIME UPDATE_TIME us-central1-docker.pkg.dev/PROJECT_ID/models/t5-small sha256:0cd... 2023-06-14T12:06:38 2023-06-14T12:06:38
パッケージ化されたモデルを GKE にデプロイする
イメージをデプロイするには、環境に合わせてサンプル リポジトリの Kubernetes マニフェストを変更します。
推論ワークロードのマニフェストを確認します。
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/serving-gpu.yaml"
これにより、Deployment 仕様のコンテナ イメージのパスが、Artifact Registry の T5 モデルイメージのパスと一致するようになります。
Kubernetes リソースを作成します。
kubectl create -f kubernetes/serving-gpu.yaml
モデルが正常にデプロイされたことを確認するには、次の操作を行います。
Deployment と Service のステータスを取得します。
kubectl get -f kubernetes/serving-gpu.yaml
次のような準備完了の Pod が出力に表示されるまで待ちます。イメージのサイズによっては、最初のイメージの pull に数分かかることがあります。
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/t5-inference 1/1 1 0 66s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/t5-inference ClusterIP 10.48.131.86 <none> 8080/TCP,8081/TCP,8082/TCP 66s
t5-inference
Service のローカルポートを開きます。kubectl port-forward svc/t5-inference 8080
新しいターミナル ウィンドウを開き、テスト リクエストを Service に送信します。
curl -v -X POST -H 'Content-Type: application/json' -d '{"text": "this is a test sentence", "from": "en", "to": "fr"}' "http://localhost:8080/predictions/t5-small/1.0"
テスト リクエストが失敗し、Pod 接続が閉じた場合は、ログを確認します。
kubectl logs deployments/t5-inference
出力が次のような場合、TorchServe は一部のモデル依存関係のインストールに失敗しています。
org.pytorch.serve.archive.model.ModelException: Custom pip package installation failed for t5-small
この問題を解決するには、Deployment を再起動します。
kubectl rollout restart deployment t5-inference
Deployment コントローラが新しい Pod を作成します。上記の手順を繰り返して、新しい Pod でポートを開きます。
ウェブ アプリケーションを使用して、デプロイされたモデルにアクセスする
Fast Dash ウェブ アプリケーションを、Artifact Registry のコンテナ イメージとしてビルドして push します。
gcloud builds submit client-app/ \ --region=us-central1 \ --config=client-app/cloudbuild.yaml
テキスト エディタで
kubernetes/application.yaml
を開き、image:
フィールドのPROJECT_ID
をプロジェクト ID に置き換えます。あるいは、次のコマンドを実行します。sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/application.yaml"
Kubernetes リソースを作成します。
kubectl create -f kubernetes/application.yaml
Deployment と Service が完全にプロビジョニングされるまでに時間がかかることがあります。
ステータスを確認するには、次のコマンドを実行します。
kubectl get -f kubernetes/application.yaml
次のような準備完了の Pod が出力に表示されるまで待ちます。
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/fastdash 1/1 1 0 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fastdash NodePort 203.0.113.12 <none> 8050/TCP 1m
ウェブ アプリケーションは実行されていますが、外部 IP アドレスで公開されていません。ウェブ アプリケーションにアクセスするには、ローカルポートを開きます。
kubectl port-forward service/fastdash 8050
ブラウザでウェブ インターフェースを開きます。
- ローカルシェルを使用している場合は、ブラウザを開いて http://127.0.0.1:8050 に移動します。
- Cloud Shell を使用している場合は、[ウェブでプレビュー]、[ポートを変更] の順にクリックします。ポート
8050
を指定します。
T5 モデルにリクエストを送信するには、ウェブ インターフェースの [TEXT]、[FROM LANG]、[TO LANG] の各フィールドに値を指定して、[送信] をクリックします。使用可能な言語の一覧については、T5 のドキュメントをご覧ください。
モデルの自動スケーリングを有効にする
このセクションでは、Google Cloud Managed Service for Prometheus の指標に基づいてモデルの自動スケーリングを有効にする方法について説明します。手順は次のとおりです。
- カスタム指標の Stackdriver アダプタをインストールする
- PodMonitoring と HorizontalPodAutoscaling 構成を適用する
Google Cloud Managed Service for Prometheus は、バージョン 1.25 以降を実行している Autopilot クラスタではデフォルトで有効になっています。
カスタム指標の Stackdriver アダプタをインストールする
このアダプタを使用すると、クラスタで Prometheus の指標を使用して Kubernetes の自動スケーリングに関する決定を行うことができます。
アダプタをデプロイします。
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
アダプタが使用する IAM サービス アカウントを作成します。
gcloud iam service-accounts create monitoring-viewer
IAM サービス アカウントに、プロジェクトに対する
monitoring.viewer
ロールとiam.workloadIdentityUser
ロールを付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。アダプタの Kubernetes ServiceAccount にアノテーションを付けて、IAM サービス アカウントの権限を借用できるようにします。
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace custom-metrics \ iam.gke.io/gcp-service-account=monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com
アダプタを再起動して変更を反映します。
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
PodMonitoring と HorizontalPodAutoscaling 構成を適用する
PodMonitoring は、特定の Namespace で指標の取り込みとターゲットのスクレイピングを可能にする Google Cloud Managed Service for Prometheus カスタム リソースです。
TorchServe Deployment と同じ Namespace に PodMonitoring リソースをデプロイします。
kubectl apply -f kubernetes/pod-monitoring.yaml
HorizontalPodAutoscaler マニフェストを確認します。
HorizontalPodAutoscaler は、リクエスト キューの累積期間に基づいて T5 モデルの Pod 数をスケーリングします。自動スケーリングは、キューの累積継続時間をマイクロ秒単位で示す
ts_queue_latency_microseconds
指標に基づいています。HorizontalPodAutoscaler を作成します。
kubectl apply -f kubernetes/hpa.yaml
負荷生成ツールを使用して自動スケーリングを確認する
自動スケーリングの構成をテストするには、サービスを提供するアプリケーションの負荷を生成します。このチュートリアルでは、Locust 負荷生成ツールを使用して、モデルの予測エンドポイントにリクエストを送信します。
負荷生成ツールを作成します。
kubectl apply -f kubernetes/loadgenerator.yaml
負荷生成ツール Pod の準備が整うまで待ちます。
負荷生成ツールのウェブ インターフェースをローカルで公開します。
kubectl port-forward svc/loadgenerator 8080
エラー メッセージが表示された場合は、Pod の実行中にもう一度お試しください。
ブラウザで、負荷生成ツールのウェブ インターフェースを開きます。
- ローカルシェルを使用している場合は、ブラウザを開いて http://127.0.0.1:8080 に移動します。
- Cloud Shell を使用している場合は、[ウェブでプレビュー]、[ポートを変更] の順にクリックします。ポート
8080
を入力します。
[グラフ] タブをクリックして、パフォーマンスの推移を確認します。
新しいターミナル ウィンドウを開き、HorizontalPodAutoscaler のレプリカ数を確認します。
kubectl get hpa -w
レプリカの数は、負荷が増加すると増加します。スケールアップに 10 分ほどかかる場合があります。新しいレプリカが開始されると、Locust チャートで成功したリクエストの数が増加します。
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE t5-inference Deployment/t5-inference 71352001470m/7M 1 5 1 2m11s
推奨事項
- サービングに使用するのと同じバージョンのベース Docker イメージでモデルをビルドします。
- モデルに特別なパッケージ依存関係がある場合、または依存関係のサイズが大きい場合は、ベース Docker イメージのカスタム バージョンを作成します。
- モデルの依存関係パッケージのツリー バージョンを監視します。パッケージの依存関係が互いのバージョンをサポートしていることを確認します。たとえば、Panda バージョン 2.0.3 は NumPy バージョン 1.20.3 以降をサポートしています。
- GPU ノードでは GPU 負荷の高いモデルを実行し、CPU ノードでは CPU 負荷の高いモデルを実行します。これにより、モデル サービングの安定性が向上し、ノードリソースを効率的に消費できます。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
リソースを個別に削除する
Kubernetes リソースを削除します。
kubectl delete -f kubernetes/loadgenerator.yaml kubectl delete -f kubernetes/hpa.yaml kubectl delete -f kubernetes/pod-monitoring.yaml kubectl delete -f kubernetes/application.yaml kubectl delete -f kubernetes/serving-gpu.yaml kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
GKE クラスタを削除します。
gcloud container clusters delete "ml-cluster" \ --location="us-central1" --quiet
IAM サービス アカウントと IAM ポリシー バインディングを削除します。
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts remove-iam-policy-binding monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]" gcloud iam service-accounts delete monitoring-viewer
Artifact Registry 内のイメージを削除します。必要に応じて、リポジトリ全体を削除します。手順については、Artifact Registry のドキュメントでイメージの削除をご覧ください。
コンポーネントの概要
このセクションでは、モデル、ウェブ アプリケーション、フレームワーク、クラスタなど、このチュートリアルで使用されるコンポーネントについて説明します。
T5 モデルについて
このチュートリアルでは、事前トレーニング済みの多言語 T5 モデルを使用します。T5 は、テキストをある言語から別の言語に翻訳するテキスト間の変換ツールです。T5 では、入力と出力は常にテキスト文字列ですが、BERT スタイルのモデルは入力のクラスラベルまたはスパンのいずれかしか出力できません。T5 モデルは、要約、Q&A、テキスト分類などのタスクにも使用できます。このモデルは、Colossal Clean Crawled Corpus(C4)と Wiki-DPR の大量のテキストでトレーニングされています。
詳細については、T5 モデルのドキュメントをご覧ください。
T5 モデルは、Colin Raffel、Noam Shazeer、Adam Roberts、Katherine Lee、Sharan Narang、Michael Matena、Yanqi Zhou、Wei Li、Peter J. Liu が『Journal of Machine Learning Research』で発表した論文「Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer」で公開されています。
T5 モデルは、さまざまなモデルサイズをサポートしており、特定のユースケースによって複雑さが異なります。このチュートリアルではデフォルト サイズ t5-small
を使用していますが、別のサイズを選択することもできます。次の T5 サイズは、Apache 2.0 ライセンスで配布されています。
t5-small
: 6,000 万個のパラメータt5-base
: 2 億 2,000 万個のパラメータt5-large
: 7 億 7,000 万個のパラメータ。3 GB のダウンロード。t5-3b
: 30 億のパラメータ。11 GB のダウンロード。t5-11b
: 110 億のパラメータ。45 GB のダウンロード。
利用可能な他の T5 モデルについては、Hugging Face リポジトリをご覧ください。
TorchServe について
TorchServe は、PyTorch モデルを提供するための柔軟なツールです。PyTorch、TensorFlow、ONNX など、主要なディープ ラーニング フレームワークのすべてで、設定を行わずにすぐに使用できます。TorchServe は、本番環境へのモデルのデプロイや、迅速なプロトタイピングとテストに使用できます。
次のステップ
- 複数の GPU を使用して LLM を提供する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。