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 支持,请执行以下步骤
通过修改集群策略启用 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
(可选)通过修改集群策略将默认容器运行时模式设置为 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
(可选)确认容器工具包和设备插件 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
验证运行时类是否包含 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 支持,请执行以下步骤
如果您的节点使用 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。通过修改集群策略禁用 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
如果您暂时禁用了 GPU Operator 验证器,请重新启用验证器
$ kubectl label nodes \ nvidia.com/gpu.deploy.operator-validator=true \ nvidia.com/gpu.present=true \ --overwrite
(可选)验证 nvidia-cdi 和 nvidia-legacy 运行时类是否不再可用
$ kubectl get runtimeclass
示例输出
NAME HANDLER AGE nvidia nvidia 11d
可选:为 Pod 指定运行时类#
如果您为默认容器运行时启用了 CDI 模式,则无需执行任何操作即可使用 CDI。但是,如果您遇到问题,可以使用以下步骤为工作负载指定旧版模式。
如果您没有为默认容器运行时启用 CDI 模式,则可以使用以下步骤验证 CDI 是否已启用,并将使用 CDI 模式的容器运行时作为常规实践。
创建一个文件,例如
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
以使用容器运行时的旧版模式。(可选)创建一个临时命名空间
$ kubectl create ns demo
示例输出
namespace/demo created
启动 Pod
$ kubectl apply -n demo -f cuda-vectoradd-cdi.yaml
示例输出
pod/cuda-vectoradd created
查看 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
删除临时命名空间
$ kubectl delete ns demo
示例输出
namespace "demo" deleted