制作并使用包含 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 官方镜像和我制作的镜像之间的继承关系为:

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

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

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

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

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

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

构建的时间可能比较长,而且中途可能会遇到 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 命令向服务器上传镜像了。

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

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

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

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

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

4.2 使用和分发镜像

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

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

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

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

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

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

五、制作自己的镜像

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

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

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

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

Docker Hub:

vistart/cuda

vistart/build_tensorflow

vistart/tensorflow

发表评论

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