准备使用 Docker 容器

本章概述了在基本操作系统模式下,从命令行访问 Docker 容器以在 NVIDIA® DGX-1™ 上使用的先决条件。这些容器包含 NVIDIA DGX-1 特定的软件,以确保您的应用程序获得最佳性能。以这些容器为基础构建应用程序应能提供最佳的单 GPU 性能和多 GPU 扩展。

在 DGX OS 服务器软件 2.x 或更早版本上安装 Docker 和 NVIDIA GPU 的 Docker Engine Utility

为了在利用 GPU 的 Docker 镜像中实现可移植性,NVIDIA 开发了 NVIDIA GPU 的 Docker Engine Utility (nvidia-docker),这是一个开源项目,提供了一个命令行工具,用于在启动时将 NVIDIA 驱动程序的用户模式组件和 GPU 挂载到 Docker 容器中。

从 DGX OS 服务器软件 3.1.1 及更高版本开始,Docker 和 nvidia-docker 实用程序是基本软件安装的一部分,您无需执行本节中的步骤。但是,如果您的 DGX-1 安装的是 2.x 或更早版本的软件,请按照以下说明在系统上安装 Docker 和 nvidia-docker

要确定系统上的 DGX OS 服务器软件版本,请输入以下命令。
$ grep VERSION /etc/dgx-release
DGX_SWBUILD_VERSION="2.0.4"
在安装 Docker 之前,请确保您的环境满足先决条件。有关更多信息,请参阅 Docker 入门
  1. 安装 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
  2. 编辑 /etc/default/docker 文件以使用 Overlay2 存储驱动程序。
    1. 打开 /etc/default/docker 文件进行编辑。
       $ sudo vi /etc/default/docker
    2. 添加以下行
      DOCKER_OPTS="--storage-driver=overlay2"
      如果已经存在 DOCKER_OPTS 行,则将参数(引号之间的文本)添加到 DOCKER_OPTS 环境变量。
    3. 完成后保存并关闭 /etc/default/docker 文件。
    4. 使用新配置重启 Docker。
      $ sudo service docker restart
  3. 安装 NVIDIA GPU 的 Docker Engine Utility 以下示例同时安装 nvidia-dockernvidia-docker-plugin
    $ wget -P /tmp
    https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
    
    $ sudo dpkg -i /tmp/nvidia-docker*.deb && rm
    /tmp/nvidia-docker*.deb

配置 Docker IP 地址

为了确保 DGX-1 可以访问 Docker 容器的网络接口,应将 Docker 配置为使用与 DGX-1 使用的其他网络资源不同的子网。

默认情况下,Docker 使用 172.17.0.0/16 子网。请咨询您的网络管理员,了解您的网络使用的 IP 地址。如果您的网络与默认的 Docker IP 地址范围没有冲突,则无需进行任何更改,您可以跳过本节。

但是,如果您的网络将此范围内的地址用于 DGX-1,则应更改默认的 Docker 网络地址。实现此目的的方法取决于 DGX-1 上安装的基本操作系统软件版本。

  1. 如果您不知道 DGX-1 上安装的基本操作系统软件版本,请输入以下命令并检查 VERSION 条目。
    $ grep VERSION /etc/dgx-release
    DGX_SWBUILD_VERSION="3.1.1"
  2. 按照适用于已安装软件版本的章节中的说明进行操作。

为 DGX OS 服务器软件 2.x 及更早版本配置 Docker IP 地址

  1. 打开 /etc/default/docker 文件进行编辑。
     $ sudo vi /etc/default/docker
  2. 修改 /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 环境变量。
  3. 完成后保存并关闭 /etc/default/docker 文件。
  4. 使用新配置重启 Docker。
    $ sudo service docker restart

为 DGX OS 服务器软件 3.1.1 及更高版本配置 Docker IP 地址

您可以通过修改 /etc/docker/daemon.json 文件或修改 /etc/systemd/ system/docker.service.d/docker-override.conf 文件来更改默认的 Docker 网络地址。这些说明提供了一个修改 /etc/systemd/system/docker.service.d/docker-override.conf 以覆盖默认 Docker 网络地址的示例。

  1. 打开 docker-override.conf 文件进行编辑。
     $ sudo vi /etc/systemd/system/docker.service.d/docker-override.conf
    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -s overlay2
    LimitMEMLOCK=infinity
    LimitSTACK=67108864
  2. 进行以下以粗体显示的更改,为您网络设置正确的桥接 IP 地址和 IP 地址范围。请咨询您的 IT 管理员以获取正确的地址。
    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -s overlay2 --bip=192.168.127.1/24
          --fixed-cidr=192.168.127.128/25
    
    LimitMEMLOCK=infinity
    LimitSTACK=67108864 
    完成后保存并关闭 /etc/systemd/system/docker.service.d/docker-override.conf 文件。
  3. 重新加载 systemctl 守护程序。
    $ sudo systemctl daemon-reload
  4. 重启 Docker。
    $ sudo systemctl restart docker

允许用户执行 Docker 命令

为了防止 docker 守护程序在没有特权升级保护的情况下运行,NVIDIA Docker 软件需要 sudo 特权才能运行容器。

您可以通过以下方式之一向将在 DGX-1 上运行容器的用户授予所需的特权

  • 将每个用户添加为具有 sudo 特权的管理员用户。

  • 将每个用户添加为没有 sudo 特权的普通用户,然后将用户添加到 docker 组。

    本节提供有关将用户添加到 docker 组的说明。

注意:警告:仅将您信任具有 root 特权的用户添加到 docker 组。这些说明使访问 Docker 容器的用户更加方便;但是,生成的 docker 组等同于 root 用户,因为一旦用户能够向 Docker 引擎发送命令,他们就能够升级特权并运行 root 级别操作。这可能违反您组织的安全策略。有关这如何影响您系统安全性的信息,请参阅 Docker 守护程序攻击面。始终咨询您的 IT 部门,以确保安装符合您数据中心的安全策略。
注意: 本节中的命令需要 sudo 访问权限,应由系统管理员执行。

检查用户是否在 Docker 组中

要检查用户是否已经是 docker 组的成员,请输入以下命令

$ groups username 

输出显示该用户所属的所有组。如果未列出 docker,则添加该用户。

创建用户

要创建新用户以便将其添加到 docker 组,请执行以下操作

$ sudo adduser username

按照提示创建密码和其他用户配置设置。

将用户添加到 Docker 组

对于要添加到 docker 组的每个用户,输入以下命令

$ sudo usermod -a -G docker username

为 NGC 容器启用 GPU 支持

为了在运行 NGC 容器时获得最佳性能,已经开发了三种为 Docker 容器提供 GPU 支持的方法:
  • 原生 GPU 支持(包含在 Docker-ce 19.03 或更高版本中)
  • NVIDIA Container Runtime for Docker (nvidia-docker2 包)
  • NVIDIA GPU 的 Docker Engine Utility (nvidia-docker 包)
系统中实现的方法取决于安装的 DGX OS 版本(对于 DGX 系统)、云服务提供商提供的特定 NGC 云镜像,或者您为在 TITAN PC、Quadro PC 或 vGPU 上运行 NGC 容器而安装的软件。

请参考下表以帮助确定您的系统中实现了哪种方法。

DGX OS 版本 包含的方法
4.2

原生 GPU 支持

NVIDIA Container Runtime for Docker

4.1 NVIDIA Container Runtime for Docker
4.0 NVIDIA Container Runtime for Docker
3.1(版本 3.1.8、3.1.7 和 3.1.6) NVIDIA GPU 的 Docker Engine Utility,但可以更新到 NVIDIA Container Runtime for Docker
3.1(最高至版本 3.1.5) NVIDIA GPU 的 Docker Engine Utility
2.1 NVIDIA GPU 的 Docker Engine Utility
2.0 NVIDIA GPU 的 Docker Engine Utility

每种方法都通过使用特定的 Docker 命令来调用,如下所述。

使用原生 GPU 支持

注意: 如果在也安装了 nvidia-docker2 的系统上将 Docker 更新到 19.03,则仍然可以使用有关使用 NVIDIA Container Runtime for Docker 的说明。
  • 使用 docker run --gpus 运行启用 GPU 的容器。
    • 使用所有 GPU 的示例
      $ docker run --gpus all ...
    • 使用两个 GPU 的示例
      $ docker run --gpus 2 ...
    • 使用特定 GPU 的示例
      $ docker run --gpus "device=1,2" ...
      $ docker run --gpus "device=UUID-ABCDEF,1" ... 

使用 NVIDIA Container Runtime for Docker

安装 NVIDIA Container Runtime for Docker (nvidia-docker2) 后,您可以通过以下方式之一运行 GPU 加速的容器。
  • 使用 docker run 并指定 runtime=nvidia
    $ docker run --runtime=nvidia ...
  • 使用 nvidia-docker run
    $ nvidia-docker run ...

    新软件包提供向后兼容性,因此您仍然可以使用此命令运行 GPU 加速的容器,并且将使用新的运行时。

  • 使用 docker run,并将 nvidia 作为默认运行时。

    您可以将 nvidia 设置为默认运行时,例如,通过将以下行添加到 /etc/docker/daemon.json 配置文件中作为第一个条目。

    "default-runtime": "nvidia",

    以下是在 JSON 文件中添加行的示例。进行此更改时,请勿删除任何预先存在的内容。

    {
     "default-runtime": "nvidia",
      "runtimes": {
         "nvidia": {
             "path": "/usr/bin/nvidia-container-runtime",
             "runtimeArgs": []
         }
     },
    
    }

    然后,您可以使用 docker run 运行 GPU 加速的容器。

    $ docker run ...
    注意
    如果在将 nvidia 设置为默认运行时构建 Docker 镜像,请确保 Dockerfile 执行的构建脚本指定容器将需要的 GPU 架构。否则可能会导致容器仅针对构建它的 GPU 架构进行优化。指定 GPU 架构的说明取决于应用程序,并且超出了本文档的范围。有关指导,请咨询特定的应用程序构建过程。

使用 NVIDIA GPU 的 Docker Engine Utility

安装 NVIDIA GPU 的 Docker Engine Utility (nvidia-docker) 后,按如下方式运行启用 GPU 的容器。

$ nvidia-docker run ... 

配置系统代理

如果您将在基本操作系统模式下使用 DGX-1,并且您的网络需要使用代理,请编辑文件 /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>/";

为了确保 Docker 能够通过代理访问 DGX-1 容器注册表,Docker 使用环境变量。有关配置 Docker 的代理环境变量的最佳实践建议,请参阅 https://docs.docker.net.cn/engine/admin/systemd/#http-proxy

配置 NFS 挂载和缓存

DGX-1 包括四个 RAID 0 配置的 SSD。这些 SSD 旨在用于应用程序缓存,因此您必须设置自己的 NFS 驱动器以进行长期数据存储。

禁用 cachefilesd

DGX-1 系统使用 cachefilesd 来管理 NFS 的缓存。如果您不希望启用 cachefilesd,您可以按如下方式禁用它。
sudo systemctl stop cachefilesd
sudo systemctl disable cachefilesd

使用 cachefilesd

以下说明描述了如何将 NFS 挂载到 DGX-1 上,以及如何使用 DGX-1 SSD 缓存 NFS 以提高性能。

确保您有一个 NFS 服务器,其中包含一个或多个要由 DGX-1 访问的数据导出,并且 DGX-1 和 NFS 服务器之间存在网络访问。

  1. 为 DGX-1 配置 NFS 挂载。
    1. 编辑文件系统表配置。
      sudo vi /etc/fstab
    2. 为 NFS 挂载添加新行,使用本地挂载点 /mnt
      <nfs_server>:<export_path> /mnt nfs rw,noatime,rsize=32768,wsize=32768,nolock,tcp,intr,fsc,nofail 0 0
      • /mnt 在此处用作示例挂载点。
      • 请咨询您的网络管理员以获取 <nfs_server> 和 <export_path> 的正确值。
      • 此处提供的 nfs 参数是基于典型用例的推荐值列表。但是,"fsc" 必须始终包含在内,因为该参数指定使用 FS-Cache。
    3. 保存更改。
  2. 验证 NFS 服务器是否可访问。
    ping <nfs_server>
    使用服务器 IP 地址或您的网络管理员提供的服务器名称。
  3. 挂载 NFS 导出。
    sudo mount /mnt
    /mnt 是步骤 1 中使用的示例挂载点。
  4. 验证是否已启用缓存。
    cat /proc/fs/nfsfs/volumes
    在输出中查找文本 FSC=yes。重新启动后,NFS 应已挂载并缓存在 DGX-1 上。