nvidia-container-runtime

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

  • Owner: NVIDIA/nvidia-container-runtime
  • Platform: Docker, Linux
  • License:: Apache License 2.0
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

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)

Overview

Name With OwnerNVIDIA/nvidia-container-runtime
Primary Language
Program languageMakefile (Language Count: 0)
PlatformDocker, Linux
License:Apache License 2.0
Release Count41
Last Release Namev3.14.0 (Posted on )
First Release Namev1.0.0-alpha.1 (Posted on )
Created At2017-09-05 22:03:28
Pushed At2023-10-27 13:58:59
Last Commit At2022-03-29 06:04:40
Stargazers Count1.1k
Watchers Count39
Fork Count161
Commits Count336
Has Issues Enabled
Issues Count161
Issue Open Count0
Pull Requests Count3
Pull Requests Open Count0
Pull Requests Close Count16
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private

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
To the top