nvidia-container-runtime

NVIDIA 容器运行时。(NVIDIA container runtime)

  • 所有者: NVIDIA/nvidia-container-runtime
  • 平台: Docker, Linux
  • 许可证: Apache License 2.0
  • 分类:
  • 主题:
  • 喜欢:
    0
      比较:

Github星跟踪图

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)

主要指标

概览
名称与所有者NVIDIA/nvidia-container-runtime
主编程语言
编程语言Makefile (语言数: 0)
平台Docker, Linux
许可证Apache License 2.0
所有者活动
创建于2017-09-05 22:03:28
推送于2023-10-27 13:58:59
最后一次提交2022-03-29 06:04:40
发布数41
最新版本名称v3.14.0 (发布于 )
第一版名称v1.0.0-alpha.1 (发布于 )
用户参与
星数1.1k
关注者数38
派生数159
提交数336
已启用问题?
问题数161
打开的问题数0
拉请求数3
打开的拉请求数0
关闭的拉请求数16
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?

nvidia-container-runtime

GitHub license
Package repository

A modified version of runc adding a custom pre-start hook to all containers.
If environment variable NVIDIA_VISIBLE_DEVICES is set in the OCI spec, the hook will configure GPU access for the container by leveraging nvidia-container-cli from project libnvidia-container.

Usage example

# 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