docker and deep learning 123

浏览: 2476

一、为什么用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

推荐 0
本文由 safa 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册