nvidia-container-runtime
runc 的一个修改版本,添加了一个自定义的预启动钩子(pre-start hook)到所有的容器。
如果在 OCI 规范中设置了环境变量 NVIDIA_VISIBLE_DEVICES,则该钩子将利用 libnvidia-container 项目中的 nvidia-container-cli 为容器配置 GPU 访问。
使用范例
# Setup a rootfs based on Ubuntu 16.04 cd $(mktemp -d) && mkdir rootfs curl -sS http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/ubuntu-base-16.04-core-amd64.tar.gz | tar --exclude 'dev/*' -C rootfs -xz # Create an OCI runtime spec nvidia-container-runtime spec sed -i 's;"sh";"nvidia-smi";' config.json sed -i 's;\("TERM=xterm"\);\1, "NVIDIA_VISIBLE_DEVICES=0";' config.json # Run the container sudo nvidia-container-runtime run nvidia_smi
安装
Ubuntu 发行版
按照此处的说明安装您的发行版的存储库。
安装 nvidia-container-runtime 软件包:
sudo apt-get install nvidia-container-runtime
CentOS 发行版
按照此处的说明安装您的发行版的存储库。
安装 nvidia-container-runtime 软件包:
udo yum install nvidia-container-runtime
Docker 引擎设置
如果您安装了 nvidia-docker2 软件包,则该部分已注册运行时,请不要遵循此部分。
要注册 nvidia 运行时,请使用以下最适合您的环境的方法。
您可能需要将新参数与现有配置合并。
Systemd drop-in 文件
sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/override.conf <<EOF [Service] ExecStart= ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime EOF sudo systemctl daemon-reload sudo systemctl restart docker
守护进程配置文件
sudo tee /etc/docker/daemon.json <<EOF { "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } } EOF sudo pkill -SIGHUP dockerd
您可以选择将以下内容添加到/etc/docker/daemon.json中,以重新配置默认运行时:
"default-runtime": "nvidia"
命令行
sudo dockerd --add-runtime=nvidia=/usr/bin/nvidia-container-runtime [...]
环境变量(OCI 规范)
每个环境变量都映射到 libnvidia-container 中 nvidia-container-cli 的命令行参数。
这些变量已在我们的官方 CUDA 映像中设置。
NVIDIA_VISIBLE_DEVICES
此变量控制将在容器内部访问哪些GPU。
可能的值
- 0,1,2,GPU-fef8089b…:GPU UUID或索引的逗号分隔列表。
- all:所有GPU均可访问,这是容器图像中的默认值。
- none:将无法访问GPU,但将启用驱动程序功能。
- 无效,空白或未设置:nvidia-container-runtime将具有与runc相同的行为。
注意:在具有MIG功能的设备上运行时,以下值也将可用:
- 0:0,0:1,1:0, MIG-GPU-fef8089b/0/1 …:MIG 设备 UUID 或索引的逗号分隔列表。
MIG 设备索引的格式为 <GPU Device Index>:<MIG Device Index>,如示例输出所示:
$ nvidia-smi -L GPU 0: Graphics Device (UUID: GPU-b8ea3855-276c-c9cb-b366-c6fa655957c5) MIG Device 0: (UUID: MIG-GPU-b8ea3855-276c-c9cb-b366-c6fa655957c5/1/0) MIG Device 1: (UUID: MIG-GPU-b8ea3855-276c-c9cb-b366-c6fa655957c5/1/1) MIG Device 2: (UUID: MIG-GPU-b8ea3855-276c-c9cb-b366-c6fa655957c5/11/0)
NVIDIA_MIG_CONFIG_DEVICES
此变量控制可以在容器内管理哪些可见GPU的MIG配置。这包括启用和禁用MIG模式,创建和销毁GPU实例和计算实例等。
可能的值
- all:允许可见设备列表中所有支持MIG的GPU对其MIG配置进行管理。
注意:
- 此功能仅在支持 MIG 的设备(例如 A100)上可用。
- 要使用此功能,必须以 CAP_SYS_ADMIN 特权启动容器。
- 当不以 root 用户身份运行时,容器用户必须对主机上的 /proc/driver/nvidia/capabilities/mig/config 文件具有读取权限。
NVIDIA_MIG_MONITOR_DEVICES
此变量控制哪些可见 GPU 可以具有有关从容器内监视的所有 MIG 设备的聚合信息。这包括检查聚合内存使用情况,列出聚合运行进程等。
可能的值
- all:允许可见设备列表中所有支持MIG的GPU对其MIG设备进行监控。
注意:
- 此功能仅在支持MIG的设备(例如A100)上可用。
- 要使用此功能,必须以CAP_SYS_ADMIN特权启动容器。
- 当不以root用户身份运行时,容器用户必须对主机上的 /proc/driver/nvidia/capabilities/mig/monitor 文件具有读取权限。
NVIDIA_DRIVER_CAPABILITIES
此选项控制将在容器内部安装哪些驱动程序库/二进制文件。
可能的值
- compute,video, graphics,utility……:以逗号分隔的驱动程序列表,列出了容器所需的功能。
- all:启用所有可用的驱动程序功能。
- empty 或 unset:使用默认驱动程序功能:utility。
支持的驱动程序功能
- compute:CUDA 和 OpenCL 应用程序必需。
- compat32:运行32位应用程序所需。
- graphics:运行 OpenGL 和 Vulkan 应用程序所需。
- utility:使用 nvidia-smi 和 NVML 所需。
- video:使用视频编解码器 SDK 所必需。
- display:利用 X11 显示屏是必需的。
NVIDIA_REQUIRE_*
一个逻辑表达式,用于定义对容器支持的配置的约束。
支持的约束
- cuda:CUDA驱动程序版本的约束。
- driver:对驱动程序版本的限制。
- arch:限制所选GPU的计算架构。
- brand:所选GPU(例如GeForce,Tesla,GRID)的品牌约束。
表达式
可以在单个环境变量中表达多个约束:对空格分隔的约束进行 “ORed” 运算,对逗号分隔的约束进行 “ANDed” 运算。
形式为 NVIDIA_REQUIRE_* 的多个环境变量被 “ANDed” 在一起。
NVIDIA_DISABLE_REQUIRE
单个开关可禁用 NVIDIA_REQUIRE_* 形式的所有约束。
NVIDIA_REQUIRE_CUDA
容器使用的 CUDA 工具包的版本。它是通用的 NVIDIA_REQUIRE_* 案例的一个实例,由官方 CUDA 映像设置。如果 NVIDIA 驱动程序的版本不足以运行此版本的 CUDA,则不会启动该容器。
可能的值
- cuda>=7.5,cuda>=8.0,cuda>=9.0…:任何有效的CUDA版本,形式为 major.minor。
CUDA_VERSION
与 CUDA 映像相似,类似于 NVIDIA_REQUIRE_CUDA。
此外,如果未设置 NVIDIA_REQUIRE_CUDA,则 NVIDIA_VISIBLE_DEVICES 和 NVIDIA_DRIVER_CAPABILITIES 将默认为 all。
问题与贡献
(The first version translated by vz on 2020.07.19)