NVIDIA GPU 驱动程序自定义资源定义#
GPU 驱动程序自定义资源定义概述#
注意
技术预览功能在生产环境中不受支持,功能也不完整。技术预览功能提供对即将推出的产品功能的早期访问,使客户能够在开发过程中测试功能并提供反馈。这些版本可能没有任何文档,并且测试受到限制。
此功能不支持从早期版本的 NVIDIA GPU Operator 升级。您必须卸载现有安装,然后重新安装 Operator。卸载 Operator 会中断需要访问 NVIDIA GPU 的服务和应用程序。
作为技术预览功能,您可以创建一个或多个 NVIDIA 驱动程序自定义资源实例,以指定要在特定节点上配置的 NVIDIA GPU 驱动程序类型和驱动程序版本。您可以在节点选择器字段中指定标签,以控制将哪个 NVIDIA 驱动程序配置应用于特定节点。
比较:使用 CRD 与集群策略管理驱动程序#
在引入 NVIDIA GPU 驱动程序自定义资源定义之前,您可以通过修改集群策略自定义资源定义的 driver 字段和子字段来管理驱动程序。
下表总结了这两种方法之间的主要区别。
集群策略 CRD |
NVIDIA 驱动程序 CRD |
---|---|
|
|
驱动程序守护程序集#
NVIDIA GPU Operator 为每个 NVIDIA 驱动程序自定义资源和每个操作系统版本启动一个驱动程序守护程序集。
例如,如果您的集群有一个 NVIDIA 驱动程序自定义资源,该资源指定了 535 分支 GPU 驱动程序,并且某些工作节点运行 Ubuntu 20.04,而其他工作节点运行 Ubuntu 22.04,则 Operator 将启动两个驱动程序守护程序集。一个守护程序集在 Ubuntu 20.04 节点上配置 GPU 驱动程序,另一个守护程序集在 Ubuntu 22.04 节点上配置驱动程序。所有节点都运行相同的 535 分支 GPU 驱动程序。
如果您选择使用预编译驱动程序容器,则 Operator 将为每个 Linux 内核版本启动一个驱动程序守护程序集。
例如,如果某些节点运行 Ubuntu 22.04 和 5.15.0-84-generic 内核,而其他节点运行 5.15.0-78-generic 内核,则 Operator 将启动两个守护程序集。
关于默认 NVIDIA 驱动程序自定义资源#
默认情况下,helm chart 在安装期间配置默认 NVIDIA 驱动程序自定义资源。此自定义资源不包含节点选择器,因此,该自定义资源适用于集群中每个具有 NVIDIA GPU 的节点。Operator 为集群中的每个操作系统版本启动一个驱动程序守护程序集和 Pod。
如果您计划配置自己的驱动程序自定义资源以指定驱动程序版本、类型等,那么您可能更喜欢避免安装默认自定义资源。通过阻止安装,您可以避免节点选择器冲突,因为默认自定义资源匹配所有节点,而您的自定义资源匹配某些相同的节点。
要阻止配置默认自定义资源,请在您使用 Helm 安装 Operator 时指定 --set driver.nvidiaDriverCRD.deployDefaultCR=false
参数。
功能兼容性#
- 驱动程序类型
每个 NVIDIA 驱动程序自定义资源都指定驱动程序类型,并且是
gpu
、vgpu
或vgpu-host-manager
之一。您可以在某些节点上运行数据中心驱动程序 (gpu
),在其他节点上运行 vGPU 驱动程序。- GPUDirect RDMA 和 GPUDirect Storage
每个 NVIDIA 驱动程序自定义资源都可以指定如何配置 GPUDirect RDMA 和 GPUDirect Storage (GDS)。请参阅 GPUDirect RDMA 和 GPUDirect Storage 以了解平台支持和先决条件。
- GDRCopy
每个 NVIDIA 驱动程序自定义资源都可以在驱动程序 Pod 中启用 GDRCopy 边车容器。
- 预编译和签名驱动程序
您可以在某些节点上运行默认驱动程序类型(在驱动程序 Pod 启动时编译),在其他节点上运行预编译驱动程序容器。预编译驱动程序容器的 限制和约束 适用。
- 节点上预安装的驱动程序
如果节点上的操作系统中安装了 NVIDIA GPU 驱动程序,则该节点上不会运行驱动程序容器。
- 支持 X86_64 和 ARM64
每个守护程序集都可以为 X86_64 和 ARM64 架构运行 Pod 和驱动程序容器。请参阅 NVIDIA GPU 驱动程序标签 网页,以确定哪些驱动程序版本和操作系统组合支持这两种架构。
关于 NVIDIA 驱动程序自定义资源#
NVIDIA 驱动程序自定义资源的实例表示要在节点上安装和管理的特定 NVIDIA GPU 驱动程序类型和驱动程序版本。
apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
name: demo-gold
spec:
driverType: gpu
gdrcopy:
enabled: false
repository: nvcr.io/nvidia/cloud-native
image: gdrdrv
version: v2.4.1
imagePullPolicy: IfNotPresent
imagePullSecrets: []
env: []
args: []
image: driver
imagePullPolicy: IfNotPresent
imagePullSecrets: []
manager: {}
nodeSelector:
driver.config: "gold"
rdma:
enabled: false
useHostMofed: false
gds:
enabled: false
repository: nvcr.io/nvidia
startupProbe:
failureThreshold: 120
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 60
useOpenKernelModules: false
usePrecompiled: false
version: 535.104.12
下表描述了自定义资源中的一些字段。
字段 |
描述 |
默认值 |
---|---|---|
|
指定 NVIDIA 驱动程序自定义资源的名称。 |
无 |
|
指定要添加到驱动程序 Pod 的自定义注解的键值对映射。 |
无 |
|
指定以下之一
|
|
|
指定要传递到驱动程序容器的环境变量。 |
无 |
|
指定是否部署 GDRCopy 驱动程序。当设置为 |
|
|
指定是否启用 GPUDirect Storage。 |
|
|
指定驱动程序容器镜像名称。 |
|
|
指定 kubelet 下载容器镜像的策略。请参阅 Kubernetes 文档以了解 镜像拉取策略。 |
请参阅 Kubernetes 文档。 |
|
如果注册表已保护,则指定要提供给注册表的凭据。 |
无 |
|
指定要添加到驱动程序 Pod 的自定义标签的键值对映射。 |
无 |
|
指定要匹配的一个或多个节点标签。驱动程序容器计划在与所有标签匹配的节点上运行。 |
无。当您不指定此字段时,驱动程序自定义资源将选择所有节点。 |
|
指定驱动程序 Pod 的优先级类。 |
|
|
指定是否启用 GPUDirect RDMA。 |
|
|
指定包含驱动程序容器的容器注册表。 |
|
|
指定使用 NVIDIA Open GPU Kernel 模块。 |
|
|
指定要应用于驱动程序 Pod 的一组容忍度。 |
无 |
|
当设置为 |
|
|
指定要安装的 GPU 驱动程序版本。对于数据中心驱动程序,指定类似 |
请参阅 GPU Operator 组件矩阵。 |
安装 NVIDIA GPU Operator#
执行以下步骤以安装 GPU Operator 并使用 NVIDIA 驱动程序自定义资源。
可选:如果您想在集群中运行多个驱动程序类型或版本,请标记工作节点以标识要在每个节点上安装的驱动程序类型和版本
示例
$ kubectl label node <node-name> --overwrite driver.version=525.125.06
要使用驱动程序类型的组合(例如 vGPU),请标记节点的驱动程序类型。
要使用驱动程序版本的组合,请标记节点的不同版本。
要使用传统驱动程序和预编译驱动程序容器的组合,请标记节点的不同类型。
安装 Operator。
添加 NVIDIA Helm 仓库
$ helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
安装 Operator 并至少指定
--set driver.nvidiaDriverCRD.enabled=true
参数$ helm install --wait --generate-name \ -n gpu-operator --create-namespace \ nvidia/gpu-operator \ --version=v24.9.2 --set driver.nvidiaDriverCRD.enabled=true
默认情况下,Helm 在安装期间配置
default
NVIDIA 驱动程序自定义资源。要阻止配置默认自定义资源,还请指定--set driver.nvidiaDriverCRD.deployDefaultCR=false
。
应用 NVIDIA 驱动程序自定义资源清单,为您的节点安装 NVIDIA GPU 驱动程序版本、类型等。请参阅示例清单。
NVIDIA 驱动程序清单示例#
所有节点上的一个驱动程序类型和版本#
可选:删除先前应用的节点标签。
创建一个文件,例如
nvd-all.yaml
,内容如下apiVersion: nvidia.com/v1alpha1 kind: NVIDIADriver metadata: name: demo-all spec: driverType: gpu image: driver imagePullPolicy: IfNotPresent imagePullSecrets: [] manager: {} rdma: enabled: false useHostMofed: false gds: enabled: false repository: nvcr.io/nvidia startupProbe: failureThreshold: 120 initialDelaySeconds: 60 periodSeconds: 10 timeoutSeconds: 60 usePrecompiled: false version: 535.104.12
提示
由于清单不包含
nodeSelector
字段,因此驱动程序自定义资源会选择集群中所有具有 NVIDIA GPU 的节点。应用清单
$ kubectl apply -n gpu-operator -f nvd-all.yaml
可选:监控进度
$ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
多个驱动程序版本#
标记节点。
在某些节点上,应用类似以下的标签
$ kubectl label node <node-name> --overwrite driver.config="gold"
在其他节点上,应用类似以下的标签
$ kubectl label node <node-name> --overwrite driver.config="silver"
创建一个文件,例如
nvd-driver-multiple.yaml
,内容如下apiVersion: nvidia.com/v1alpha1 kind: NVIDIADriver metadata: name: demo-gold spec: driverType: gpu env: [] image: driver imagePullPolicy: IfNotPresent imagePullSecrets: [] manager: {} nodeSelector: driver.config: "gold" repository: nvcr.io/nvidia version: "535.104.12" --- apiVersion: nvidia.com/v1alpha1 kind: NVIDIADriver metadata: name: demo-silver spec: driverType: gpu env: [] image: driver imagePullPolicy: IfNotPresent imagePullSecrets: [] manager: {} nodeSelector: driver.config: "silver" repository: nvcr.io/nvidia version: "470.141.10"
应用清单
$ kubectl apply -n gpu-operator -f nvd-driver-multiple.yaml
可选:监控进度
$ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
所有节点上的一个预编译驱动程序容器#
可选:删除先前应用的节点标签。
创建一个文件,例如
nvd-precompiled-all.yaml
,内容如下apiVersion: nvidia.com/v1alpha1 kind: NVIDIADriver metadata: name: demo-precomp-all spec: driverType: gpu env: [] image: driver imagePullPolicy: IfNotPresent imagePullSecrets: [] manager: {} nodeSelector: {} repository: nvcr.io/nvidia resources: {} usePrecompiled: true version: "535"
提示
由于清单不包含
nodeSelector
字段,因此驱动程序自定义资源会选择集群中所有具有 NVIDIA GPU 的节点。应用清单
$ kubectl apply -n gpu-operator -f nvd-precompiled-all.yaml
可选:监控进度
$ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
某些节点上的预编译驱动程序容器#
标记节点,如以下示例所示
$ kubectl label node <node-name> --overwrite driver.precompiled="true" $ kubectl label node <node-name> --overwrite driver.version="535"
创建一个文件,例如
nvd-precomiled-some.yaml
,内容如下apiVersion: nvidia.com/v1alpha1 kind: NVIDIADriver metadata: name: demo-precomp spec: driverType: gpu env: [] image: driver imagePullPolicy: IfNotPresent imagePullSecrets: [] manager: {} nodeSelector: driver.precompiled: "true" driver.version: "535" repository: nvcr.io/nvidia resources: {} usePrecompiled: true version: "535"
应用清单
$ kubectl apply -n gpu-operator -f nvd-precompiled-some.yaml
可选:监控进度
$ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
升级 NVIDIA GPU 驱动程序#
您可以通过编辑或修补 NVIDIA 驱动程序自定义资源来升级驱动程序版本。
当您更新自定义资源时,Operator 会对受影响的守护程序集中的 Pod 执行滚动更新。
更新驱动程序自定义资源中的
driver.version
字段$ kubectl patch nvidiadriver/demo-silver --type='json' \ -p='[{"op": "replace", "path": "/spec/version", "value": "525.125.06"}]'
可选:监控进度
$ kubectl get pods -n gpu-operator -l app.kubernetes.io/component=nvidia-driver
示例输出
NAME READY STATUS RESTARTS AGE nvidia-gpu-driver-ubuntu20.04-788484b9bb-6zhd9 1/1 Running 0 5m1s nvidia-gpu-driver-ubuntu22.04-8896c4bf7-7s68q 1/1 Terminating 0 37m nvidia-gpu-driver-ubuntu22.04-8896c4bf7-jm74l 1/1 Running 0 37m
最终,Operator 将使用先前驱动程序版本的 Pod 替换为使用更新驱动程序版本的 Pod。
故障排除#
如果驱动程序守护程序集和 Pod 未按预期运行,请执行以下步骤。
显示 NVIDIA 驱动程序自定义资源
$ kubectl get nvidiadrivers
示例输出
NAME STATUS AGE default notReady 2023-10-13T14:03:24Z demo-precomp notReady 2023-10-13T14:21:55Z
状态在修改资源后不久报告未就绪是正常的。
如果状态未就绪,请描述资源
$ kubectl describe nvidiadriver demo-precomp
示例输出
Name: demo-precomp ... Version: 535.104.05 Status: Conditions: Last Transition Time: 2023-10-13T14:33:30Z Message: Reason: Error Status: False Type: Ready Last Transition Time: 2023-10-13T14:33:30Z Message: Waiting for driver pod to be ready Reason: DriverNotReady Status: True Type: Error State: notReady
显示驱动程序守护程序集的节点选择器。选择器从 NVIDIA 驱动程序自定义资源设置
$ kubectl get -n gpu-operator ds -l app.kubernetes.io/component=nvidia-driver
示例输出
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nvidia-gpu-driver-ubuntu20.04-788484b9bb 1 1 1 1 1 driver.config=silver,feature.node.kubernetes.io/system-os_release.ID=ubuntu,feature.node.kubernetes.io/system-os_release.VERSION_ID=20.04,nvidia.com/gpu.deploy.driver=true,nvidia.com/gpu.present=true 10m nvidia-gpu-driver-ubuntu22.04-8896c4bf7 2 2 2 2 2 driver.config=gold,feature.node.kubernetes.io/system-os_release.ID=ubuntu,feature.node.kubernetes.io/system-os_release.VERSION_ID=22.04,nvidia.com/gpu.deploy.driver=true,nvidia.com/gpu.present=true 10m
查看 GPU Operator Pod 的日志
$ kubectl logs -n gpu-operator deployment/gpu-operator
示例输出
{"level":"info","ts":1697223780.333307,"logger":"controllers.Upgrade","msg":"Node hosting a driver pod","node":"worker-2","state":"upgrade-done"} {"level":"info","ts":1697223780.3376482,"logger":"controllers.Upgrade","msg":"Node hosting a driver pod","node":"worker-1","state":"upgrade-done"} {"level":"info","ts":1697223780.345211,"logger":"controllers.Upgrade","msg":"Node hosting a driver pod","node":"worker-0","state":"upgrade-done"} {"level":"error","ts":1697223780.3452845,"logger":"controllers.Upgrade","msg":"Failed to build node upgrade state for pod","pod":{"namespace":"gpu-operator","name":"nvidia-gpu-driver-ubuntu22.04-6d4df6b96f-c6hfd"},"error":"unable to get node : resource name may not be empty"}