一、选择操作系统
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
具体安装步骤不是本文探讨的重点,官方文档已经讲解的非常详细了。
三、选择 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:
您必须登录才能发表评论。