このチュートリアルでは、Google Kubernetes Engine(GKE)で GPU を使用し、NVIDIA Triton Inference Server と TensorFlow Serving を使用して大規模言語モデル(LLM)をデプロイしてサービングする方法について説明します。これにより、マネージド Kubernetes 環境での推論のための実用的な LLM デプロイを理解し、探索するための基盤が提供されます。単一の L4 Tensor Core GPU を使用する GKE クラスタに事前構築済みコンテナをデプロイし、オンライン推論を行うように GKE インフラストラクチャを準備します。
このチュートリアルは、GKE クラスタで事前トレーニング済みの ML モデルをホストする ML エンジニア、プラットフォーム管理者、オペレーター、データおよび AI スペシャリストを対象としています。 Google Cloudのコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。
このページを読む前に、次のことをよく理解しておいてください。
Cloud Storage バケットを作成する
提供する事前トレーニング済みモデルを保存する Cloud Storage バケットを作成します。
Cloud Shell で次のコマンドを実行します。
gcloud storage buckets create gs://$GSBUCKET
GKE 用 Workload Identity 連携を使用してバケットにアクセスするようにクラスタを構成する
クラスタから Cloud Storage バケットにアクセスできるようにする手順は次のとおりです。
- Google Cloud サービス アカウントを作成する。
- クラスタに Kubernetes ServiceAccount を作成する。
- Kubernetes ServiceAccount を Google Cloud サービス アカウントにバインドする。
Google Cloud サービス アカウントを作成する
Google Cloud コンソールで、[サービス アカウントの作成] ページに移動します。
[サービス アカウント ID] フィールドに「
gke-ai-sa
」と入力します。[作成して続行] をクリックします。
[ロール] リストで、[Cloud Storage] > [Storage Insights コレクタ サービス] ロールを選択します。
[
別のロールを追加] をクリックします。[ロールを選択] リストで、[Cloud Storage] > [Storage Object Admin] ロールを選択します。
[続行] をクリックして [完了] をクリックします。
クラスタに Kubernetes ServiceAccount を作成する
Cloud Shell で、次の操作を行います。
Kubernetes Namespace を作成します。
kubectl create namespace gke-ai-namespace
Namespace に Kubernetes ServiceAccount を作成します。
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Kubernetes ServiceAccount を Google Cloud サービス アカウントにバインドする
Cloud Shell で、次のコマンドを実行します。
Google Cloud サービス アカウントに IAM バインディングを追加します。
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
--member
フラグは、 Google Cloud上の Kubernetes ServiceAccount の完全な ID を指定します。Kubernetes ServiceAccount にアノテーションを付けます。
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
オンライン推論サーバーをデプロイする
各オンライン推論フレームワークは、特定の形式の事前トレーニング済み ML モデルを探すように構成されています。次のセクションでは、使用するフレームワークに応じて推論サーバーをデプロイする方法について説明します。
Triton
Cloud Shell で、事前トレーニング済み ML モデルを Cloud Storage バケットにコピーします。
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
Deployment を使用してフレームワークをデプロイします。Deployment は、クラスタ内のノードに分散された Pod の複数のレプリカを実行できる Kubernetes API オブジェクトです。
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
フレームワークがデプロイされたことを確認します。
kubectl get deployments --namespace=gke-ai-namespace
フレームワークの準備が整うと、出力は次のようになります。
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29s
Deployment にアクセスする Service をデプロイします。
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
外部 IP が割り当てられていることを確認します。
kubectl get services --namespace=gke-ai-namespace
出力は次のようになります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m triton-server LoadBalancer 34.118.227.176 35.239.54.228 8000:30866/TCP,8001:31035/TCP,8002:30516/TCP 5m14s
EXTERNAL-IP 列にある
triton-server
の IP アドレスをメモします。Service と Deployment が正常に機能していることを確認します。
curl -v EXTERNAL_IP:8000/v2/health/ready
出力は次のようになります。
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
TF Serving
Cloud Shell で、事前トレーニング済み ML モデルを Cloud Storage バケットにコピーします。
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
Deployment を使用してフレームワークをデプロイします。Deployment は、クラスタ内のノードに分散された Pod の複数のレプリカを実行できる Kubernetes API オブジェクトです。
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
フレームワークがデプロイされたことを確認します。
kubectl get deployments --namespace=gke-ai-namespace
フレームワークの準備が整うと、出力は次のようになります。
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29s
Deployment にアクセスする Service をデプロイします。
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
外部 IP が割り当てられていることを確認します。
kubectl get services --namespace=gke-ai-namespace
出力は次のようになります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m tfserve-server LoadBalancer 34.118.227.176 35.239.54.228 8500:30003/TCP,8000:32194/TCP 5m14s
EXTERNAL-IP 列にある
tfserve-server
の IP アドレスをメモします。Service と Deployment が正常に機能していることを確認します。
curl -v EXTERNAL_IP:8000/v1/models/mnist
EXTERNAL_IP
は、外部 IP アドレスに置き換えます。出力は次のようになります。
... < HTTP/1.1 200 OK < Content-Type: application/json < Date: Thu, 12 Oct 2023 19:01:19 GMT < Content-Length: 154 < { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }
モデルを提供する
Triton
Cloud Shell で Python 仮想環境を作成します。
python -m venv ./mnist_client source ./mnist_client/bin/activate
必要な Python パッケージをインストールします。
pip install -r src/client/triton-requirements.txt
画像を読み込んで Triton Inference Server をテストします。
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
次のように置き換えます。
EXTERNAL_IP
: 外部 IP アドレス。TEST_IMAGE
: テストする画像のファイル名。src/client/images
に保存されている画像を使用できます。
使用する画像に応じて、出力は次のようになります。
Calling Triton HTTP Service -> Prediction result: 7
TF Serving
Cloud Shell で Python 仮想環境を作成します。
python -m venv ./mnist_client source ./mnist_client/bin/activate
必要な Python パッケージをインストールします。
pip install -r src/client/tfserve-requirements.txt
いくつかの画像を使用して TensorFlow Serving をテストします。
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
次のように置き換えます。
EXTERNAL_IP
: 外部 IP アドレス。TEST_IMAGE
:0
~9
の値です。src/client/images
に保存されている画像を使用できます。
使用する画像に応じて、次のような出力が表示されます。
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
モデルのパフォーマンスをモニタリングする
Triton
モデルのパフォーマンスをモニタリングするには、Cloud Monitoring で Triton ダッシュボードの統合を使用します。このダッシュボードでは、トークンのスループット、リクエスト レイテンシ、エラー率などの重要なパフォーマンス指標を確認できます。
Triton ダッシュボードを使用するには、GKE クラスタで Google Cloud Managed Service for Prometheus を有効にする必要があります。これにより、Triton から指標が収集されるようになります。Triton はデフォルトで Prometheus 形式の指標を公開するため、追加のエクスポータをインストールする必要はありません。
その後、指標を Triton ダッシュボードで確認できます。Google Cloud Managed Service for Prometheus を使用してモデルから指標を収集する方法については、Cloud Monitoring のドキュメントで Triton のオブザーバビリティ ガイダンスをご覧ください。TF Serving
モデルのパフォーマンスをモニタリングするには、Cloud Monitoring で TF Serving ダッシュボードの統合を使用します。このダッシュボードでは、トークンのスループット、リクエスト レイテンシ、エラー率などの重要なパフォーマンス指標を確認できます。
TF Serving ダッシュボードを使用するには、GKE クラスタで Google Cloud Managed Service for Prometheus を有効にする必要があります。これにより、TF Serving から指標が収集されるようになります。
こうして、TF Serving ダッシュボードを開いて指標を確認できます。Google Cloud Managed Service for Prometheus を使用してモデルから指標を収集する方法については、Cloud Monitoring のドキュメントで TF Serving のオブザーバビリティ ガイダンスをご覧ください。