本页面可帮助您确定何时使用 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 节点池,请按以下步骤操作:
按照创建 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
- 设置
运行以下命令以获取集群的身份验证凭据:
USE_GKE_GCLOUD_AUTH_PLUGIN=True \ gcloud container clusters get-credentials CLUSTER_NAME [--zone COMPUTE_ZONE] [--region COMPUTE_REGION]
替换以下内容:
- CLUSTER_NAME:包含节点池的集群的名称。
- COMPUTE_REGION 或 COMPUTE_ZONE:分别根据集群是区域级集群还是可用区级集群来指定集群的区域或可用区。
输出类似于以下内容:
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.
(可选)验证您是否可以连接到集群。
kubectl get nodes -o wide
您应该会看到此集群中运行的所有节点的列表。
运行以下命令,为 NVIDIA GPU Operator 创建命名空间
gpu-operator
:kubectl create ns gpu-operator
输出类似于以下内容:
namespace/gpu-operator created
运行以下命令,在
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
查看
gpu-operator
命名空间的资源配额:kubectl get -n gpu-operator resourcequota gpu-operator-quota
输出类似于以下内容:
NAME AGE REQUEST LIMIT gpu-operator-quota 2m27s pods: 0/100
在 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”部分中所述。
运行以下命令,验证 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。
添加 NVIDIA Helm 代码库:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
使用 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=true
和cdi.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 GPU Operator 是否已成功安装。
如需检查 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
如需检查节点的“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
如需检查 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
后续步骤
- 了解如何在 Standard 节点池中运行 GPU。
- 了解 GKE 的 GPU 共享策略。
- 了解使用 GKE 中的 GPU 自动扩缩 LLM 推理工作负载的最佳实践。
- 浏览 NVIDIA GPU Operator 文档。