用nvidia-docker跑深度学习模型

背景


最近实验室要参加一个目标检测的比赛,这段时间一直在跑ssd模型,最开始根据作者给的文档成功编译后,可以在VOC数据集上进行训练。由于要用比赛官方的数据集,因此做了几天的数据集,然后拿自己的数据集训练的时候,出现了以下报错:Check failed: a <= b (0 vs. -1.192093-07)

在这里插入图片描述

去网上搜了相关的解决方法,全都是说把math_functions.cpp第250行注释掉,重新编译,这种方案一看就不靠谱,而且也没人说个所以然,但是还是抱着试一试的心态照做了,果然又出现了新的bug。查了几天的资料也没找到解决方案,一开始我怀疑可能是我的数据集做的有问题,然后我又重新在VOC数据集上训练,结果会出现同样的问题,联想到前两天实验室服务器重装了系统,然后cuda从8.0换到了9.1版本,会不会是这个原因导致了现在的报错呢?但是因为实验室服务器是大家共用的,把cuda改回到8.0版本可能给其他人带来困扰,刚好实验室有其他同学在搞nvidia docker,干脆直接用nvidia docker来跑模型,就不用考虑环境问题了。

什么是nvidia docker


介绍nvidia docker之前,首先要了解什么是docker。

Docker 是一个开源的应用容器引擎,基于 GO语言并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,可以实现虚拟化。

Docker所代表的容器虚拟化技术属于操作系统级虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。并且传统虚拟化技术是在硬件层面实现虚拟化,增加了系统调用链路的环节,有性能损耗;容器虚拟化技术以共享Kernel的方式实现,几乎没有性能损耗。

这里可以将容器理解为一种沙盒。每个容器内运行一个应用,不同的容器相互隔离,容器之间可以建立通信机制。容器的创建和停止都十分快速(秒级),容器自身对资源的需求十分有限,远比虚拟机本身占用的资源少。

关于Docker更详细的介绍,请参照几张图帮你理解docker基本原理及快速入门,感觉介绍的很不错

docker一般服务于基于cpu 的应用,而我们的深度学习模型是跑在gpu上面的,因此需要用nvidia docker。nvidia docker的运行需要基于一定的硬件环境,需要安装nvidia driver,docker容器本身并不支持nvidia gpu。最开始的解决方法是在容器内部安装nvidia driver,然后通过设置相应的设备参数来启动container,但是这样做带来一个弊端就是可能导致image无法共享,因为宿主机的driver的版本必须完全匹配容器内的driver版本,很可能本地机器的不一致导致每台机器都需要去重复操作,这很大的违背了docker的初衷。nvidia docker实际上是一个docker plugin,它在docker上做了一层封装,对docker进行调用,类似一个守护进程,发现宿主机驱动文件以及gpu 设备,并且将这些挂载到来自docker守护进程的请求中,以此来支持docker gpu的使用。

安装docker


  1. GPU driver安装

nvidia官网下载安装对应型号的显卡驱动:链接
如果安装成功,在终端中输入 lspci | grep -i nvidia ,会显示自己的NVIDIA GPU版本信息

  1. CUDA安装

实验室服务器是ubuntu 18.04版本,可以直接sudo apt install nvidia-cuda-toolkit安装

  1. docker安装
  • 安装必要的一些系统工具
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
  • 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  • 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  • 更新并安装 docker-ce
sudo apt-get -y update
sudo apt-get -y install docker-ce
  • 验证
sudo service docker status 			#或者sudo systemctl status service.docker 检查Docker服务的状态 
sudo docker run hello-world			#测试Docker安装是否成功

在这里插入图片描述
在这里插入图片描述

  1. nvidia-docker安装
  • 如果之前安装过docker1.0版本,需要先删掉该版本和之前创建的容器
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
  • 添加代码仓库
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
sudo apt-get update
  • 安装docker 2
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
  • 测试
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
  1. 安装过程中遇到的问题

网上有的教程会设置阿里云加速器,是因为官方Docker Hub网络速度较慢,所以使用阿里云提供的Docker Hub,然后需要配置阿里云加速器。具体步骤如下:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’ 
{ 
   “registry-mirrors”: [“https://fird1mfg.mirror.aliyuncs.com“] 
} 
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

结果我在重启docker服务的时候,产生了如下报错:

docker.service - LSB: Create lightweight, portable, self-sufficient containers
Loaded: loaded (/etc/init.d/docker; generated)
Active: failed (Result: exit-code) since Wed 2018-09-26 10:11:16 CST; 28s ago
Docs: man:systemd-sysv-generator(8)
Process: 18639 ExecStart=/etc/init.d/docker start (code=exited, status=1/FAILULURE)
Main PID: 15621 (code=exited, status=1/FAILURE)

9月 26 10:11:16 archlab-X10DRG systemd[1]: Starting LSB: Create lightweight, portable, self-sufficient containers....
9月 26 10:11:16 archlab-X10DRG docker[18639]:  * /usr/bin/dockerd not present or not executable
9月 26 10:11:16 archlab-X10DRG systemd[1]: docker.service: Control process exited, code=exited status=1
9月 26 10:11:16 archlab-X10DRG systemd[1]: docker.service: Failed with result 'exit-code'.
9月 26 10:11:16 archlab-X10DRG systemd[1]: Failed to start LSB: Create lightweight, portable, self-sufficient containers

根绝报错的第二行,发现是dockerd除了问题,dockerd是docker的守护进程,现在提示不存在或不可用,然后我执行了sudo dockerd,打印出了以下报错信息

unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character ‘h’ after object key

这说明docker的配置文件除了问题,打开daemon.json文件,果然发现刚才设置阿里云加速器的时候,写入的语句有问题,应该是我直接复制粘贴导致的问题,改正之后docker服务可以正常启动了。

用nvidia docker进行训练


  1. 拉取镜像(这里拉取了阿里云的一个镜像,里面自带了编译好的caffe,不过由于在实验室的宿主机上已经有编译好的caffe,可以直接将宿主机的目录挂载到容器中,这个后面有说)
sudo nvidia-docker pull registry.cn-hangzhou.aliyuncs.com/docker_learning_aliyun/caffe:v1
  1. 查看拉取的镜像信息
sudo nvidia-docker images

在这里插入图片描述

  1. 利用拉取的镜像启动容器,并把宿主机的caffe目录挂载到容器上
sudo nvidia-docker run -it –v $CAFFE_ROOT:/workspace 4e33(镜像id前4位即可)/bin/bash

这样就启动了一个容器,并且把caffe目录挂载到了容器的/workspace下。这样操作的好处是,训练完的数据可以直接存放在宿主机,省略了从容器中拷贝的繁琐步骤。

剩下的就是将caffe模型跑起来等待结果就可以了。

猜你喜欢

转载自blog.csdn.net/weixin_42749767/article/details/82934294