1. 简介
本 Codelab 实践教程将引导您使用强大的 NVIDIA NIM™ 微服务,在 Google Kubernetes Engine (GKE) 上部署和管理容器化 AI 模型。
本教程面向希望实现以下目标的数据科学家和开发者:
- 简化 AI 推理部署:了解如何使用预构建的 NIM 在 GKE 上更快、更轻松地将 AI 模型部署到生产环境中。
- 优化 NVIDIA GPU 的性能:亲身体验如何部署使用 NVIDIA TensorRT 在 GKE 集群内的 GPU 上进行优化推理的 NIM。
- 扩缩 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 是一个端到端的云原生软件平台,可加速数据科学流水线,并简化生产级 AI 助手和其他生成式 AI 应用的开发和部署。通过 GCP Marketplace 提供。
4. 前提条件
- 项目:启用了结算功能的 Google Cloud 项目。
- 权限:有足够的权限来创建 GKE 集群和其他相关资源。
- Helm:Helm 是 Kubernetes 的软件包管理器。
- NVIDIA GPU Operator:一个 Kubernetes 插件,可自动管理预配 GPU 所需的所有 NVIDIA 软件组件。
- NVIDIA API 密钥:点击此链接,然后按照说明操作,创建账号并生成 API 密钥。下载 NIM 容器需要 API 密钥。
- NVIDIA GPU:以下 GPU 之一应可正常运行(请注意,如果您没有足够的 GPU,可以按照这些步骤申请增加配额)
- 可选 - GCloud SDK:如果您未使用 GCP 门户中的 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
- 配置 Secret:
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 访问 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 }'
8. 清理
删除 GKE 集群:
gcloud container clusters delete $CLUSTER_NAME --zone=$ZONE
9. 后续步骤
如需了解详情,请参阅以下文章: