使用 NVIDIA NIM 在 GKE 上部署 AI 模型
程式碼研究室簡介
subject上次更新時間:7月 16, 2025
1. 簡介
這個實作程式碼研究室將引導您使用 NVIDIA NIM™ 微服務,在 Google Kubernetes Engine (GKE) 上部署及管理容器化 AI 模型。
本教學課程適用於想達成下列目標的開發人員和資料科學家:
- 簡化 AI 推論部署作業:瞭解如何使用預先建構的 NIM,在 GKE 中更快更輕鬆地將 AI 模型部署到正式環境。
- 提升 NVIDIA GPU 效能:實際操作,在 GKE 叢集內部署使用 NVIDIA TensorRT 的 NIM,在 GPU 上執行最佳化推論作業。
- 調度 AI 推論工作負載:瞭解如何使用 Kubernetes 自動調度及管理運算資源,根據需求調度 NIM 部署作業。
2. 學習目標
完成本教學課程後,您將能:
- 在 GKE 上部署 NIM:將預先建構的 NVIDIA NIM 部署至 GKE 叢集,執行各種推論工作。
- 管理 NIM 部署作業:使用 kubectl 指令管理、監控及調度已部署的 NIM。
- 調度推論工作負載:運用 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 叢集和其他相關資源。
- Helm:Helm 是 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 叢集
- 開啟 Cloud Shell 或終端機。
- 請指定以下參數:
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 的值。
- 建立 GKE 叢集:
gcloud container clusters create ${CLUSTER_NAME} \
--project=${PROJECT_ID} \
--location=${ZONE} \
--release-channel=rapid \
--machine-type=${CLUSTER_MACHINE_TYPE} \
--num-nodes=1 - 建立 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
- 擷取 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
- 建立 NIM 命名空間:
kubectl create namespace nim
- 設定密鑰:
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 - 設定 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 - 啟動 NIM 部署作業:
確認 NIM Pod 正在執行:helm install my-nim nim-llm-1.1.2.tgz -f nim_custom_value.yaml --namespace nim
kubectl get pods -n nim
- 測試 NIM 部署作業:
確認 NIM 服務部署成功後,我們就可以提出推論要求,瞭解 NIM 服務會提供哪種意見回饋。為此,我們會在服務上啟用通訊埠轉送,以便透過通訊埠 8000 上的 localhost 存取 NIM: 接著,我們可以在 Cloud Shell 中開啟另一個終端機或分頁,然後嘗試下列要求:kubectl port-forward service/my-nim-nim-llm 8000:8000 -n nim
如果從 NIM 服務取得對話完成結果,表示服務運作正常!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
}'