GKE で単一の GPU を持つモデルを提供する

このチュートリアルでは、Google Kubernetes Engine(GKE)で GPU を使用し、NVIDIA Triton Inference ServerTensorFlow 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 バケットにアクセスできるようにする手順は次のとおりです。

  1. Google Cloud サービス アカウントを作成する。
  2. クラスタに Kubernetes ServiceAccount を作成する。
  3. Kubernetes ServiceAccount を Google Cloud サービス アカウントにバインドする。

Google Cloud サービス アカウントを作成する

  1. Google Cloud コンソールで、[サービス アカウントの作成] ページに移動します。

    [サービス アカウントの作成] に移動

  2. [サービス アカウント ID] フィールドに「gke-ai-sa」と入力します。

  3. [作成して続行] をクリックします。

  4. [ロール] リストで、[Cloud Storage] > [Storage Insights コレクタ サービス] ロールを選択します。

  5. [ 別のロールを追加] をクリックします。

  6. [ロールを選択] リストで、[Cloud Storage] > [Storage Object Admin] ロールを選択します。

  7. [続行] をクリックして [完了] をクリックします。

クラスタに Kubernetes ServiceAccount を作成する

Cloud Shell で、次の操作を行います。

  1. Kubernetes Namespace を作成します。

    kubectl create namespace gke-ai-namespace
    
  2. Namespace に Kubernetes ServiceAccount を作成します。

    kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
    

Kubernetes ServiceAccount を Google Cloud サービス アカウントにバインドする

Cloud Shell で、次のコマンドを実行します。

  1. 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 を指定します。

  2. 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

  1. Cloud Shell で、事前トレーニング済み ML モデルを Cloud Storage バケットにコピーします。

    gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
    
  2. Deployment を使用してフレームワークをデプロイします。Deployment は、クラスタ内のノードに分散された Pod の複数のレプリカを実行できる Kubernetes API オブジェクトです。

    envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. フレームワークがデプロイされたことを確認します。

    kubectl get deployments --namespace=gke-ai-namespace
    

    フレームワークの準備が整うと、出力は次のようになります。

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    triton-deployment    1/1     1            1           5m29s
    
  4. Deployment にアクセスする Service をデプロイします。

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. 外部 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 アドレスをメモします。

  6. Service と Deployment が正常に機能していることを確認します。

    curl -v EXTERNAL_IP:8000/v2/health/ready
    

    出力は次のようになります。

    ...
    < HTTP/1.1 200 OK
    < Content-Length: 0
    < Content-Type: text/plain
    ...
    

TF Serving

  1. Cloud Shell で、事前トレーニング済み ML モデルを Cloud Storage バケットにコピーします。

    gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
    
  2. Deployment を使用してフレームワークをデプロイします。Deployment は、クラスタ内のノードに分散された Pod の複数のレプリカを実行できる Kubernetes API オブジェクトです。

    envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. フレームワークがデプロイされたことを確認します。

    kubectl get deployments --namespace=gke-ai-namespace
    

    フレームワークの準備が整うと、出力は次のようになります。

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    tfserve-deployment   1/1     1            1           5m29s
    
  4. Deployment にアクセスする Service をデプロイします。

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. 外部 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 アドレスをメモします。

  6. 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

  1. Cloud Shell で Python 仮想環境を作成します。

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. 必要な Python パッケージをインストールします。

    pip install -r src/client/triton-requirements.txt
    
  3. 画像を読み込んで 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

  1. Cloud Shell で Python 仮想環境を作成します。

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. 必要な Python パッケージをインストールします。

    pip install -r src/client/tfserve-requirements.txt
    
  3. いくつかの画像を使用して 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: 09 の値です。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 のオブザーバビリティ ガイダンスをご覧ください。