在 Google Kubernetes Engine (GKE) 上使用 NVIDIA GPU Operator 管理 GPU 堆栈


本页面可帮助您确定何时使用 NVIDIA GPU Operator,并介绍如何在 GKE 上启用 NVIDIA GPU Operator。

概览

操作器是 Kubernetes 软件扩展程序,可让用户创建用于管理应用及其组件的自定义资源。除了 Kubernetes 本身提供的功能之外,您还可以使用运算符自动执行复杂任务,例如部署和升级应用。

NVIDIA GPU Operator 是一个 Kubernetes 操作器,可提供一个通用基础架构和 API,用于部署、配置和管理在 Kubernetes 集群中预配 NVIDIA GPU 所需的软件组件。NVIDIA GPU Operator 可为您提供一致的体验,简化 GPU 资源管理,并简化将 GPU 加速型工作负载集成到 Kubernetes 的流程。

为何使用 NVIDIA GPU Operator?

我们建议您为 GPU 节点使用 GKE GPU 管理功能,因为 GKE 会完全管理 GPU 节点生命周期。如需开始使用 GKE 管理 GPU 节点,请选择以下任一选项:

或者,如果您希望在多个云服务提供商之间获得一致的体验,已经在使用 NVIDIA GPU Operator,或者使用依赖于 NVIDIA GPU Operator 的软件,NVIDIA GPU Operator 可能适合您。

如需了解在这些选项之间进行决策时应考虑的更多事项,请参阅通过 GKE 或 GKE 上的 NVIDIA GPU Operator 管理 GPU 栈

限制

Container-Optimized OS (COS) 和 Ubuntu 节点映像都支持 NVIDIA GPU Operator,但存在以下限制:

  • GPU Operator 24.6.0 版或更高版本开始,GKE 支持 NVIDIA GPU Operator。
  • Autopilot 集群不支持 NVIDIA GPU Operator。
  • Windows 节点映像不支持 NVIDIA GPU Operator。
  • NVIDIA GPU Operator 不受 GKE 管理。如需升级 NVIDIA GPU Operator,请参阅 NVIDIA 文档

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 确保您满足在 Standard 节点池中运行 GPU 中的要求。
  • 验证您是否已在开发环境中安装 Helm。 Helm 已预安装在 Cloud Shell 中。

    虽然没有特定的 Helm 版本要求,但您可以使用以下命令验证是否已安装 Helm。

    helm version
    

    如果输出类似于 Command helm not found,则您可以通过运行以下命令安装 Helm CLI:

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 \
      && chmod 700 get_helm.sh \
      && ./get_helm.sh
    

创建和设置 GPU 节点池

如需创建和设置 GPU 节点池,请按以下步骤操作:

  1. 按照创建 GPU 节点池中的说明创建 GPU 节点池,并进行以下修改:

    • 设置 gpu-driver-version=disabled 以跳过自动安装 GPU 驱动程序,因为使用 NVIDIA GPU Operator 时不支持自动安装。
    • 设置 --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" 以停用 GKE 管理的 GPU 设备插件 DaemonSet。

    运行以下命令,并根据需要附加其他标志以创建 GPU 节点池:

    gcloud container node-pools create POOL_NAME \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=disabled \
      --node-labels="gke-no-default-nvidia-gpu-device-plugin=true"
    

    替换以下内容:

    • POOL_NAME 您为节点池选择的名称。
    • GPU_TYPE:您要使用的 GPU 加速器 的类型。例如 nvidia-h100-80gb
    • AMOUNT:要挂接到节点池中节点的 GPU 数量。

    例如,以下命令会在地区性集群 a3-cluster 中创建一个名为 a3nodepool 的 GKE 节点池,该节点池带有 H100 GPU。在此示例中,GKE GPU 设备插件 DaemonSet 和自动驱动程序安装已停用。

    gcloud container node-pools create a3nodepool \
      --region=us-central1 --cluster=a3-cluster \
      --node-locations=us-central1-a \
      --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=disabled \
      --machine-type=a3-highgpu-8g \
      --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" \
      --num-nodes=1
    
  2. 运行以下命令以获取集群的身份验证凭据:

    USE_GKE_GCLOUD_AUTH_PLUGIN=True \
    gcloud container clusters get-credentials CLUSTER_NAME [--zone COMPUTE_ZONE] [--region COMPUTE_REGION]
    

    替换以下内容:

    • CLUSTER_NAME:包含节点池的集群的名称。
    • COMPUTE_REGIONCOMPUTE_ZONE:分别根据集群是区域级集群还是可用区级集群来指定集群的区域或可用区。

    输出类似于以下内容:

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    
  3. (可选)验证您是否可以连接到集群。

    kubectl get nodes -o wide
    

    您应该会看到此集群中运行的所有节点的列表。

  4. 运行以下命令,为 NVIDIA GPU Operator 创建命名空间 gpu-operator

    kubectl create ns gpu-operator
    

    输出类似于以下内容:

    namespace/gpu-operator created
    
  5. 运行以下命令,在 gpu-operator 命名空间中创建资源配额:

    kubectl apply -n gpu-operator -f - << EOF
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: gpu-operator-quota
    spec:
      hard:
        pods: 100
      scopeSelector:
        matchExpressions:
        - operator: In
          scopeName: PriorityClass
          values:
            - system-node-critical
            - system-cluster-critical
    EOF
    

    输出类似于以下内容:

    resourcequota/gpu-operator-quota created
    
  6. 查看 gpu-operator 命名空间的资源配额:

    kubectl get -n gpu-operator resourcequota gpu-operator-quota
    

    输出类似于以下内容:

    NAME                 AGE     REQUEST       LIMIT
    gpu-operator-quota   2m27s   pods: 0/100
    
  7. 在 Container-Optimized OS 或 Ubuntu 节点上手动安装驱动程序。如需了解详细说明,请参阅手动安装 NVIDIA GPU 驱动程序

    • 如果使用 COS,请运行以下命令来部署安装 DaemonSet 并安装默认的 GPU 驱动程序版本:

      kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
      
    • 如果使用 Ubuntu,您部署的 DaemonSet 取决于 GPU 类型和 GKE 节点版本,如说明的“Ubuntu”部分中所述。

  8. 运行以下命令,验证 GPU 驱动程序版本:

    kubectl logs -l k8s-app=nvidia-driver-installer  \
      -c "nvidia-driver-installer" --tail=-1 -n kube-system
    

    如果 GPU 驱动程序安装成功,则输出类似于以下内容:

    I0716 03:17:38.863927    6293 cache.go:66] DRIVER_VERSION=535.183.01
    …
    I0716 03:17:38.863955    6293 installer.go:58] Verifying GPU driver installation
    I0716 03:17:41.534387    6293 install.go:543] Finished installing the drivers.
    

安装 NVIDIA GPU Operator

本部分介绍如何使用 Helm 安装 NVIDIA GPU Operator。如需了解详情,请参阅 NVIDIA 文档中的安装 NVIDIA GPU Operator

  1. 添加 NVIDIA Helm 代码库:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
      && helm repo update
    
  2. 使用 Helm 安装 NVIDIA GPU Operator,并使用以下配置选项:

    • 确保 GPU 运算符版本为 24.6.0 或更高版本。
    • 使用 hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia 在 GPU 运算符中配置驱动程序安装路径。
    • 为 COS 和 Ubuntu 设置工具包安装路径 toolkit.installDir=/home/kubernetes/bin/nvidia。在 COS 中,/home 目录是可写的,并用作存储 NVIDIA 运行时二进制文件的有状态位置。如需了解详情,请参阅 COS 磁盘和文件系统概览
    • 使用 cdi.enabled=truecdi.default=true 在 GPU 运维程序中启用容器设备接口 (CDI),因为旧版模式不受支持。GKE 上的 COS 和 Ubuntu 都需要 CDI。
    helm install --wait --generate-name \
      -n gpu-operator \
      nvidia/gpu-operator \
      --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \
      --set toolkit.installDir=/home/kubernetes/bin/nvidia \
      --set cdi.enabled=true \
      --set cdi.default=true \
      --set driver.enabled=false
    

    如需详细了解这些设置,请参阅 NVIDIA 文档中的常见图表自定义选项常见部署场景

  3. 验证 NVIDIA GPU Operator 是否已成功安装。

    1. 如需检查 GPU 运算符运算数是否正常运行,请运行以下命令。

      kubectl get pods -n gpu-operator
      

      输出类似于以下内容:

      NAME                                                          READY    STATUS
      RESTARTS   AGE
      gpu-operator-5c7cf8b4f6-bx4rg                                 1/1      Running   0          11m
      gpu-operator-node-feature-discovery-gc-79d6d968bb-g7gv9       1/1      Running   0          11m
      gpu-operator-node-feature-discovery-master-6d9f8d497c-thhlz   1/1      Running   0          11m
      gpu-operator-node-feature-discovery-worker-wn79l              1/1      Running   0          11m
      gpu-feature-discovery-fs9gw                                   1/1      Running   0          8m14s
      gpu-operator-node-feature-discovery-worker-bdqnv              1/1      Running   0          9m5s
      nvidia-container-toolkit-daemonset-vr8fv                      1/1      Running   0          8m15s
      nvidia-cuda-validator-4nljj                                   0/1      Completed 0          2m24s
      nvidia-dcgm-exporter-4mjvh                                    1/1      Running   0          8m15s
      nvidia-device-plugin-daemonset-jfbcj                          1/1      Running   0          8m15s
      nvidia-mig-manager-kzncr                                      1/1      Running   0          2m5s
      nvidia-operator-validator-fcrr6                               1/1      Running   0          8m15s
      
    2. 如需检查节点的“Allocatable”(可分配)字段中是否正确配置了 GPU 数量,请运行以下命令:

      kubectl describe node GPU_NODE_NAME | grep Allocatable -A7
      

      GPU_NODE_NAME 替换为具有 GPU 的节点的名称。

      输出类似于以下内容:

      Allocatable:
      cpu:                11900m
      ephemeral-storage:  47060071478
      hugepages-1Gi:      0
      hugepages-2Mi:      0
      memory:             80403000Ki
      nvidia.com/gpu:     1           # showing correct count of GPU associated with the nods
      pods:               110
      
    3. 如需检查 GPU 工作负载是否正常运行,您可以使用 cuda-vectoradd 工具:

      cat << EOF | kubectl create -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: cuda-vectoradd
      spec:
        restartPolicy: OnFailure
        containers:
        - name: vectoradd
          image: nvidia/samples:vectoradd-cuda11.2.1
          resources:
            limits:
              nvidia.com/gpu: 1
      EOF
      

      然后运行以下命令:

      kubectl logs cuda-vectoradd
      

      输出类似于以下内容:

      [Vector addition of 50000 elements]
      Copy input data from the host memory to the CUDA device
      CUDA kernel launch with 196 blocks of 256 threads
      Copy output data from the CUDA device to the host memory
      Test PASSED
      Done
      

后续步骤