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

1. 简介

本 Codelab 实践教程将引导您使用强大的 NVIDIA NIM™ 微服务,在 Google Kubernetes Engine (GKE) 上部署和管理容器化 AI 模型。

本教程面向希望实现以下目标的数据科学家和开发者:

  • 简化 AI 推理部署:了解如何使用预构建的 NIM 在 GKE 上更快、更轻松地将 AI 模型部署到生产环境中。
  • 优化 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,您可以加速在节点上运行的特定工作负载,例如机器学习和数据处理。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 集群

  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. 配置 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
    
  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 访问 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. 后续步骤

如需了解详情,请参阅以下文章: