GPU Operator 中的容器设备接口支持#

关于容器设备接口#

容器设备接口 (CDI) 是一种针对容器运行时(如 cri-o、containerd 和 podman)的规范,它标准化了容器运行时对 NVIDIA GPU 等复杂设备的访问。CDI 支持由 NVIDIA Container Toolkit 提供,Operator 将此支持扩展到 Kubernetes 集群。

CDI 的使用对集群管理员和应用程序开发人员是透明的。CDI 的主要优点是减少了运行时特定插件的开发和支持工作。

启用 CDI 后,将可以使用 nvidia-cdi 和 nvidia-legacy 这两个运行时类。这两个运行时类是对默认运行时类 nvidia 的补充。

如果您未将 CDI 设置为默认运行时,则运行时将解析为 NVIDIA Container Toolkit 在 x86_64 机器或任何安装了 NVML 库的架构上提供的旧版运行时模式。

(可选)您可以为工作负载指定运行时类。有关示例,请参阅可选:为 Pod 指定运行时类

多实例 GPU 支持#

多实例 GPU (MIG) 支持配置 CDI。“single”和“mixed”策略均受支持。

限制和约束#

Red Hat OpenShift Container Platform 不支持启用 CDI。请参阅支持的操作系统和 Kubernetes 平台

在安装期间启用 CDI#

请按照安装 NVIDIA GPU Operator页面上使用 Helm 安装 Operator 的说明进行操作。

使用 Helm 安装 Operator 时,请指定 --set cdi.enabled=true 参数。可选地,还可以指定 --set cdi.default=true 参数,以便默认对所有 Pod 使用 CDI 运行时类。

在安装后启用 CDI#

先决条件

  • 您已安装 22.3.0 或更高版本。

  • (可选)运行以下命令确认唯一的运行时类是 nvidia

    $ kubectl get runtimeclasses
    

    示例输出

    NAME     HANDLER   AGE
    nvidia   nvidia    47h
    

步骤

要启用 CDI 支持,请执行以下步骤

  1. 通过修改集群策略启用 CDI

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
        -p='[{"op": "replace", "path": "/spec/cdi/enabled", "value":true}]'
    

    示例输出

    clusterpolicy.nvidia.com/cluster-policy patched
    
  2. (可选)通过修改集群策略将默认容器运行时模式设置为 CDI

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
        -p='[{"op": "replace", "path": "/spec/cdi/default", "value":true}]'
    

    示例输出

    clusterpolicy.nvidia.com/cluster-policy patched
    
  3. (可选)确认容器工具包和设备插件 Pod 重新启动

    $ kubectl get pods -n gpu-operator
    

    示例输出

    NAME                                                          READY   STATUS      RESTARTS   AGE
    gpu-feature-discovery-qnw2q                                   1/1     Running     0          47h
    gpu-operator-6d59774ff-hznmr                                  1/1     Running     0          2d
    gpu-operator-node-feature-discovery-master-6d6649d597-7l8bj   1/1     Running     0          2d
    gpu-operator-node-feature-discovery-worker-v86vj              1/1     Running     0          2d
    nvidia-container-toolkit-daemonset-2768s                      1/1     Running     0          2m11s
    nvidia-cuda-validator-ls4vc                                   0/1     Completed   0          47h
    nvidia-dcgm-exporter-fxp9h                                    1/1     Running     0          47h
    nvidia-device-plugin-daemonset-dvp4v                          1/1     Running     0          2m26s
    nvidia-device-plugin-validator-kvxbs                          0/1     Completed   0          47h
    nvidia-driver-daemonset-m86r7                                 1/1     Running     0          2d
    nvidia-operator-validator-xg98r                               1/1     Running     0          47h
    
  4. 验证运行时类是否包含 nvidia-cdi 和 nvidia-legacy

    $ kubectl get runtimeclasses
    

    示例输出

    NAME            HANDLER         AGE
    nvidia          nvidia          2d
    nvidia-cdi      nvidia-cdi      5m7s
    nvidia-legacy   nvidia-legacy   5m7s
    

禁用 CDI#

要禁用 CDI 支持,请执行以下步骤

  1. 如果您的节点使用 CRI-O 容器运行时,请暂时禁用 GPU Operator 验证器

    $ kubectl label nodes \
        nvidia.com/gpu.deploy.operator-validator=false \
        -l nvidia.com/gpu.present=true \
        --overwrite
    

    提示

    您可以运行 kubectl get nodes -o wide 并查看 CONTAINER-RUNTIME 列,以确定您的节点是否使用 CRI-O。

  2. 通过修改集群策略禁用 CDI

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
        -p='[{"op": "replace", "path": "/spec/cdi/enabled", "value":false}]'
    

    示例输出

    clusterpolicy.nvidia.com/cluster-policy patched
    
  3. 如果您暂时禁用了 GPU Operator 验证器,请重新启用验证器

    $ kubectl label nodes \
        nvidia.com/gpu.deploy.operator-validator=true \
        nvidia.com/gpu.present=true \
        --overwrite
    
  4. (可选)验证 nvidia-cdi 和 nvidia-legacy 运行时类是否不再可用

    $ kubectl get runtimeclass
    

    示例输出

    NAME     HANDLER   AGE
    nvidia   nvidia    11d
    

可选:为 Pod 指定运行时类#

如果您为默认容器运行时启用了 CDI 模式,则无需执行任何操作即可使用 CDI。但是,如果您遇到问题,可以使用以下步骤为工作负载指定旧版模式。

如果您没有为默认容器运行时启用 CDI 模式,则可以使用以下步骤验证 CDI 是否已启用,并将使用 CDI 模式的容器运行时作为常规实践。

  1. 创建一个文件,例如 cuda-vectoradd-cdi.yaml,内容如下例所示

    apiVersion: v1
    kind: Pod
    metadata:
      name: cuda-vectoradd
    spec:
      restartPolicy: OnFailure
      runtimeClassName: nvidia-cdi
      containers:
        - name: cuda-vectoradd
          image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"
          resources:
            limits:
              nvidia.com/gpu: 1
    

    作为替代方案,指定 nvidia-legacy 以使用容器运行时的旧版模式。

  2. (可选)创建一个临时命名空间

    $ kubectl create ns demo
    

    示例输出

    namespace/demo created
    
  3. 启动 Pod

    $ kubectl apply -n demo -f cuda-vectoradd-cdi.yaml
    

    示例输出

    pod/cuda-vectoradd created
    
  4. 查看 Pod 的日志

    $ kubectl logs -n demo 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
    
  5. 删除临时命名空间

$ kubectl delete ns demo

示例输出

namespace "demo" deleted