NVIDIA NIM を使用して GKE に AI モデルをデプロイする

1. はじめに

このハンズオン Codelab では、NVIDIA NIM™ マイクロサービスの機能を使用して、Google Kubernetes Engine(GKE)にコンテナ化された AI モデルをデプロイして管理する方法について説明します。

このチュートリアルは、次のようなことを求めているデベロッパーやデータ サイエンティストを対象としています。

  • AI 推論のデプロイを簡素化する: 事前構築済みの NIM を使用して、AI モデルを GKE の本番環境に迅速かつ簡単にデプロイする方法について説明します。
  • NVIDIA GPU のパフォーマンスを最適化する: NVIDIA TensorRT を使用して GKE クラスタ内の GPU で推論を最適化する NIM のデプロイを実際に体験します。
  • AI 推論ワークロードをスケーリングする: Kubernetes を使用して自動スケーリングを行い、コンピューティング リソースを管理することで、需要に基づいて NIM デプロイをスケーリングする方法について説明します。

2. 学習内容

このチュートリアルを終了すると、次の操作を体験できます。

  1. GKE への NIM のデプロイ: さまざまな推論タスク用に構築済みの NVIDIA NIM を GKE クラスタにデプロイします。
  2. NIM デプロイの管理: kubectl コマンドを使用して、デプロイされた NIM を管理、モニタリング、スケーリングします。
  3. 推論ワークロードのスケーリング: Kubernetes の機能を利用して、トラフィック需要に基づいて NIM デプロイを自動スケーリングします。

3. コンポーネントについて

Google Kubernetes Engine(GKE)の GPU

GPU を使用すると、ノードで実行される特定のワークロード(ML やデータ処理など)を高速化できます。GKE には、NVIDIA H100、L4、A100 GPU を搭載したマシンタイプをはじめとして、ノード構成用のさまざまなマシンタイプ オプションが用意されています。

NVIDIA NIM

NVIDIA NIM は、任意のクラウドまたはデータセンターでの基盤モデルのデプロイを高速化し、データのセキュリティを維持するのに役立つ、使いやすい推論マイクロサービスのセットです。

NVIDIA AI Enterprise

NVIDIA AI Enterprise は、データ サイエンス パイプラインを加速し、本番環境グレードのコパイロットやその他の生成 AI アプリケーションの開発とデプロイを合理化する、エンドツーエンドのクラウド ネイティブ ソフトウェア プラットフォームです。GCP Marketplace から入手できます。

4. 前提条件

  • プロジェクト: 課金が有効になっている Google Cloud プロジェクト。
  • 権限: GKE クラスタやその他の関連リソースを作成するのに十分な権限。
  • Helm: Helm は Kubernetes のパッケージ マネージャーです。
  • NVIDIA GPU Operator: GPU のプロビジョニングに必要なすべての NVIDIA ソフトウェア コンポーネントの管理を自動化する Kubernetes アドオン。
  • NVIDIA API キー: こちらのリンクをクリックし、アカウントを作成して API キーを生成する手順に沿って操作します。NIM コンテナをダウンロードするには、API キーが必要です。
  • NVIDIA GPU: 次のいずれかの GPU が動作するはずです(GPU が不足している場合は、こちらの手順に沿って割り当ての増加をリクエストしてください)。
  • 省略可 - GCloud SDK: GCP Portal で Cloud Shell を使用していない場合は、Google Cloud SDK がインストールされ、構成されていることを確認してください。
  • 省略可 - kubectl: GCP ポータルで Cloud Shell を使用していない場合は、kubectl コマンドライン ツールがインストールされ、構成されていることを確認してください。

5. GPU を使用して GKE クラスタを作成する

  1. Cloud Shell またはターミナルを開きます。
  2. 次のパラメータを指定します。
    export PROJECT_ID=<YOUR PROJECT ID>
    export REGION=<YOUR REGION>
    export ZONE=<YOUR ZONE>
    export CLUSTER_NAME=nim-demo
    export NODE_POOL_MACHINE_TYPE=g2-standard-16
    export CLUSTER_MACHINE_TYPE=e2-standard-4
    export GPU_TYPE=nvidia-l4
    export GPU_COUNT=1
    

使用している Compute インスタンスと GPU のタイプに応じて、NODE_POOL_MACHINE_TYPE、CLUSTER_MACHINE_TYPE、GPU_TYPE の値を変更する必要がある場合があります。

  1. GKE クラスタを作成します。
    gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --release-channel=rapid \
        --machine-type=${CLUSTER_MACHINE_TYPE} \
        --num-nodes=1
    
  2. GPU ノードプールを作成します。
    gcloud container node-pools create gpupool \
        --accelerator type=${GPU_TYPE},count=${GPU_COUNT},gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --cluster=${CLUSTER_NAME} \
        --machine-type=${NODE_POOL_MACHINE_TYPE} \
        --num-nodes=1
    

6. NVIDIA NGC API キーを構成する

NGC API キーを使用すると、NVIDIA NGC からカスタム イメージを pull できます。キーを指定するには:

export NGC_CLI_API_KEY="<YOUR NGC API KEY>"

これは、前提条件の一部として生成された鍵です。

7. NVIDIA NIM をデプロイしてテストする

  1. NIM LLM Helm チャートを取得します。
    helm fetch https://helm.ngc.nvidia.com/nim/charts/nim-llm-1.3.0.tgz --username='$oauthtoken' --password=$NGC_CLI_API_KEY
    
  2. NIM Namespace を作成します。
    kubectl create namespace nim
    
  3. シークレットを構成します。
    kubectl create secret docker-registry registry-secret --docker-server=nvcr.io --docker-username='$oauthtoken'     --docker-password=$NGC_CLI_API_KEY -n nim
    
    kubectl create secret generic ngc-api --from-literal=NGC_API_KEY=$NGC_CLI_API_KEY -n nim
    
  4. NIM 構成を設定します。
    cat <<EOF > nim_custom_value.yaml
    image:
      repository: "nvcr.io/nim/meta/llama3-8b-instruct" # container location
      tag: 1.0.0 # NIM version you want to deploy
    model:
      ngcAPISecret: ngc-api  # name of a secret in the cluster that includes a key named NGC_CLI_API_KEY and is an NGC API key
    persistence:
      enabled: true
    imagePullSecrets:
      -   name: registry-secret # name of a secret used to pull nvcr.io images, see https://kubernetes.io/docs/tasks/    configure-pod-container/pull-image-private-registry/
    EOF
    
  5. NIM デプロイの起動:
    helm install my-nim nim-llm-1.1.2.tgz -f nim_custom_value.yaml --namespace nim
    
    NIM Pod が実行されていることを確認します。
    kubectl get pods -n nim
    
  6. NIM デプロイのテスト:
    NIM サービスが正常にデプロイされたことを確認したら、推論リクエストを作成して、NIM サービスからどのようなフィードバックが返されるかを確認できます。これを行うには、サービスでポート転送を有効にして、ポート 8000 の localhost から NIM にアクセスできるようにします。
    kubectl port-forward service/my-nim-nim-llm 8000:8000 -n nim
    
    次に、Cloud Shell で別のターミナルまたはタブを開き、次のリクエストを試すことができます。
    curl -X 'POST' \
      'http://localhost:8000/v1/chat/completions' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "messages": [
        {
          "content": "You are a polite and respectful chatbot helping people plan a vacation.",
          "role": "system"
        },
        {
          "content": "What should I do for a 4 day vacation in Spain?",
          "role": "user"
        }
      ],
      "model": "meta/llama3-8b-instruct",
      "max_tokens": 128,
      "top_p": 1,
      "n": 1,
      "stream": false,
      "stop": "\n",
      "frequency_penalty": 0.0
    }'
    
    NIM サービスからチャット補完を取得した場合、サービスは想定どおりに動作しています。

8. クリーンアップ

GKE クラスタを削除します。

gcloud container clusters delete $CLUSTER_NAME --zone=$ZONE

9. 次のステップ

詳しくは、以下の記事をご覧ください。