服务器系统:Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-60-generic x86_64)
四个GPU 型号:NVIDIA TITAN Xp
Docker Version : 18.06.0-ce ,build e68fc7a
NVIDIA 驱动版本:418.56
CUDA 10.0
cuDnn 7.6.0
GNU/Linux x86_64 with kernel version > 3.10
Docker >= 1.12
NVIDIA GPU with Architecture > Fermi (2.1)
NVIDIA drivers >= 361.93 (untested on older versions)
确保已为发行版安装了NVIDIA驱动程序和受支持的Docker 版本。
因实验室有计算机视觉及其他方向,并且运用tensorflow框架需要用到GPU进行模型训练,因GitHub各项目代码所实现的环境要求不同,服务器环境配置较为繁琐,于是自己钻研docker 技术,以便省去环境配置的麻烦。为了能够在docker容器内利用服务器的GPU资源,需要一个较高版本的NVIDIA显卡驱动+NVIDIA docker插件(已更新至NVIDIA docker2.0),假设在各位已经安装好docker的前提下进行如下步骤。
因NVIDIA docker2.0版本在机制上较NVIDIA docker1.0版本有明显的改进,版本对比为了跟进发展的步伐,这里采用2.0版本。根据项目需求不同,要装1.0版本的童鞋可参照此文章进行安装,链接地址:NVIDIA docker1.0安装
官网安装教程:
1、如果之前安装nvidia-docker 1.0版本,我们需要将其移除,并且移除所有存在的GPU容器:(逐行执行命令)
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
2、Add the package repositories:
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
接下来有许多教程采用如下命令
#curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
我亲测,结果报错,提示类似distribution的错误,于是接下来采用以下命令
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update #更新可用软件包及其版本的列表
3、验证步骤
dpkg -l nvidia-docker #验证nvidia-docker软件包已更新到至少1.0.1-3版本
sudo apt install nvidia-docker #如果版本低于1.0.1-3,按如下方法更新包:The updated package ensures the upgrade to the NVIDIA Container Runtime for Docker is performed cleanly and reliably.
4、安装nvidia-docker2软件包并重新加载Docker daemon配置:
sudo apt-get install -y nvidia-docker2 或 sudo apt install nvidia-docker2
sudo pkill -SIGHUP dockerd
安装过程中您可能会看到诸如以下的配置选择::
Configuration file '/etc/docker/daemon.json'
==> File on system created by you or by a script.
==> File also in package provided by package maintainer.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** daemon.json (Y/I/N/O/D/Z) [default=N] ?
在此翻译一下:
配置文件'/etc/docker/daemon.json'
==>您或脚本创建的系统上的文件。
==>也将文件保存在软件包维护者提供的软件包中。
您想怎么做?您的选择是:
Y或I:安装软件包维护者的版本
N或O:保留当前安装的版本
D:显示版本之间的差异
Z:启动外壳程序检查情况
默认操作是保留当前版本。
*** daemon.json(Y / I / N / O / D / Z)[默认= N]?
在提示符下 按Y来安装nvidia-docker2 配置文件。您的原始文件已重命名 /etc/docker/daemon.json.dpkg-old。之后,您可以合并内容以继续使用配置更改。
5、重新启动Docker:
sudo systemctl restart docker
6、验证 nvidia-docker 安装的几种方法如下:(但前三种好像都需要拉去镜像验证,速度较慢,我都出现错误或者速度慢,我就放弃了,要是有人成功了可以和我说下)
第一种:
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
注:Tensorflow官网验证 nvidia-docker安装的方法 注意:nvidia-docker v1 使用 nvidia-docker 别名,而 v2 使用 docker --runtime=nvidia。
第二种:
sudo docker run --runtime=nvidia --rm nvcr.io/nvidia/cuda:9.0-devel-ubuntu16.04 nvidia-smi
注:NVIDIA官网给出的验证方法:如果系统具有对公共Docker存储库的网络访问权限,请验证升级是否成功。
第三种:(网上许多博主采用的方法)
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
注:用最新的官方CUDA镜像去测试nvidia-smi
测试是否成功:
docker run -it --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
第四种:nvidia-docker version
注:如果该命令返回2.x.x,则您的系统已包含Docker的NVIDIA容器运行时的升级,并且无需采取进一步措施。原文:If the command returns 2.0.x, then your system already contains the upgrade to the NVIDIA Container Runtime for Docker and no further action is needed.
如下是我的验证结果:
root@omnisky:~# nvidia-docker version
NVIDIA Docker: 2.2.2
Client:
Version: 18.06.1-ce
API version: 1.38
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:24:56 2018
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.1-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:23:21 2018
OS/Arch: linux/amd64
Experimental: false
更新至NVIDIA的Docker容器运行时,您可以通过以下方式之一运行GPU加速的容器。
1、使用docker运行并指定runtime=nvidia.
$ docker run --runtime=nvidia ...
2、采用 nvidia-docker运行
$ nvidia-docker run ...
新软件包提供了向后兼容性,因此您仍然可以使用此命令运行GPU加速的容器,并且将 使用新的runtime
3、利用 nvidia使用docker run 作为默认runtime
你可以设定 nvidia 作为默认的runtime,例如,通过将以下行添加到 /etc/docker/daemon.json 配置文件作为第一个条目。
"default-runtime": "nvidia",
以下是添加的行如何显示在JSON文件中的示例。进行此更改时,请勿删除任何先前存在的内容。
{
“ default-runtime”:“ nvidia”,
“ runtimes”:{
“ nvidia”:{
“ path”:“ / usr / bin / nvidia-container-runtime”,
“ runtimeArgs”:[]
}
},
}
然后,您可以使用docker run运行GPU加速的容器。
由于我之前在安装完 nvidia-docker2之后,参考的是各个教程,东参考一下,西参考一下,当时有些地方可能顺序不太对,出现了一些问题。
出现的问题:
在依据官网设定 nvidia作为默认runtime,通过 vim修改 /etc/docker/daemon.json 配置文件,将“ default-runtime”:“ nvidia”,写入json文件并保存(这一步我是在安装nvidia-docker2 之后未重启docker的时候进行的操作),操作前我也对这个json文件进行了备份,怕操作后出现更大的问题。结果操作完,用命令sudo systemctl restart docker进行重启,结果失败并报错:
root@omnisky:/etc/docker# sudo systemctl restart docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
输入 sudo systemctl restart docker,结果如下:
root@omnisky:~# sudo systemctl restart docker
Job for docker.service failed. See "systemctl status docker.service" and "journalctl -xe" for details.
root@omnisky:~# systemctl status -l docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: failed (Result: start-limit-hit) since 四 2019-10-31 22:16:55 CST; 1min 53s ago
Docs: https://docs.docker.com
Process: 44533 ExecStart=/usr/bin/dockerd -H fd:// (code=exited, status=1/FAILURE)
Main PID: 44533 (code=exited, status=1/FAILURE)
10月 31 22:16:55 omnisky systemd[1]: docker.service: Service hold-off time over, scheduling restart.
10月 31 22:16:55 omnisky systemd[1]: Stopped Docker Application Container Engine.
10月 31 22:16:55 omnisky systemd[1]: docker.service: Start request repeated too quickly.
10月 31 22:16:55 omnisky systemd[1]: Failed to start Docker Application Container Engine.
10月 31 22:16:55 omnisky systemd[1]: docker.service: Unit entered failed state.
10月 31 22:16:55 omnisky systemd[1]: docker.service: Failed with result 'start-limit-hit'.
10月 31 22:17:46 omnisky systemd[1]: Stopped Docker Application Container Engine.
10月 31 22:17:46 omnisky systemd[1]: docker.service: Start request repeated too quickly.
10月 31 22:17:46 omnisky systemd[1]: Failed to start Docker Application Container Engine.
10月 31 22:17:46 omnisky systemd[1]: docker.service: Failed with result 'start-limit-hit'.
以上结果表明:启动时候显示启动错误,查看信息,发现是配置信息错误
里面有 Active: failed (Result: start-limit-hit)
和 Failed to start Docker Application Container Engine.
这个错误常见于更改配置文件之后docker不能正常启动
查看 /etc/docker ,存在daemon.json文件,修改之后,还是不能正常启动
删除该文件,docker就能正常启动 #如果不够有信心,删除前最好备份一下
若下一个错误:当pull或者push时候,出现EOF错误
docker pull 10.74.120.151:5000/clusterhqci/fpm-centos-7
Using default tag: latest
Trying to pull repository 10.74.120.151:5000/clusterhqci/fpm-centos-7 …
Get https://10.74.120.151:5000/v1/_ping: EOF
使用下面解决办法
vim /etc/sysconfig/docker #如果使用的是docker-latest,在对应位置修改该配置增加下面这行OPTIONS='--insecure-registry 10.74.29.152:5000'
祝各位安装顺利!