一、为什么用Docker:隔离环境、重建环境
每个深度学习实例可能会采用不同的框架(Python, Torch, Tensorflow, Caffe, OpenCV...),每个框架会有很多依赖,安装配置会浪费大量时间。并且很容易弄错编译器版本、弄错库的路径、缺少头文件等等。装多了各种实例,极易造成混乱,各种报错。
virtualenv只是解决Python开发环境的依赖、版本之类的问题,而且换台机器,virtualenv自己也需要麻烦的重建。
Docker将Linux Kernel中需要的内容静态链接到你的应用中,可以出色的解决依赖问题,分发/重现个人的方法相当方便(但它却不直接支持GPU。。。)。
还好,英伟达官方出了nvidia-docker包含了对GPU的支持,可在其上建立深度学习实例的docker。
Docker容器不需要持久化任何数据,感觉像即插即用。你可以想象为,你使用了一个大大的tensorflow.exe 命令,把所有需要的依赖都编译到这条命令里了。
二、准备
用Docker之前,先要安装Docker,Nvidia driver,CUDA,cuDNN,nvidia-docker。如果:
nvidia-docker run --rm nvidia/cuda nvidia-smi
显示了显卡的信息,那就是安装成功了。
安装nvidia-docker参考https://github.com/NVIDIA/nvidia-docker
三、用别人做好的实例Docker
例子:pix2pix
1. 克隆文件、下载数据
git clone https://github.com/phillipi/pix2pix.git
cd pix2pix
bash datasets/download_dataset.sh facades
2. 运行nvidia-docker训练脚本
sudo nvidia-docker run \
--rm \
--volume /:/host \
--workdir /host$PWD \
affinelayer/pix2pix \
env \
DATA_ROOT=datasets/facades \
name=facades \
niter=200 \
save_latest_freq=400 \
which_direction=BtoA \
display=0 \
th train.lua
四、定制自己的镜像
建个新目录放自己的docker,把建镜像的命令写到Dockerfile里
mkdir mydocker // 1. 新建空目录
cd mydocker
wget https://github.com/crisbal/docker-torch-rnn/blob/master/CUDA/8.0/Dockerfile // 2. 获得Dockerfile
sudo docker build --rm --no-cache --tag crisbal/torch-rnn:cuda8.0 // 3. 构建镜像
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。怎么写Dockerfile,参考别人的Dockerfile例子:
wget https://github.com/crisbal/docker-torch-rnn/blob/master/CUDA/8.0/Dockerfile
查看镜像
sudo docker image ls # 镜像列表
sudo docker images mydeep # mydeep 镜像
检查镜像构建历史
sudo docker history mydeep
不同时间用Dockerfile定制镜像可能导致版本不一样,出现不同的结果。若含有跟时间有关的命令,如git clone 或apt-get update等,不同时间编译,可能导致定制的镜像不一致。另外若指定了CPU,则在另一台机器上也可能无法运行。
五、删除镜像
定制失败
定制失败,可能会产生<none>的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 63e6739a1af3 12 minutes ago 1.91GB
删除镜像:
docker rmi 63e6739a1af3
Error response from daemon: conflict: unable to delete 63e6739a1af3 (must be forced) - image is being used by stopped container ff5e5b5d2cfa
查看所有容器:
sudo docker ps -a
先要删除使用的容器:
docker rm ff5e5b5d2cfa
然后再删除镜像:
docker rmi 63e6739a1af3
Deleted: sha256:63e6739a1af3dd2d60021eb6fba80fbee94ba9bb4d7d9bb33cdccb04bb3d0b49
Deleted: sha256:ebc067027aac1c6230ae0f7ad3d59c91f5edd90d3de2dd9155a5a1a8e4537588
Deleted: sha256:68f7690c89a35994b58e7141b8edd024a6ebe82d7c6cc230d414c02a09bd8814
Deleted: sha256:ceb8757b35e4a7ce6b0f5520bebf94463c39d26c18b90ca9e0a6df89089f4ecd
Deleted: sha256:7600b489d7e6999455fd3d8bc6f7b4f080291c081f99840f6cfd94f6f609b8e9
六、容器名字问题
docker ps //仅列出running的容器
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker ps -a //列出所有容器
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80a0ca58d6ec my_image "bash" 12 minutes ago Exited (137) 6 minutes ago python_box
先杀掉容器,才能删除
docker kill python_box && docker rm python_box
七、安装nvidia-docker
# Install nvidia-docker and nvidia-docker-plugin
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
八、卸载nvidia-docker
运行docker断网出错docker: Error response from daemon: create nvidia_driver_352.63: create nvidia_driver_352.63: Error looking up volume plugin nvidia-docker: plugin not found.
解决:先卸载nvidia-docker,再安装
apt-get purge nvidia-docker
rm -rf /var/lib/nvidia-docker
九、Docker安装
sudo apt-get update
sudo apt-get install docker.io
因为墙,先改镜像
sudo vi /etc/apt/sources.list
:%s/cn.archive.ubuntu.com/ftp.sjtu.edu.cn/g
启动docker后台服务
sudo service docker start
验证dock是否运行
systemctl status docker
验证hello world
sudo docker run hello-world
参考:
docker-torch-rnn
Docker镜像构建文件Dockerfile及相关命令介绍
Docker — 从入门到实践
An all-in-one Docker image for deep learning
GPU FAQ