准备使用 Docker 容器
DGX-2™ 、DGX-1™ 和 DGX Station™ 旨在运行容器。容器包含应用程序以及运行该应用程序所需的任何库或代码。容器在操作系统系列中是可移植的。例如,您可以使用 Red Hat Enterprise Linux 创建一个容器,并在 Ubuntu 系统上运行它,反之亦然。两个操作系统之间唯一的共同点是它们都需要有容器软件,以便它们可以运行容器。
使用容器允许您在您感到舒适的任何操作系统上创建软件,然后在您想要的任何地方运行该应用程序。它还允许您与其他用户共享应用程序,而无需在他们使用的操作系统上重建应用程序。
容器与虚拟机 (VM) 不同,例如 VMware。VM 具有完整的操作系统,可能还包括应用程序和数据文件。容器不包含完整的操作系统。它们仅包含运行应用程序所需的软件。容器依赖于主机操作系统来提供文件系统服务、网络和操作系统内核等。容器中的应用程序将始终在任何地方以相同的方式运行,而与操作系统/计算环境无关。
DGX-2、DGX-1 和 DGX Station 都使用 Docker。Docker 是最流行的容器服务之一,并且在人工智能 (AI) 领域的开发者中非常常用。有一个公共 Docker 仓库,其中包含预构建的 Docker 容器。这些容器可以是简单的基础操作系统,例如 CentOS,或者它们可能是完整的应用程序,例如 TensorFlow™ 。您可以使用这些 Docker 容器来运行它们包含的应用程序。您可以将它们用作创建其他容器的基础,例如用于扩展容器。
为了在利用 GPU 的 Docker 镜像中实现可移植性,NVIDIA 开发了用于 Docker 的 NVIDIA 容器运行时(也称为 nvidia-docker2)。为了简洁起见,在本指南的其余部分,我们将 NVIDIA 容器运行时简称为 nvidia-docker2。
nvidia-docker2 是一个开源项目,提供了一个命令行工具,用于在启动时将 NVIDIA 驱动程序的用户模式组件和 GPU 挂载到 Docker 容器中。
这些容器确保您的应用程序获得最佳性能,并应提供最佳的单 GPU 性能和多 GPU 扩展。
关于此任务
需要进行一些初始设置,才能从 Docker 命令行访问 GPU 容器,以便在 DGX-2、DGX-1 或 DGX Station 或 NGC 上使用。由于 DGX™ OS 和 DGX 硬件版本之间的差异,初始设置工作流程取决于您使用的 DGX 系统和 DGX OS 版本。要确定 DGX-2、DGX-1 或 DGX Station 上的 DGX OS 软件版本,请输入以下命令
$ grep VERSION /etc/dgx-release
DGX_SWBUILD_VERSION="3.1.1"
根据命令的输出,从下面选择最能反映您环境的工作流程。选择主题并执行该工作流程中的步骤。
DGX-2 或 DGX-1,搭载 DGX OS Server 3.1.1 或更高版本工作流程
DGX-1,搭载 DGX OS Server 2.x 或更早版本
- 版本 2.x 或更早版本:安装 Docker 和 nvidia-docker2
- 版本 2.x 或更早版本:防止 Docker 和 DGX 之间的 IP 地址冲突
- 配置代理的使用
- 允许用户运行 Docker 容器
DGX Station 工作流程
2.1. 版本 2.x 或更早版本:安装 Docker 和 nvidia-docker2
关于此任务
DGX OS Server 3.1.1 及更高版本中包含 Docker 和 nvidia-docker2。因此,如果安装了 DGX OS Server 3.1.1 或更高版本,您可以跳过此任务。
DGX OS Server 2.x 或更早版本中未包含 Docker 和 nvidia-docker2。如果您的 DGX-1 上安装了 DGX OS Server 2.x 或更早版本,则必须在系统上安装 Docker 和 nvidia-docker2。目前,已开发了两个实用程序:nvidia-docker 和 nvidia-docker2。您可以通过运行以下命令来确定系统上安装了哪个实用程序
$ nvidia-docker version
- 如果响应是
NVIDIA Docker: 1.0.x
,则您正在使用 nvidia-docker。 - 如果响应是
NVIDIA Docker: 2.0.x
(或更高版本),则您正在使用 nvidia-docker2。
步骤
- 安装 Docker。
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D $ echo deb https://apt.dockerproject.org/repo ubuntu-trusty main | sudo tee /etc/apt/sources.list.d/docker.list $ sudo apt-get update $ sudo apt-get -y install docker-engine=1.12.6-0~ubuntu-trusty
- 下载并安装 nvidia-docker2。
- 从 GitHub 下载包含 nvidia-docker2 和 nvidia-docker-plugin v1.0.1 版本的 .deb 文件。
$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
- 安装 nvidia-docker2 和 nvidia-docker-plugin,然后删除您刚刚下载的 .deb 文件。
$ sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
- 从 GitHub 下载包含 nvidia-docker2 和 nvidia-docker-plugin v1.0.1 版本的 .deb 文件。
2.2. 防止 Docker 的 IP 地址冲突
为了确保您的 DGX 系统可以访问 Docker 容器的网络接口,请确保将容器配置为使用与 DGX 系统使用的其他网络资源不同的子网。默认情况下,Docker 使用 172.17.0.0/16 子网。如果此范围内的地址已在您的 DGX 系统的网络上使用,请更改 Docker 网络以指定 DNS 服务器的 IP 地址、桥接 IP 地址范围以及 GPU 容器要使用的容器 IP 地址范围。请咨询您的网络管理员,以了解您的网络使用的 IP 地址。
如果您的网络未使用默认 Docker IP 地址范围中的地址,则无需进行更改,您可以忽略此任务。
2.2.1. 版本 3.1.1 及更高版本:防止 Docker 和 DGX 之间的 IP 地址冲突
关于此任务
为了确保 DGX 可以访问 Docker 容器的网络接口,请将容器配置为使用与 DGX 使用的其他网络资源不同的子网。默认情况下,Docker 使用 172.17.0.0/16
子网。如果 DGX 网络中已使用此范围内的地址,请更改 Docker 网络以指定 Docker 容器要使用的桥接 IP 地址范围和容器 IP 地址范围。
开始之前
此任务需要 sudo 权限。
步骤
- 在纯文本编辑器(例如 vi)中打开 /etc/systemd/system/docker.service.d/docker-override.conf 文件。
$ sudo vi /etc/systemd/system/docker.service.d/docker-override.conf
- 将以下选项附加到以
ExecStart=/usr/bin/dockerd
开头的行,该行指定启动 dockerd 守护程序的命令:-
--bip=<i>桥接-IP-地址-范围</i>
-
--fixed-cidr=<i>容器-IP-地址-范围</i>
- 桥接-IP-地址-范围
- Docker 容器要使用的桥接 IP 地址范围,例如
192.168.127.1/24
。 - 容器-IP-地址-范围
- Docker 容器要使用的容器 IP 地址范围,例如
192.168.127.128/25
。
此示例显示了一个完整的 /etc/systemd/system/docker.service.d/docker-override.conf 文件,该文件已被编辑为指定 Docker 容器要使用的桥接 IP 地址范围和容器 IP 地址范围。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -s overlay2 --default-shm-size=1G --bip=192.168.127.1/24 --fixed-cidr=192.168.127.128/25 LimitMEMLOCK=infinity LimitSTACK=67108864
注意从 DGX 版本 3.1.4 开始,选项 --disable-legacy-registry=false 已从 Docker CE 服务配置文件 docker-override.conf 中删除。删除该选项是为了与 Docker CE 17.12 及更高版本兼容。
-
- 保存并关闭 /etc/systemd/system/docker.service.d/docker-override.conf 文件。
- 重新加载 systemd 守护程序的 Docker 设置。
$ sudo systemctl daemon-reload
- 重启 docker 服务。
$ sudo systemctl restart docker
2.2.2. 版本 2.x 或更早版本:防止 Docker 和 DGX 之间的 IP 地址冲突
关于此任务
DGX OS 版本 2.x 及更早版本包含一个 Ubuntu 操作系统版本,该版本使用 Upstart 来管理服务。因此,dockerd
守护程序通过 /etc/default/docker
文件进行配置,并通过 service 命令进行管理。
步骤
- 打开
/etc/default/docker
文件进行编辑。$ sudo vi /etc/default/docker
- 修改
/etc/default/docker
文件,为您网络指定正确的桥接 IP 地址和 IP 地址范围。请咨询您的 IT 管理员以获取正确的地址。例如,如果您的 DNS 服务器的 IP 地址为 10.10.254.254,并且 DGX-1 不需要 192.168.0.0/24 子网,则可以将以下行添加到/etc/default/docker
文件中DOCKER_OPTS=”--dns 10.10.254.254 --bip=192.168.0.1/24 -- fixedcidr=192.168.0.0/24”
DOCKER_OPTS
行,则将参数(引号之间的文本)添加到DOCKER_OPTS
环境变量中。 - 完成后,保存并关闭
/etc/default/docker
文件。 - 使用新配置重启 Docker。
$ sudo service docker restart
2.3. 配置代理的使用
关于此任务
如果您的网络需要使用代理,则必须确保 APT 配置为通过 HTTP、HTTPS 和 FTP 代理下载 Debian 软件包。然后,Docker 将能够通过这些代理访问 NGC 容器注册表。
步骤
- 打开
/etc/apt/apt.conf.d/proxy.conf
文件进行编辑,并确保存在以下行Acquire::http::proxy "http://<username>:<password>@<host>:<port>/"; Acquire::ftp::proxy "ftp://<username>:<password>@<host>:<port>/"; Acquire::https::proxy "https://<username>:<password>@<host>:<port>/";
-
username
是您的主机用户名 -
password
是您的主机密码 -
host
是代理服务器的地址 -
port
是代理服务器端口
-
- 保存
/etc/apt/apt.conf.d/proxy.conf
文件。 - 使用新配置重启 Docker。
$ sudo service docker restart
2.4. 允许用户运行 Docker 容器
关于此任务
为了防止 docker 守护程序在没有权限提升保护的情况下运行,Docker 软件需要 sudo 权限才能运行容器。满足此要求涉及允许将运行 Docker 容器的用户使用 sudo 权限运行命令。因此,您应确保只有您信任且了解使用 sudo 权限运行命令对 DGX 的潜在风险的用户才能运行 Docker 容器。
在允许多个用户使用 sudo 权限运行命令之前,请咨询您的 IT 部门,以确定您是否会违反您组织的安全策略。有关允许用户运行 Docker 容器的安全影响,请参阅 Docker 安全性。
-
将每个用户添加为具有 sudo 权限的管理员用户。
-
将每个用户添加为没有 sudo 权限的标准用户,然后将用户添加到
docker
组。这种方法本质上是不安全的,因为任何可以将命令发送到 docker 引擎的用户都可以提升权限并运行 root 用户操作。要将现有用户添加到
docker
组,请运行以下命令$ sudo usermod -aG docker user-login-id
- user-login-id
- 您要添加到
docker
组的现有用户的用户登录 ID。
在您设置好 DGX-2、DGX-1 或 DGX Station 之后,接下来您需要获得对 NGC 容器注册表的访问权限,然后您可以在其中拉取容器并在 DGX 系统上的这些容器中运行神经网络、部署深度学习模型以及执行 AI 分析。
对于 DGX-2、DGX-1 和 DGX Station 用户,有关设置 NGC 容器注册表的逐步说明,请参阅 NGC 容器注册表 DGX 用户指南。
声明
本文档仅供参考,不应视为对产品特定功能、状况或质量的保证。NVIDIA Corporation(“NVIDIA”)对本文档中包含信息的准确性或完整性不做任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对因使用此类信息或因使用此类信息而可能导致的侵犯专利或第三方的其他权利的后果或使用不承担任何责任。本文档不构成对开发、发布或交付任何材料(如下所定义)、代码或功能的承诺。
NVIDIA 保留随时对此文档进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。
客户在下订单之前应获取最新的相关信息,并应验证此类信息是否为最新且完整。
NVIDIA 产品根据 NVIDIA 标准销售条款和条件进行销售,这些条款和条件在订单确认时提供,除非 NVIDIA 和客户的授权代表签署的个别销售协议(“销售条款”)另有约定。NVIDIA 特此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档不直接或间接地构成任何合同义务。
NVIDIA 产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命维持设备,也不适用于 NVIDIA 产品的故障或故障可能合理预期会导致人身伤害、死亡或财产或环境损害的应用。NVIDIA 对 NVIDIA 产品包含和/或用于此类设备或应用不承担任何责任,因此,此类包含和/或使用由客户自行承担风险。
NVIDIA 不保证或声明基于本文档的产品将适用于任何特定用途。NVIDIA 不一定对每个产品的所有参数进行测试。客户全权负责评估和确定本文档中包含的任何信息的适用性,确保产品适用于且符合客户计划的应用,并为该应用执行必要的测试,以避免应用或产品的默认设置。客户产品设计中的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的附加或不同条件和/或要求。NVIDIA 对任何可能基于或归因于以下原因的任何默认设置、损坏、成本或问题不承担任何责任:(i) 以任何与本文档相悖的方式使用 NVIDIA 产品;或 (ii) 客户产品设计。
本文档未授予 NVIDIA 专利权、版权或其他 NVIDIA 知识产权下的任何明示或暗示的许可。NVIDIA 发布的有关第三方产品或服务的信息不构成 NVIDIA 授予使用此类产品或服务的许可,也不构成对其的保证或认可。使用此类信息可能需要获得第三方在其专利或其他知识产权下的许可,或者获得 NVIDIA 在其专利或其他知识产权下的许可。
仅在事先获得 NVIDIA 书面批准的情况下,才允许复制本文档中的信息,并且复制时不得更改,必须完全符合所有适用的出口法律和法规,并附带所有相关的条件、限制和声明。
本文档和所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均按“原样”提供。NVIDIA 对材料不作任何明示、暗示、法定或其他方面的保证,并明确声明不承担所有关于不侵权、适销性和针对特定用途的适用性的暗示保证。在法律未禁止的范围内,在任何情况下,NVIDIA 均不对任何损害(包括但不限于任何直接、间接、特殊、附带、惩罚性或后果性损害,无论如何引起,也无论责任理论如何)承担责任,即使 NVIDIA 已被告知可能发生此类损害。尽管客户可能因任何原因而遭受任何损害,但 NVIDIA 对本文所述产品的累计总责任应根据产品的销售条款进行限制。
HDMI
HDMI、HDMI 徽标和 High-Definition Multimedia Interface 是 HDMI Licensing LLC 的商标或注册商标。
OpenCL
OpenCL 是 Apple Inc. 的商标,已获得 Khronos Group Inc. 的许可使用。
商标
NVIDIA、NVIDIA 徽标以及 cuBLAS、CUDA、DALI、DGX、DGX-1、DGX-2、DGX Station、DLProf、Jetson、Kepler、Maxwell、NCCL、Nsight Compute、Nsight Systems、NvCaffe、PerfWorks、Pascal、SDK Manager、Tegra、TensorRT、Triton Inference Server、Tesla、TF-TRT 和 Volta 是 NVIDIA Corporation 在美国和其他国家/地区的商标和/或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。