NVIDIA Docker2安装教程及踩坑历险记

NVIDIA Docker2安装教程及踩坑历险记

  • 安装前准备
    • 本地配置
    • 安装必备条件
    • 安装动机及原因
    • 一点说明
  • 安装nvidia-docker2
  • 对Docker使用NVIDIA Container Runtime
  • 安装过程中的一些意外

安装前准备

本地配置

服务器系统: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安装

安装nvidia-docker2

官网安装教程:
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

对Docker使用NVIDIA Container Runtime

更新至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'

祝各位安装顺利!

你可能感兴趣的:(深度学习,docker,nvidia,docker,gpu)