Caffe in Docker

文章目录
  1. 基本环境
  2. 查看Dockerfile
  3. Caffe image
  4. dockerfile
  5. 创建容器
  6. 常见错误
  7. GPU设置
  8. 多卡训练

搭建基于docker的caffe运行环境, 之前在自己的Ubuntu上搭建caffe环境4次失败, 每次由于驱动问题将GUI搞垮, 将GUI搞回来驱动又不兼容, 很是折腾, 当然做镜像也很折腾呀, 当时可以共享给其他人, 拿走不谢!

基本环境

  1. nvidia-smi 查看GPU以及驱动的版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.48 Driver Version: 367.48 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K40m Off | 0000:02:00.0 Off | 0 |
| N/A 31C P0 62W / 235W | 0MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla K40m Off | 0000:03:00.0 Off | 0 |
| N/A 34C P0 67W / 235W | 0MiB / 11439MiB | 97% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
  • 驱动版本是367.48
  • 2片GPUTesla K40m
  • 操作系统cenos7.0

看到这两块GPU简直不能开心更多

查看Dockerfile

怎样制作自己的镜像, 我在之前的博客里都写过了, 用标签筛选一下查看

  1. 点击查看基于Cuda7.5的Caffe Dockerfile

  2. 要求安装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设备和驱动文件来实现的。安装参考

遇到的问题:

  1. 要求docker-enginedocker-io冲突, 用sudo yum remove docker-io ,然后sudo yum remove docker-engine就可以了
  2. Are you trying to connect to a TLS-enabled daemon without TLS?
    查看docker进程ps -ef|grep docker, 启动dockersudo service docker start或者``

Caffe image

  1. sudo docker login

  2. sudo docker search caffe

  3. 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硬件穿透进容器就可以了

  1. 检查/usr/src/kernels下面有没有安装可用的kernel

  2. 下载NVIDIA驱动, chmod u+x NVIDIA-Linux-x86_64-367.57.run赋予运行权限, ./NVIDIA-Linux-x86_64-367.57.run安装驱动, nvidia-smi检查是否安装成功

  3. 这样在启动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设置

  1. 需要使用GPU的用户,最好先检查物理机上的GPU状态是否正常,运行:

    nvidia-smi或者/usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery

    • dev文件夹中查看硬件是否存在
  2. 将下面内容存为caffedocker的文件里, chmod +x caffedocker变为可执行文件, sudo ./caffedocker caffe:shangyan /bin/bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
DOCKER_BIN="/usr/bin/docker"
INTERACT="-ti"
#INTERACT="-d"
DATA_VOLUME="/disk1"
DATA_MOUNT_POINT="/disk1"
MEM_LIMIT=96g
set -e
if [ $# -lt 2 ]; then
echo "Usage: $0 image command"
exit -1
else
IMAGE=$1
shift 1
CMD=$@
fi
devices=$(ls -1 /dev | grep nvidia)
dev_param=""
for d in $devices; do
dev_param="$dev_param --device=/dev/$d"
done
time_param='-v /etc/localtime:/etc/localtime:ro'
if [ ! -z "$CUDA_VISIBLE_DEVICES" ]; then
dev_env="-e CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
else
dev_env=""
fi
exec $DOCKER_BIN run \
"$INTERACT" \
-P \
$dev_env \
$dev_param \
$time_param \
-m $MEM_LIMIT \
-v $DATA_VOLUME:$DATA_MOUNT_POINT \
"$IMAGE" \
$CMD
  • 成功运行之后,已经进入交互式的docker容器(理解为一个与host隔离的运行环境)中,物理机上的 /disk1 磁盘映射到容器内的 /disk1 文件夹,建议数据只存储到 /disk1 下(如果容器销毁,其他数据不会保留)。

检查GPU工作正常:

nvidia-smi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.57 Driver Version: 367.57 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K40m Off | 0000:02:00.0 Off | 0 |
| N/A 26C P0 61W / 235W | 0MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla K40m Off | 0000:03:00.0 Off | 0 |
| N/A 28C P0 62W / 235W | 0MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 Tesla K40m Off | 0000:82:00.0 Off | 0 |
| N/A 43C P0 63W / 235W | 0MiB / 11439MiB | 82% Default |
+-------------------------------+----------------------+----------------------+

检查通过以后,您可以像普通终端一样,运行软件

多卡训练

在命令后面加参数-gpu 0,1,2 (三卡并行)

深度学习和HPC工具集用户手册

  • 解决在docker中安装驱动缺少对应版本的kernel
  1. 在host中分别将/usr/src//lib/modules/下的对应的kernel拷贝到docker容器中的文件夹中,重新安装驱动就可以

  2. sudo apt-get install linux*安装对应的kernel