支持容器设备接口#
关于容器设备接口#
从 v1.12.0
版本开始,NVIDIA Container Toolkit 包含对生成容器设备接口 (CDI) 规范的支持。
CDI 是容器运行时的开放规范,它抽象了对设备(如 NVIDIA GPU)的访问意味着什么,并标准化了跨容器运行时的访问。流行的容器运行时可以读取和处理规范,以确保设备在容器中可用。CDI 简化了对 NVIDIA GPU 等设备的支持,因为该规范适用于所有支持 CDI 的容器运行时。
CDI 还提高了 NVIDIA 容器堆栈与某些功能(如无根容器)的兼容性。
生成 CDI 规范#
先决条件#
您已安装 NVIDIA Container Toolkit,或者您已安装
nvidia-container-toolkit-base
软件包。基本软件包包括容器运行时和nvidia-ctk
命令行界面,但避免安装容器运行时钩子和传递依赖项。在专门使用 CDI 的机器上不需要钩子和依赖项。您已安装 NVIDIA GPU 驱动程序。
步骤#
CDI 规范的两个常用位置是 /etc/cdi/
和 /var/run/cdi/
。/var/run/cdi/
目录的内容在启动时会被清除。
但是,创建和使用的路径可能取决于您使用的容器引擎。
生成 CDI 规范文件
$ sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
示例命令使用
sudo
以确保创建/etc/cdi/nvidia.yaml
文件。您可以省略--output
参数以将生成的规范打印到STDOUT
。示例输出
INFO[0000] Auto-detected mode as "nvml" INFO[0000] Selecting /dev/nvidia0 as /dev/nvidia0 INFO[0000] Selecting /dev/dri/card1 as /dev/dri/card1 INFO[0000] Selecting /dev/dri/renderD128 as /dev/dri/renderD128 INFO[0000] Using driver version xxx.xxx.xx ...
(可选)检查生成的设备的名称
$ nvidia-ctk cdi list
以下示例输出适用于具有单个 GPU 且不支持 MIG 的机器。
INFO[0000] Found 9 CDI devices nvidia.com/gpu=all nvidia.com/gpu=0
重要提示
在进行以下任何更改后,您必须生成新的 CDI 规范
您更改了设备或 CUDA 驱动程序配置。
您使用诸如
/var/run/cdi
之类的位置,该位置在启动时会被清除。
当创建或删除 MIG 设备,或者升级驱动程序时,可能会发生配置更改。
使用 CDI 运行工作负载#
使用 CDI 注入 NVIDIA 设备可能会与使用 NVIDIA Container Runtime 钩子冲突。这意味着如果存在 /usr/share/containers/oci/hooks.d/oci-nvidia-hook.json
文件,请删除它或确保您在未设置 NVIDIA_VISIBLE_DEVICES
环境变量的情况下运行容器。
CDI 规范的使用取决于您使用的启用 CDI 的容器引擎或 CLI。例如,对于 podman
,从 v4.1.0
开始的版本包括在 --device
参数中指定 CDI 设备的支持。假设您在上节中生成了 CDI 规范,则运行可以访问所有 NVIDIA GPU 的容器将需要以下命令
$ podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable ubuntu nvidia-smi -L
前面的示例命令应显示与在主机上运行 nvidia-smi -L
相同的输出。
CDI 规范还包含对各个 GPU 或 MIG 设备的引用。您可以在启动容器时通过指定它们的名称来请求这些设备,例如以下示例
$ podman run --rm \
--device nvidia.com/gpu=0 \
--device nvidia.com/gpu=1:0 \
--security-opt=label=disable \
ubuntu nvidia-smi -L
前面的示例命令请求索引为 0 的完整 GPU 和 GPU 1 上的第一个 MIG 设备。输出应仅显示所请求设备的 UUID。
将 CDI 与未启用 CDI 的运行时一起使用#
为了支持不原生支持 CDI 的运行时,您可以将 NVIDIA Container Runtime 配置为 cdi
模式。在此模式下,NVIDIA Container Runtime 不会将 NVIDIA Container Runtime 钩子注入到传入的 OCI 运行时规范中。相反,运行时执行请求的 CDI 设备的注入。
如果您按 CDI 设备名称请求设备,则 NVIDIA Container Runtime 会自动使用 cdi
模式。
以 Docker 作为未启用 CDI 的运行时的示例,以下命令使用 CDI 将请求的设备注入到容器中
$ docker run --rm -ti --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=nvidia.com/gpu=all \
ubuntu nvidia-smi -L
NVIDIA_VISIBLE_DEVICES
环境变量指示要注入到容器中的设备,并显式设置为 nvidia.com/gpu=all
。
显式设置 CDI 模式#
您可以通过在 NVIDIA Container Runtime 配置中显式设置 nvidia-container-runtime.mode
选项为 cdi
来强制 CDI 模式
$ sudo nvidia-ctk config --in-place --set nvidia-container-runtime.mode=cdi
在这种情况下,NVIDIA_VISIBLE_DEVICES
环境变量仍然用于选择要注入到容器中的设备,但是只有当您指定设备索引(例如 all
、0
或 1
等)时,才会使用 nvidia-container-runtime.modes.cdi.default-kind
(默认值为 nvidia.com/gpu
)来构造完全限定的 CDI 设备名称。
这意味着,如果显式启用 CDI 模式,则以下示例命令与指定 NVIDIA_VISIBLE_DEVICES=nvidia.com/gpu=all
具有相同的效果。
$ docker run --rm -ti --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=all \
ubuntu nvidia-smi -L