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 驱动程序。

_images/nvd-basics.svg

如果您选择使用预编译驱动程序容器,则 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 驱动程序自定义资源都指定驱动程序类型,并且是 gpuvgpuvgpu-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 驱动程序类型和驱动程序版本。

NVIDIA 驱动程序清单示例#
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

下表描述了自定义资源中的一些字段。

字段

描述

默认值

metadata.name

指定 NVIDIA 驱动程序自定义资源的名称。

annotations

指定要添加到驱动程序 Pod 的自定义注解的键值对映射。

driverType

指定以下之一

  • gpu 以使用 NVIDIA 数据中心 GPU 驱动程序。

  • vgpu 以使用 NVIDIA vGPU 访客驱动程序。

  • vgpu-host-manager 以使用 NVIDIA vGPU 管理器。

gpu

env

指定要传递到驱动程序容器的环境变量。

gdrcopy.enabled

指定是否部署 GDRCopy 驱动程序。当设置为 true 时,GDRCopy 驱动程序镜像作为边车容器运行。

false

gds.enabled

指定是否启用 GPUDirect Storage。

false

image

指定驱动程序容器镜像名称。

driver

imagePullPolicy

指定 kubelet 下载容器镜像的策略。请参阅 Kubernetes 文档以了解 镜像拉取策略

请参阅 Kubernetes 文档。

imagePullSecrets

如果注册表已保护,则指定要提供给注册表的凭据。

labels

指定要添加到驱动程序 Pod 的自定义标签的键值对映射。

nodeSelector

指定要匹配的一个或多个节点标签。驱动程序容器计划在与所有标签匹配的节点上运行。

无。当您不指定此字段时,驱动程序自定义资源将选择所有节点。

priorityClassName

指定驱动程序 Pod 的优先级类。

system-node-critical

rdma.enabled

指定是否启用 GPUDirect RDMA。

false

repository

指定包含驱动程序容器的容器注册表。

nvcr.io/nvidia

useOpenKernelModules

指定使用 NVIDIA Open GPU Kernel 模块。

false

tolerations

指定要应用于驱动程序 Pod 的一组容忍度。

usePrecompiled

当设置为 true 时,Operator 将部署具有预编译驱动程序的驱动程序容器镜像。

false

version

指定要安装的 GPU 驱动程序版本。对于数据中心驱动程序,指定类似 535.104.12 的值。如果您将 usePrecompiled 设置为 true,则指定驱动程序分支,例如 535

请参阅 GPU Operator 组件矩阵

安装 NVIDIA GPU Operator#

执行以下步骤以安装 GPU Operator 并使用 NVIDIA 驱动程序自定义资源。

  1. 可选:如果您想在集群中运行多个驱动程序类型或版本,请标记工作节点以标识要在每个节点上安装的驱动程序类型和版本

    示例

    $ kubectl label node <node-name> --overwrite driver.version=525.125.06
    
    • 要使用驱动程序类型的组合(例如 vGPU),请标记节点的驱动程序类型。

    • 要使用驱动程序版本的组合,请标记节点的不同版本。

    • 要使用传统驱动程序和预编译驱动程序容器的组合,请标记节点的不同类型。

  2. 安装 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

  3. 应用 NVIDIA 驱动程序自定义资源清单,为您的节点安装 NVIDIA GPU 驱动程序版本、类型等。请参阅示例清单。

NVIDIA 驱动程序清单示例#

所有节点上的一个驱动程序类型和版本#

  1. 可选:删除先前应用的节点标签。

  2. 创建一个文件,例如 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 的节点。

  3. 应用清单

    $ kubectl apply -n gpu-operator -f nvd-all.yaml
    
  4. 可选:监控进度

    $ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
    

多个驱动程序版本#

  1. 标记节点。

    • 在某些节点上,应用类似以下的标签

      $ kubectl label node <node-name> --overwrite driver.config="gold"
      
    • 在其他节点上,应用类似以下的标签

      $ kubectl label node <node-name> --overwrite driver.config="silver"
      
  2. 创建一个文件,例如 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"
    
  3. 应用清单

    $ kubectl apply -n gpu-operator -f nvd-driver-multiple.yaml
    
  4. 可选:监控进度

    $ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
    

所有节点上的一个预编译驱动程序容器#

  1. 可选:删除先前应用的节点标签。

  2. 创建一个文件,例如 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 的节点。

  3. 应用清单

    $ kubectl apply -n gpu-operator -f nvd-precompiled-all.yaml
    
  4. 可选:监控进度

    $ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
    

某些节点上的预编译驱动程序容器#

  1. 标记节点,如以下示例所示

    $ kubectl label node <node-name> --overwrite driver.precompiled="true"
    $ kubectl label node <node-name> --overwrite driver.version="535"
    
  2. 创建一个文件,例如 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"
    
  3. 应用清单

    $ kubectl apply -n gpu-operator -f nvd-precompiled-some.yaml
    
  4. 可选:监控进度

    $ kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
    

升级 NVIDIA GPU 驱动程序#

您可以通过编辑或修补 NVIDIA 驱动程序自定义资源来升级驱动程序版本。

当您更新自定义资源时,Operator 会对受影响的守护程序集中的 Pod 执行滚动更新。

  1. 更新驱动程序自定义资源中的 driver.version 字段

    $ kubectl patch nvidiadriver/demo-silver --type='json' \
        -p='[{"op": "replace", "path": "/spec/version", "value": "525.125.06"}]'
    
  2. 可选:监控进度

    $ 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 未按预期运行,请执行以下步骤。

  1. 显示 NVIDIA 驱动程序自定义资源

    $ kubectl get nvidiadrivers
    

    示例输出

    NAME           STATUS     AGE
    default        notReady   2023-10-13T14:03:24Z
    demo-precomp   notReady   2023-10-13T14:21:55Z
    

    状态在修改资源后不久报告未就绪是正常的。

  2. 如果状态未就绪,请描述资源

    $ 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
    
  3. 显示驱动程序守护程序集的节点选择器。选择器从 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
    
  4. 查看 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"}