使用NVIDIA Docker在容器运行时启用GPU

nvidia 使用容器来开发、测试、基准测试和部署深度学习( dl )框架和 hpc 应用程序。大约两年前,我们用 nvidia -docker 大规模地写了 构建和部署 gpu 容器 。从那时起, nvidia -docker 被下载了近 200 万次。许多客户使用 nvidia -docker 将 nvidia 集装箱化并运行 gpu 加速的工作负载。
nvidia 通过 nvidia gpu 云( ngc )提供 gpu 加速容器,用于 dgx 系统、公共云基础设施,甚至是带有 gpus 的本地工作站。 nvidia -docker 是这些计划的关键基础技术。
除了 docker 之外,容器技术被用于 dl 和 hpc 工作负载的不断发展的用例集,这使得我们从根本上重新思考我们现有的 nvidia -docker 架构。我们的主要目标不仅追求不同容器运行时的可扩展性,而且还追求容器编排系统的可扩展性。
这里介绍的 nvidia 容器运行时是我们的下一代 gpu 感知容器运行时。它与 docker 使用的 open containers initiative ( oci )规范和其他流行的容器技术兼容。
您将了解到 nvidia 容器运行时组件,以及如何扩展它以支持多个容器技术。让我们检查一下新运行时的体系结构和优点,展示一些新特性,并介绍一些使用 docker 和 lxc 部署 gpu 加速应用程序的示例。
nvidia 集装箱运行时间
nvidia 在 2016 年设计了 nvidia -docker ,以实现 docker 映像中的可移植性,利用 nvidia gpus 。它允许与驱动程序无关的 cuda 映像,并提供一个 docker 命令行包装器,在启动时将驱动程序的用户模式组件和 gpu 设备文件装入容器中。
在 nvidia -docker 的生命周期中,我们意识到架构缺乏灵活性,原因如下:
与 docker 的紧密集成不允许将来支持其他容器技术,如 lxc 、 cri-o 和其他运行时
我们希望利用 docker 生态系统中的其他工具–例如 撰写 (用于管理由多个容器组成的应用程序)
在 kubernetes 和 swarm 等编排器中支持 gpus 作为一级资源
改进对 gpus 的容器运行时支持,特别是自动检测用户级 nvidia 驱动程序库, nvidia 内核模块、设备排序、兼容性检查和 gpu 功能,如图形、视频加速
因此,重新设计的 nvidia -docker 将对 gpus 的核心运行时支持转移到一个名为 libnvidia-container 的库中。该库依赖于 linux 内核原语,并且相对于更高的容器运行时层是不可知的。这使得 gpu 支持很容易扩展到不同的容器运行时,如 docker 、 lxc 和 cri-o 。该库包括一个命令行实用程序,还提供了一个 api ,以便将来集成到其他运行时中。我们构建的用于集成到各种运行时的库、工具和层统称为 nvidia 容器运行时。
在接下来的几节中,您将了解到 docker 和 lxc 的集成。
docker 支持
在深入研究 nvidia 容器运行时与 docker 的集成之前,让我们简单看看 docker 平台是如何演变的。
自 2015 年以来, docker 一直在捐赠其容器平台的关键组件,首先是开放容器倡议( oci )规范和一个名为 runc 的轻量级容器运行时规范的实现。 2016 年末, docker 还捐赠了一个管理容器生命周期和包装 oci / runc 的守护程序 containerd 。 containerd 守护进程处理图像的传输、容器的执行(使用 runc )、存储和网络管理。它被设计成嵌入到更大的系统中,比如 docker 。关于这个项目的更多信息可以在官方网站 网站 上找到。
图 1 显示了 libnvidia-container 如何集成到 docker 中,特别是在 gpu 层。为了在 docker 中启用 nvidia-container-runtime-hook 容器,我们使用了一个名为 nvidia-container-runtime-hook 到 runc 的定制 oci 预启动钩子(有关钩子的更多信息可以在 oci 运行规范 中找到)。在 runc 中添加预启动钩子需要我们用 docker 注册一个新的与 oci 兼容的运行时(使用– runtime 选项 )。在创建容器时,预启动钩子检查容器是否启用了 gpu (使用环境变量),并使用容器运行库向容器公开 nvidia gpus 。
图 1 nvidia 容器运行时与 docker 的集成
runc 层的集成还允许灵活地支持其他 oci 运行时,如 cri-o 。 containerd 的 1 。 1 版增加了对 kubernetes 中容器运行时接口( cri )的支持;上周 kubernetes 宣布 通过 cri 插件实现了 containerd 集成的普遍可用性。 nvidia 运行时的新架构可以很容易地支持 kubernetes 运行时的任何一种选择。这种灵活性非常重要,因为我们与社区密切合作,使 kubernetes 的 gpu 支持 成为一流的。
环境变量
nvidia 容器运行时使用容器映像中的环境变量指定 gpu 加速容器。
nvidia _可视设备:可在容器内访问 gpus 的控件。默认情况下,容器可以访问所有 gpus 。
nvidia _驱动程序功能:控制哪些驱动程序特性(例如计算、图形)暴露到容器中。
nvidia u 需要 u *:逻辑表达式,用于定义容器支持的配置上的约束(例如最小 cuda 、驱动程序或计算能力)。
如果没有检测到环境变量(在 docker 命令行或图像中),则使用默认的 runc 。您可以在 nvidia 容器运行时 文档 中找到有关这些环境变量的更多信息。这些环境变量已经在 nvidia 的 官方的 cuda 容器中设置。
安装
您的系统必须满足以下先决条件,才能在 docker 中开始使用 nvidia 容器运行时。
支持 您的发行版的 docker 版本。跟随 docker 的官方 说明书 。
最新的 nvidia 驱动程序。使用 程序包管理器 安装 cuda-drivers 包,或者使用驱动程序下载 网站 中的安装程序。请注意,使用 cuda-drivers 包可能无法在 ubuntu 18.04 lts 系统上运行。
要开始使用带有 docker 的 nvidia 容器运行时,可以使用 nvidia -docker2 安装程序包,也可以手动使用 设置 运行时和 docker 引擎。 nvidia-docker2 软件包包括一个自定义的 daemon.json 文件,用于将 nvidia 运行时注册为 docker 的默认运行时,以及一个向后兼容 nvidia -docker 1. 0 的脚本。
如果安装了 nvidia -docker 1.0 ,则需要在安装 nvidia 运行时之前删除它和任何现有的 gpu 容器。请注意,以下安装步骤适用于 debian 发行版及其衍生产品。
$ docker volume ls -q -f driver=nvidia-docker | xargs -r -i{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f $ sudo apt-get purge -y nvidia-docker 现在,让我们添加包存储库并刷新包索引。
$ curl -s -l https://nvidia.github.io/nvidia-docker/gpgkey | \sudo apt-key add - $ distribution=$(. /etc/os-release;echo $id$version_id) $ curl -s -l https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \sudo tee /etc/apt/sources.list.d/nvidia-docker.list $ sudo apt-get update 然后使用 nvidia-docker2 包安装各个组件并重新加载 docker 守护程序配置。
$ sudo apt-get install -y nvidia-docker2 $ sudo pkill -sighup dockerd 运行以下命令行实用程序( cli )以验证 nvidia 驱动程序和运行时是否已正确安装在您的系统上(作为安装程序包的一部分提供)。运行时 cli 提供有关系统中检测到的驱动程序和设备的信息。在本例中,运行库已正确检测并枚举了系统中的 4 个 nvidia tesla v100 。
$ sudo nvidia-container-cli --load-kmods infonvrm version: 396.26cuda version: 9.2 device index: 0device minor: 2model: tesla v100-sxm2-16gbgpu uuid: gpu-e354d47d-0b3e-4128-74bf-f1583d34af0ebus location: 00000000:00:1b.0architecture: 7.0 device index: 1device minor: 0model: tesla v100-sxm2-16gbgpu uuid: gpu-716346f4-da29-392a-c4ee-b9840ec2f2e9bus location: 00000000:00:1c.0architecture: 7.0 device index: 2device minor: 3model: tesla v100-sxm2-16gbgpu uuid: gpu-9676587f-b418-ee6b-15ac-38470e1278fbbus location: 00000000:00:1d.0architecture: 7.0 device index: 3device minor: 2model: tesla v100-sxm2-16gbgpu uuid: gpu-2370332b-9181-d6f5-1f24-59d66fc7a87ebus location: 00000000:00:1e.0architecture: 7.0 nvidia-container-cli 检测到的 cuda 版本验证主机上安装的 nvidia 驱动程序是否足以运行基于特定 cuda 版本的容器。如果存在不兼容,运行时将不启动容器。有关 cuda 兼容性和最低驱动程序要求的更多信息,请参见 在这里 。
现在,让我们尝试用 docker 运行一个 gpu 容器。这个例子提取 docker hub 存储库 上可用的 nvidia cuda 容器,并在容器内运行 nvidia-smi 命令。
$ sudo docker run --rm --runtime=nvidia -ti nvidia/cudaroot@d6c41b66c3b4:/# nvidia-smisun may 20 22:06:13 2018+-----------------------------------------------------------------------------+| nvidia-smi 396.26 driver version: 396.26 ||-------------------------------+----------------------+----------------------+| gpu name persistence-m| bus-id disp.a | volatile uncorr. ecc || fan temp perf pwr:usage/cap| memory-usage | gpu-util compute m. ||===============================+======================+======================|| 0 tesla v100-sxm2... on | 00000000:00:1b.0 off | off || n/a 41c p0 34w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+| 1 tesla v100-sxm2... on | 00000000:00:1c.0 off | off || n/a 39c p0 35w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+| 2 tesla v100-sxm2... on | 00000000:00:1d.0 off | off || n/a 39c p0 38w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+| 3 tesla v100-sxm2... on | 00000000:00:1e.0 off | 0 || n/a 42c p0 38w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+| processes: gpu memory || gpu pid type process name usage ||=============================================================================|| no running processes found |+-----------------------------------------------------------------------------+ 运行 gpu 集装箱
现在让我们看一些运行更复杂的 gpu 应用程序的例子。 nvidia 为 深度学习 和 ngc 注册 上的 hpc 提供了多种预制容器。
深度学习框架容器
这个例子使用 ngc 提供的 pytorch 深度学习框架容器来训练一个 deep 神经网络 。您需要打开一个免费的 ngc 帐户才能访问最新的深度学习框架和 hpc 容器。 ngc 文件 概述了开始所需的步骤。
本例使用了 nvidia_visible_devices 变量,仅向容器公开两个 gpus 。
$ sudo docker run -it --runtime=nvidia --shm-size=1g -e nvidia_visible_devices=0,1 --rm nvcr.io/nvidia/pytorch:18.05-py3 copyright (c) 2006 idiap research institute (samy bengio)copyright (c) 2001-2004 idiap research institute (ronan collobert, samy bengio, johnny mariethoz) all rights reserved. various files include modifications (c) nvidia corporation. all rights reserved.nvidia modifications are covered by the license terms that apply to the underlying project or file. 在容器中运行 nvidia-smi 命令,验证只有两个 gpus 可见。
root@45cebefa1480:/workspace# nvidia-smimon may 28 07:15:39 2018 +-----------------------------------------------------------------------------+| nvidia-smi 396.26 driver version: 396.26 ||-------------------------------+----------------------+----------------------+| gpu name persistence-m| bus-id disp.a | volatile uncorr. ecc || fan temp perf pwr:usage/cap| memory-usage | gpu-util compute m. ||===============================+======================+======================|| 0 tesla v100-sxm2... on | 00000000:00:1b.0 off | 0 || n/a 39c p0 36w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+| 1 tesla v100-sxm2... on | 00000000:00:1c.0 off | 0 || n/a 38c p0 35w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+| processes: gpu memory || gpu pid type process name usage ||=============================================================================|| no running processes found |+-----------------------------------------------------------------------------+ root@45cebefa1480:/workspace# 尝试运行容器附带的 mnist 培训示例:
root@45cebefa1480:/workspace/examples/mnist# python main.pydownloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gzdownloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gzdownloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gzdownloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gzprocessing...done!main.py:68: userwarning: implicit dimension choice for log_softmax has been deprecated. change the call to include dim=x as an argument.return f.log_softmax(x)main.py:90: userwarning: invalid index of a 0-dim tensor. this will be an error in pytorch 0.5. use tensor.item() to convert a 0-dim tensor to a python number100. * batch_idx / len(train_loader), loss.data[0]))train epoch: 1 [0/60000 (0%)] loss: 2.373651train epoch: 1 [640/60000 (1%)] loss: 2.310517train epoch: 1 [1280/60000 (2%)] loss: 2.281828train epoch: 1 [1920/60000 (3%)] loss: 2.315808train epoch: 1 [2560/60000 (4%)] loss: 2.235439train epoch: 1 [3200/60000 (5%)] loss: 2.234249train epoch: 1 [3840/60000 (6%)] loss: 2.226109train epoch: 1 [4480/60000 (7%)] loss: 2.228646train epoch: 1 [5120/60000 (9%)] loss: 2.132811 opengl 图形容器
如前几节所述, nvidia 容器运行时现在为运行 opengl 和 egl 应用程序提供了支持。下一个例子使用 opengl 构建并运行 多体问题 模拟。使用 nvidia 吉特实验室 上提供的示例 dockerfile 来构建容器。
复制 dockerfile 并构建 多体问题 示例
$ docker build -t nbody . 允许 root 用户访问正在运行的 x 服务器
$ xhost +si:localuser:root 运行[vzx129 连续样本
$ sudo docker run --runtime=nvidia -ti --rm -e display -v /tmp/.x11-unix:/tmp/.x11-unix nbody
图 2 用 docker 运行 n-bodycuda / opengl 示例
编写 docker
最后一个例子使用 docker compose 展示了使用 nvidia 容器运行时启动多个 gpu 容器是多么容易。这个例子将启动 3 个容器—— opengl 的 多体问题 示例、一个 egl 示例( 钉 来自 mesa )和一个运行 nvidia -smi 公司 命令的简单容器。
安装 docker compose
$ sudo curl -l https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose$ sudo chmod +x /usr/local/bin/docker-compose 从 nvidia gitlab 克隆可用的样本
$ git clone https://gitlab.com/nvidia/samples.git 写一个 docker-compose.yml 来指定三个容器和环境。使用您选择的文本编辑器复制以下内容:
version: '2.3' services: nbody: build: samples/cudagl/ubuntu16.04/nbody runtime: nvidia environment: - display volumes: - /tmp/.x11-unix:/tmp/.x11-unix peglgears: build: samples/opengl/ubuntu16.04/peglgears runtime: nvidia nvsmi: image: ubuntu:18.04 runtime: nvidia environment: - nvidia_visible_devices=all command: nvidia-smi 允许 root 用户访问正在运行的 x 服务器(对于 多体问题 示例)
$ xhost +si:localuser:root 最后,启动容器
$ sudo docker-compose up 您的控制台输出可能如下所示
building nbodystep 1/6 : from nvidia/cudagl:9.0-base-ubuntu16.04---> b6055709073estep 2/6 : env nvidia_driver_capabilities ${nvidia_driver_capabilities},display---> using cache---> ebd1c003a592step 3/6 : run apt-get update && apt-get install -y --no-install-recommends cuda-samples-$cuda_pkg_version && rm -rf /var/lib/apt/lists/*---> using cache---> 1987dc2c1bbcstep 4/6 : workdir /usr/local/cuda/samples/5_simulations/nbody---> using cache---> de7af4fbb03estep 5/6 : run make---> using cache---> a6bcfb9a4958step 6/6 : cmd ./nbody---> using cache---> 9c11a1e93ef2successfully built 9c11a1e93ef2successfully tagged ubuntu_nbody:latestwarning: image for service nbody was built because it did not already exist. to rebuild this image you must use `docker-compose build` or `docker-compose up --build`.starting ubuntu_nbody_1 ... donestarting ubuntu_nvsmi_1 ... donestarting ubuntu_peglgears_1 ... doneattaching to ubuntu_nvsmi_1, ubuntu_peglgears_1, ubuntu_nbody_1ubuntu_nvsmi_1 exited with code 0peglgears_1 | peglgears: egl version = 1.4peglgears_1 | peglgears: egl_vendor = nvidiapeglgears_1 | 246404 frames in 5.0 seconds = 49280.703 fpsubuntu_peglgears_1 exited with code 0 支持带 lxc 的 gpu 容器
linux 容器(或 lxc 公司 )是一个操作系统级的虚拟化工具,用于创建和管理系统或应用程序容器。 docker 的早期版本使用 lxc 作为底层容器运行时技术。 lxc 提供了一套高级的工具来管理容器(例如模板、存储选项、直通设备、 autostart 等),并为用户提供了大量的控制。在参考文献中,我们在本文末尾的参考文献中提供了来自 canonical 和 cisco 的工程师关于 lxc 的 gtc 2018 演讲的链接。
lxc 支持非特权容器(使用 linux 内核中的用户名称空间特性)。在 hpc 环境中部署容器的上下文中,这是一个巨大的优势,在这种环境中,用户可能没有运行容器的管理权限。 lxc 还支持 docker 图像的导入,下面我们将详细介绍一个示例。
nvidia 继续与 lxc 社区密切合作,开发上游补丁,以添加 gpu 支持。 4 月初发布的 lxc3 。 0 。 0 包括使用 nvidia 运行时对 gpus 的支持。有关更多信息和演示,请参阅 canonical 的新闻 邮递 。
如图所示, vx134 是如何将容器集成到 vx12 中的。
图 3 nvidia 容器运行时与 lxc 的集成
让我们看看用 lxc 运行一个简单的 cuda 容器。这个例子展示了如何使用默认的 lxc oci 模板 从 docker hub 上可用的 oci 映像(使用诸如 skopo 和 擦除 )创建应用程序容器。
首先,让我们为工具设置存储库:
$ sudo add-apt-repository ppa:ubuntu-lxc/lxc-stable$ sudo apt-add-repository ppa:projectatomic/ppa 安装 lxc 和相关工具,如 skopeo :
$ apt-get install libpam-cgfs lxc-utils lxcfs lxc-templates skopeo skopeo-containers jq libnvidia-container-tools 肥皂套装:
$ sudo curl -fssl -o /usr/local/bin/umoci https://github.com/opensuse/umoci/releases/download/v0.4.0/umoci.amd64$ sudo chmod ugo+rx /usr/local/bin/umoci 为每个用户设置用户、组 id 和虚拟以太网接口。请参阅 lxc 文档 中有关创建非特权容器的内容。为了方便起见,这里提供了示例脚本。
$ sudo curl -fssl -o /usr/local/bin/generate-lxc-perms https://gist.githubusercontent.com/3xx0/ef77403389ffa1ca85d4625878706c7d/raw/4f0d2c02d82236f74cf668c42ee72ab06158d1d2/generate-lxc-perms.sh$ sudo chmod ugo+rx /usr/local/bin/generate-lxc-perms $ sudo curl -fssl -o /usr/local/bin/generate-lxc-config https://gist.githubusercontent.com/3xx0/b3e2bd829d43104cd120f4258c4eeca9/raw/890dc720e1c3ad418f96ba8529eae028f01cc994/generate-lxc-config.sh$ sudo chmod ugo+rx /usr/local/bin/generate-lxc-config 现在,为每个容器设置 gpu 支持:
$ sudo tee /usr/share/lxc/config/common.conf.d/nvidia.conf <<-----------------]writing manifest to image destinationstoring signaturesunpacking the rootfs • rootless{dev/agpgart} creating empty file in place of device 10:175 • rootless{dev/audio} creating empty file in place of device 14:4 • rootless{dev/audio1} creating empty file in place of device 14:20 作为普通用户,我们可以在容器内运行 nvidia-smi :
$ lxc-execute cuda root@cuda:/# nvidia-smimon may 28 21:48:57 2018+-----------------------------------------------------------------------------+| nvidia-smi 396.26 driver version: 396.26 ||-------------------------------+----------------------+----------------------+| gpu name persistence-m| bus-id disp.a | volatile uncorr. ecc || fan temp perf pwr:usage/cap| memory-usage | gpu-util compute m. ||===============================+======================+======================|| 0 tesla v100-sxm2... on | 00000000:00:1b.0 off | 0 || n/a 40c p0 36w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+| 1 tesla v100-sxm2... on | 00000000:00:1c.0 off | 0 || n/a 39c p0 35w / 300w | 0mib / 16160mib | 0% default |+-------------------------------+----------------------+----------------------+| 2 tesla v100-sxm2... on | 00000000:00:1d.0 off | 0 || n/a 39c p0 38w / 300w | 0mib / 16160mib | 1% default |+-------------------------------+----------------------+----------------------+| 3 tesla v100-sxm2... on | 00000000:00:1e.0 off | 0 || n/a 40c p0 38w / 300w | 0mib / 16160mib | 1% default |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+| processes: gpu memory || gpu pid type process name usage ||=============================================================================|| no running processes found |+-----------------------------------------------------------------------------+ 结论
本文介绍了 nvidia 容器运行时,以及如何将其轻松集成到容器运行时和编排生态系统中,以启用 gpu 支持。现在就开始用它来构建和运行 gpu 容器吧!安装程序包可用于 品种 的 linux 发行版。 nvidia -docker 1 。 0 已被弃用,不再被积极支持。我们强烈建议用户在使用 docker 时升级到新的 nvidia 运行时。未来的路线图包括许多令人兴奋的特性,包括对 vulkan 、 cuda mps 、集装箱驱动程序等的支持。
关于作者
jonathan calmels 是 nvidia 的系统软件工程师。他的工作主要集中在 gpu 数据中心软件和用于深度学习的超大规模解决方案。乔纳森拥有计算机科学与工程硕士学位。
felix abecassis 是 nvidia 的系统软件工程师,致力于使 gpu 应用程序更易于在数据中心部署和管理。 gpu 专注于机器学习支持框架。他拥有法国学校 epita 的计算机科学硕士学位。
pramod ramarao 是 nvidia 加速计算的产品经理。他领导 cuda 平台和数据中心软件的产品管理,包括容器技术。


AMD八年GPU图形处理器累计出货5.53亿颗,预料2021年迎来又一次爆发
基于LabVIEW软件平台实现增量型PID控制器的设计与应用研究
突发!Intel公司宣布新一轮人事变动
热电池产品主体技术和关键性技术综述
利尔达基于LoRa®的人员定位解决方案,为化工园区提供智能安全保障
使用NVIDIA Docker在容器运行时启用GPU
LC串联和并联电路汇总分析
新型智能技术助力家用物联网行业升级,后装市场为市场重心
I2C总线—电平转换
工信部于发布《关于工业大数据发展的指导意见》
荣耀60系列发布 全球首发骁龙778G+芯片
民航飞机可用性中心将有助于智能发动机愿景变为现实
韩国标准研究所开发出自由曲面实时3次元检测技术
台积电在南京十二寸厂与设计服务中心正式启动
一加电视产品的真机照曝光,将于9月份在印度正式首发
一加5什么时候上市?一加5最新消息:一加5发布会倒计时,一加5的2大看点分析
电路板上接弹簧的原因
IMP811/IMP812组成的复位电路
四维图新旗下中寰卫星助力黑龙江交通运输创新服务及智慧城市建设
真空断路器合闸失灵原因分析及解决方法