制作并使用包含 cuda 开发包的 docker 镜像

一、选择操作系统

1.1 宿主机操作系统

宿主机操作系统推荐使用 ubuntu 18.04。ubuntu 16.04 也可以,但某些软件存在过期的风险。

宿主机安装操作系统时,推荐使用“最小安装”,也即只包含浏览器和必要的软件,其他第三方软件一律不安装。同时也不安装第三方驱动,以免存在不兼容;也为了节省时间,不安装软件更新。

操作系统安装完毕后,可以安装 docker、nvidia-docker2、cuda 和与其有关的所有依赖软件。如果需要远程操纵计算机,可以安装 openssh-server。如果需要监控计算机运行情况,可以安装 htop 和 nethogs 等。

不过,在安装之前,建议将软件源列表更新为适合自己的,比如教育网可以选用上海交通大学的或中国科学技术大学的,以便加快下载速度。

宿主机操作系统环境准备好之后,就不建议再安装新软件或修改软件源了。

1.2 虚拟镜像操作系统

虚拟镜像可用的操作系统有两个版本:

  • Ubuntu 16.04(vistart/ubuntu:16.04)
  • Ubuntu 18.04(vistart/ubuntu:18.04)

括号中的内容为镜像名称。

此镜像与官方 ubuntu 镜像的不同之处在于:

  • 将官方源列表替换为上海交通大学的;
  • 安装了 ca-certificates;
  • ubuntu 16.04 镜像还安装了 apt-transport-https;
  • 将所有软件更新到最新。

不同操作系统使用的 cuda 开发包并不保证通用,因此制作 docker 镜像时应当先选择适合你的操作系统。

ubuntu 镜像源代码:https://github.com/vistart/Dockerfiles/tree/master/ubuntu

例如接下来我们以 ubuntu 18.04 为例,制作 docker 镜像。

ubuntu 镜像的更新时间一般为3、6、9、12月的月末。依赖的镜像更新之后,依赖其的镜像如果不重新制作,那环境依然是旧的。

二、安装驱动程序、docker 和 nvidia-docker2

具体安装步骤不是本文探讨的重点,官方文档已经讲解的非常详细了。

NVIDIA 显卡驱动和 CUDA

docker 安装说明

nvidia-docker2 安装说明

三、选择 cuda 版本

NVIDIA 官方镜像和我制作的镜像之间的继承关系为:

base
  |
  |--- runtime
          |
          |--- cudnn*-runtime
          |
          |--- devel
                 |
                 |--- cudnn*-devel
                           |
                           |--- cudnn*-tensorrt*-devel 

其中 cudnn*-tensorrt*-devel 由我制作。

2.1 制作包含 cuda 包和驱动的镜像(base)

我们参照 NVIDIA 官方镜像的制作流程,编写自己的 Dockerfile。

由于脚本过长,所以不在此处展示。可以访问此处查看脚本。

Dockerfile 文件可以放到你的文件系统的任何位置,一般放置在当前用户目录下。因为 NVIDIA 官方将此镜像命名为 base,因此我将此 Dockerfile 放置在 ~/Dockerfiles/cuda/ubuntu18.04/10.0/base 目录下。

编辑完成后,切换到该目录并构建镜像:

docker build . -t vistart/cuda:10.0-base-ubuntu18.04

构建的时间可能比较长,而且中途可能会遇到 CDN 缓存不一致的问题,可以耐心多尝试几次。

-t 参数表示镜像构建成功后,为该镜像标记的标签。

标签命名规则为 <cuda版本号>-<环境名称>-<操作系统名称>

从环境变量可以看出,目前最新的 cuda 版本是 10.0.130。与 Ubuntu 镜像不一样的是,每当 cuda 版本更新后才会重新制作此镜像。

此环境仅包括 cudart 和 cuda-compat 包。

2.2 制作 runtime、cudnn7-runtime、devel、cudnn7-devel 镜像

制作其它四个镜像依然可以参照官方 Dockerfile,仅有的区别是依赖的镜像和维护者。

2.3 制作 10.0-cudnn7-tensorrt5-devel 镜像

官方制作的镜像只包括 cuda、cudnn 和 nccl,不包括 tensorrt。因此我们只能自己制作包含 tensorrt 的镜像。

由于 NVIDIA 官方并未提供可直接访问的下载源,因此我们只能到开发者网站登录后下载

下载对应操作系统的软件包,例如 Ubuntu 18.04 、cuda 10.0 、cudnn 7.3 对应的 TensorRT 包为:

 

四、上传、分发和使用镜像

4.1 上传制作好的镜像

制作好的镜像可以上传到 Docker Hub。上传之前先注册 Docker 账号,然后在宿主机使用 docker login 命令登录。登录完成后即可使用 docker push 命令向服务器上传镜像了。

如果要上传某个标签的镜像,可以使用如下命令:

docker push vistart/cuda:10.0-base-ubuntu18.04

如果要上传 vistart/cuda 下的所有镜像,则可以不加具体标签,例如:

docker push vistart/cuda

上传完成后,可以在自己的 Docker Hub 看到最近上传时间了。

注意:注册的 Docker ID 必须与自己命名的仓库名称的 ID 部分完全一致,否则无法上传。

Docker Hub 允许多人共同维护 Docker 镜像,前提是 Docker Hub 所有者已将其他维护者的 ID 添加到贡献者名单中。

4.2 使用和分发镜像

已上传到 Docker Hub 的镜像可以非常方便地分发到其它宿主机中。

例如,我要在另一台宿主机使用某一镜像,则只需要运行

nvidia-docker run <镜像名称>

即可。如果要运行的镜像不在本地,docker 会在运行前将镜像下载到本地,然后再运行。

如果只想把镜像下载到本地,而不运行,则可以输入命令:

nvidia-docker pull <镜像名称>

注意:凡是与 GPU 有关的镜像应当使用 nvidia-docker,否则无法使用 GPU 资源。

从 cuda 10 开始,只能使用 nvidia-docker 2.0 版运行包括 cuda 10 的镜像。

五、制作自己的镜像

可以从下方的“附录2”中寻找已经制作好的镜像并运行容器。如果列表中没有符合自己需要的镜像,或镜像环境缺少某些软件或数据,则可以自己制作镜像。

附录1:vistart 的镜像之间的关系

vistart/ubuntu
     |
     |--- vistart/cuda
               |
               |--- vistart/build_tensorflow
                              |
                              |--- vistart/tensorflow
                                           |
                                           |--- 其它所有依赖 tensorflow 的镜像

如果被依赖的镜像发生更新,则依赖其的镜像并不会同步更新。所以依赖镜像如果需要新环境的话,只能重新制作镜像。

附录2:已经制作好的镜像:

vistart/cuda               10.0-cudnn7-devel-ubuntu18.04                             be42f6c1f01f        7 days ago          2.99GB
vistart/cuda               10.0-devel-ubuntu18.04                                    a94cebfce909        7 days ago          2.3GB
vistart/cuda               10.0-cudnn7-runtime-ubuntu18.04                           baf341602c1d        7 days ago          1.29GB
vistart/cuda               10.0-runtime-ubuntu18.04                                  4a9fed282deb        8 days ago          944MB
vistart/cuda               10.0-base-ubuntu18.04                                     aec1a38411ed        8 days ago          185MB
vistart/cuda               10.0-base-ubuntu16.04                                     66c8a30b977c        8 days ago          209MB
vistart/tensorflow         py27-1.2.0-cuda8.0-cudnn5-devel-ubuntu16.04               2a2ece479466        11 days ago         2.55GB
vistart/cuda               8.0-cudnn5-devel-ubuntu16.04                              295128e6b671        11 days ago         1.89GB
vistart/build_tensorflow   py27-cuda10.0-cudnn7-tensorrt5-devel-ubuntu18.04          5a99c5b3dd83        12 days ago         7.15GB
vistart/build_tensorflow   py36-cuda10.0-cudnn7-tensorrt5-devel-ubuntu18.04          c3f2a45a85fd        12 days ago         7.19GB
vistart/tensorflow         py36-1.10.1-cuda10.0-cudnn7-tensorrt5-devel-ubuntu18.04   60604a7be1c5        12 days ago         7.84GB
vistart/tensorflow         py35-1.3.0-cuda8.0-cudnn6-devel-ubuntu16.04               32cb0d205b78        12 days ago         3.02GB
vistart/cuda               8.0-cudnn6-devel-ubuntu16.04                              d9c87376c8f5        12 days ago         2.04GB
vistart/cuda               8.0-devel-ubuntu16.04                                     05f5edccaacd        12 days ago         1.74GB
vistart/cuda               8.0-runtime-ubuntu16.04                                   ddc249743645        12 days ago         840MB
vistart/ubuntu             16.04                                                     f272a778bc9d        13 days ago         178MB
vistart/tensorflow         py27-1.10.1-cuda10.0-cudnn7-tensorrt5-devel-ubuntu18.04   cc2d2c20dee3        13 days ago         7.8GB
vistart/cuda               10.0-cudnn7-tensorrt5-devel-ubuntu18.04                   dadf98222950        2 weeks ago         5.83GB
vistart/cuda               10.0-base                                                 1fd6a108d6d6        2 weeks ago         185MB

Docker Hub:

vistart/cuda

vistart/build_tensorflow

vistart/tensorflow

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据