使用 NVIDIA NIM 在 GKE 上部署 AI 模型

使用 NVIDIA NIM 在 GKE 上部署 AI 模型

程式碼研究室簡介

subject上次更新時間:7月 16, 2025
account_circle作者:Jason Davenport (Google), Dimitri Maltezakis Vathypetrou (NVIDIA)

1. 簡介

這個實作程式碼研究室將引導您使用 NVIDIA NIM™ 微服務,在 Google Kubernetes Engine (GKE) 上部署及管理容器化 AI 模型。

本教學課程適用於想達成下列目標的開發人員和資料科學家:

  • 簡化 AI 推論部署作業:瞭解如何使用預先建構的 NIM,在 GKE 中更快更輕鬆地將 AI 模型部署到正式環境。
  • 提升 NVIDIA GPU 效能:實際操作,在 GKE 叢集內部署使用 NVIDIA TensorRT 的 NIM,在 GPU 上執行最佳化推論作業。
  • 調度 AI 推論工作負載:瞭解如何使用 Kubernetes 自動調度及管理運算資源,根據需求調度 NIM 部署作業。

2. 學習目標

完成本教學課程後,您將能:

  1. 在 GKE 上部署 NIM:將預先建構的 NVIDIA NIM 部署至 GKE 叢集,執行各種推論工作。
  2. 管理 NIM 部署作業:使用 kubectl 指令管理、監控及調度已部署的 NIM。
  3. 調度推論工作負載:運用 Kubernetes 功能,根據流量需求自動調度 NIM 部署作業。

3. 瞭解元件

Google Kubernetes Engine (GKE) 中的 GPU

GPU 可加速處理節點上執行的特定工作負載,例如機器學習和資料處理。GKE 提供各種機器類型選項,供您設定節點,包括搭載 NVIDIA H100、L4 和 A100 GPU 的機器類型。

NVIDIA NIM

NVIDIA NIM 是一組易於使用的推論微服務,可加速在任何雲端或資料中心部署基礎模型,並協助確保資料安全。

NVIDIA AI Enterprise

NVIDIA AI Enterprise 是端對端的雲端原生軟體平台,可加速資料科學 pipeline,並簡化正式環境副駕駛和其他生成式 AI 應用程式的開發與部署作業。可透過 GCP Marketplace 取得。

4. 必要條件

  • 專案:啟用計費功能的 Google Cloud 專案。
  • 權限:有足夠的權限可建立 GKE 叢集和其他相關資源。
  • HelmHelm 是 Kubernetes 的套件管理工具。
  • NVIDIA GPU 運算子Kubernetes 外掛程式,可自動管理佈建 GPU 時所需的所有 NVIDIA 軟體元件。
  • NVIDIA API 金鑰:按一下這個連結,然後按照說明建立帳戶並產生 API 金鑰。下載 NIM 容器時需要 API 金鑰。
  • NVIDIA GPU:下列其中一種 GPU 應可運作 (請注意,如果 GPU 不足,您可以按照這些步驟申請增加配額)
  • 選用 - GCloud SDK:** 如果您未使用 Google Cloud Platform 入口網站中的 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 提取自訂映像檔。如要指定金鑰:

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 命名空間:
    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