搭建基于docker的caffe运行环境, 之前在自己的Ubuntu上搭建caffe环境4次失败, 每次由于驱动问题将GUI搞垮, 将GUI搞回来驱动又不兼容, 很是折腾, 当然做镜像也很折腾呀, 当时可以共享给其他人, 拿走不谢!
基本环境
nvidia-smi
查看GPU以及驱动的版本
1 | +-----------------------------------------------------------------------------+ |
- 驱动版本是
367.48
- 2片GPU
Tesla K40m
- 操作系统
cenos7.0
看到这两块GPU简直不能开心更多
查看Dockerfile
怎样制作自己的镜像, 我在之前的博客里都写过了, 用标签
筛选一下查看
点击查看基于Cuda7.5的Caffe Dockerfile
要求安装
NVIDIA Docker
nvidia-docker- 因为GPU属于特定的厂商产品,需要特定的driver,Docker本身并不支持GPU。以前如果要在Docker中使用GPU,就需要在container中安装主机上使用GPU的driver,然后把主机上的GPU设备(例如:/dev/nvidia0)映射到container中。所以这样的Docker image并不具备可移植性。Nvidia-docker项目就是为了解决这个问题,它让Docker image不需要知道底层GPU的相关信息,而是通过启动container时mount设备和驱动文件来实现的。安装参考
遇到的问题:
- 要求
docker-engine
和docker-io
冲突, 用sudo yum remove docker-io
,然后sudo yum remove docker-engine
就可以了 Are you trying to connect to a TLS-enabled daemon without TLS?
查看docker进程ps -ef|grep docker
, 启动dockersudo service docker start
或者
Caffe image
sudo docker login
sudo docker search caffe
sudo docker pull kaixhin/caffe
dockerfile
创建过程见 Dockerfile创建镜像
进入dockerfile所在的目录:
sudo docker build -t caffe:cpu ./
- 创建cpu镜像镜像, 注意这里下载的dockerfile是cpu版本的, 如果是gpu版本的dockerfile则
sudo docker build -t caffe:gpu ./
阿里云镜像
在21天实战Caffe
提供的GPU版本的Caffe镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/alicloudhpc/toolkit
- Pull镜像
sudo docker tag 2593ae802092 caffe:shangyan
- 重命名镜像
sudo docker rmi registry.cn-hangzhou.aliyuncs.com/alicloudhpc/toolkit:latest
- 取消原来的Tag
创建容器
sudo docker run -i -t -d -P --name caffe_shangyan -v /home/shang:/home/ caffe21:shangyan
- 创建caffe容器, 将主机的
/home/shang
挂载到容器的/home/
下面
sudo docker run --privileged=true -i -t -d -P --name caffe_gpu_shangyan -v /home/shang:/home/ caffe_gpu:shangyan
- 创建GPU版本的Caffe容器, 将主机的
/home/shang
挂载到容器的/home/
下面
sudo docker run --privileged=true --net=host -i -t -d -P --name caffe_gpu_shangyan -v /home/shang:/home/ caffe_gpu:shangyan
- 网络host模式,使用
--net=host
指定, 但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
cd /root/caffe
- 进入caffe目录
常见错误
libcudart.so.7.0: cannot open shared object file: No such file or directory
cd ~
更改.profile
文件, 添加export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
, 最后source ./.profile
文件
驱动冲突 : Failed to initialize NVML: GPU access blocked by the operating system
驱动版本不匹配 : Failed to initialize NVML: Driver/library version mismatch
- Host上的驱动和容器内的驱动不一致
这里详细讲一下, 关于驱动问题:
之前为了方便在启用docker的时候使用--privileged=true
将所有的host权限打开, 同时要保证容器中有可用的kernel, 这样我们只将GPU硬件穿透进容器就可以了
检查
/usr/src/kernels
下面有没有安装可用的kernel下载
NVIDIA驱动
,chmod u+x NVIDIA-Linux-x86_64-367.57.run
赋予运行权限,./NVIDIA-Linux-x86_64-367.57.run
安装驱动,nvidia-smi
检查是否安装成功这样在启动docker的时候只要将GPU挂载到容器上就可以了, 参考如下命名:
sudo docker run -i -t -d -P --device=/dev/nvidia0 --device=/dev/nvidia1 --device=/dev/nvidia2 --name pascal_shangyan -v /home/shang:/home/ registry.cn-hangzhou.aliyuncs.com/shang/caffe:pascal
GPU设置
需要使用GPU的用户,最好先检查物理机上的GPU状态是否正常,运行:
nvidia-smi
或者/usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery
- 在
dev
文件夹中查看硬件是否存在
- 在
将下面内容存为
caffedocker
的文件里,chmod +x caffedocker
变为可执行文件,sudo ./caffedocker caffe:shangyan /bin/bash
1 | #!/bin/bash |
- 成功运行之后,已经进入交互式的docker容器(理解为一个与host隔离的运行环境)中,物理机上的 /disk1 磁盘映射到容器内的 /disk1 文件夹,建议数据只存储到 /disk1 下(如果容器销毁,其他数据不会保留)。
检查GPU工作正常:
nvidia-smi
1 | +-----------------------------------------------------------------------------+ |
检查通过以后,您可以像普通终端一样,运行软件
多卡训练
在命令后面加参数-gpu 0,1,2
(三卡并行)
- 解决在docker中安装驱动缺少对应版本的kernel
在host中分别将
/usr/src/
和/lib/modules/
下的对应的kernel拷贝到docker容器中的文件夹中,重新安装驱动就可以sudo apt-get install linux*
安装对应的kernel