docker

 

基于docker与使用示例


目录(?)[+]

0. 引言

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。因此,Docker给应用提供了一个从开发到上线均一致的代码环境,让代码的流水线变得简单不少。

以下是基于docker的caffe环境搭建过程,并给出使用示例。

1. 安装Docker

Docker的安装可以参考官方文档: 

https://docs.docker.com/engine/installation/linux/ubuntulinux/ 
本文安装的时候选择了Ubuntu 14.04的版本。

2. 基于Docker安装Caffe

在caffe官网上已经提供了创建caffe镜像所需的Dockerfile,并且在docker hub上也能找到:https://hub.docker.com/r/elezar/caffe/。 
1) 通过以下命令即可在本地创建caffe镜像:

$ docker pull elezar/caffe:cpu
   
   
  • 1
  • 1

注意,如果要创建GPU版本,则将上述命令中的cpu改成gpu。

2) 下载完成后,测试是否安装正确。 
输入:

$ docker run -ti elezar/caffe:cpu caffe --version
   
   
  • 1
  • 1

会看到如下输出,说明安装成功:

libdc1394 error: Failed to initialize libdc1394
caffe version 1.0.0-rc3
   
   
  • 1
  • 2
  • 1
  • 2

也可以输入:

$ docker images
   
   
  • 1
  • 1

可以看到本地多了一个caffe镜像。 
这里写图片描述

3. Docker下caffe的使用

3.1 在交互模式下运行caffe容器:

$ sudo docker run -t -i elezar/caffe:cpu /bin/bash
   
   
  • 1
  • 1
  • docker run 运行一个容器
  • -t 分配一个(伪)tty (link is external)
  • -i 交互模式 (so we can interact with it)
  • elezar/caffe:cpu 使用 elezar/caffe:cpu 镜像创建容器
  • /bin/bash 运行命令 bash shell

这时我们就可以发现我们已经进入了刚刚创建的容器中,hostname已经变成root@c5f24e953610,其中@后面的这一串数字是当前容器的ID。搭建好的caffe文件夹在/opt/caffe/目录下: 
这里写图片描述 
然后就可以正常使用了。

3.2 以mnist为例,获取mnist数据:

$ cd /opt/caffe/data/mnist/
$ ./get_mnist.sh
   
   
  • 1
  • 2
  • 1
  • 2

可以看到当前目录下生成了新的mnist数据: 
这里写图片描述

是不是和直接在linux系统上使用caffe完全一样呢?是的,通过交互模式的设定,在docker的容器中使用caffe就和直接在linux系统上一样一样滴~~当然,还是有不一样的地方,请看下回分解 ↓↓↓

3.3 容器中数据如何保存

按ctrl+D 或 exit 退出当前容器。 
退出后,如果你想重新使用之前的容器,可以通过以下命令重启,回到之前的状态:

$ docker start container_ID
$ docker attach container_ID
   
   
  • 1
  • 2
  • 1
  • 2

另外要注意,如果你新运行caffe镜像的一个容器,你会发现在之前那个容器中生成的数据都没有啦!

要理解这一点,首先我们需要知道Docker的文件系统是如何工作的。Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。(在Docker中,只读层及在顶部的读写层的组合被称为Union File System,联合文件系统)。

那么如何保存这种修改呢?有两种方式,一种是通过docker commit来扩展一个新的image,另一种是通过docker volume,绕过默认的联合文件系统,将更改的文件以正常的文件或者目录的形式保存于宿主机上。

3.3.1 docker commit
$ docker commit c5f24e953610 mycaffe
   
   
  • 1
  • 1

其中c5f24e953610是我们之前所使用容器的ID,可以通过docker ps -a查看;mycaffe是新生成的镜像的名称。 
这时候我们再使用docker images命令查看现有镜像,发现除了原始的elezar/caffe外,还多了一个名为mycaffe的镜像,即为我们刚创建的镜像: 
这里写图片描述 
如果我们现在为mycaffe创建一个容器,并查看data/mnist/目录,就会发现之前生成的mnist数据存在了,说明容器中的数据被我们保存下来了:

$ docker run -ti mycaffe /bin/bash
$ cd /opt/caffe/data/mnist/
$ ls
   
   
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这里写图片描述

3.3.2 docker Volume

要实现主机和容器之间的数据交互,需要通过docker Volume来完成。 
首先在主机中创建一个用于存储数据的文件夹,并在其中新增一个文件作为测试:

$ mkdir dockerData
$ cd dockerData
$ touch test-file
   
   
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这里写图片描述

然后将该文件夹挂载到新的容器中,在运行时使用-v来声明Volume:

$ docker run -ti -v /home/elaine/dockerData:/dockerData elezar/caffe:cpu
   
   
  • 1
  • 1

以上命令会将主机中的/home/elaine/dockerData目录挂载到容器中的/dockerData目录下,这样我们就可以在容器中看到这个目录了,并且可以看到我们事先存放的test-file: 
这里写图片描述

我们可以在主机上直接操作该目录,比如在主机上再增加一个文件,我们也可以马上在容器中看到变化: 
这里写图片描述

我们也可以在容器中给这个目录添加数据,如caffe训练后的model等,任何在/dockerData路径的文件都可以在主机中访问到。

3.4 附:Docker删除指令

//删除指定容器
$ docker rm container_ID/name
//删除所有已经停止的容器
$ docker rm $(docker ps -a -q)
//删除指定镜像
$ docker rmi image_name
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

reference:

[1] Docker Docs 
[2] 非常详细的 Docker 学习笔记 
[3] 深入理解Docker Volume(一) 
[4] 深入理解Docker Volume(二)

为什么要用docker, 熟悉docker 其实已经很久了,自从实习的时候觉得它是一个利器以来一直没有机会使用它,这几天在折腾caffe环境中,觉得是时候用上Docker了。

需求:构建一个独立的容器,里面安装了caffe 的所有依赖,在需要跑代码的时候,直接运行它。

优点:可以解决各种依赖问题,比如这个软件需要安装gcc 4.7 ,而另外一个需要安装gcc 4.8 等等互斥的环境需求。

Docker 安装

docker 的安装和基本使用,可以参照我上面的两篇博客:安装篇 和 使用篇

构建镜像

构建镜像有两种方法:

1,写Dockerfile,优点是便于共享;

2,从容器中commit,优点是简单方便,但是不方便共享。

由于安装caffe环境需要众多的依赖包,而且由于网络方面的原因,这些依赖包往往不能一次够装好,为了方便起见,这里直接启动一个基本的容器,然后从里面安装依赖包。

这边选择基本的ubuntu:14.04 来开始构建环境,

1,启动容器:

sudo docker run --dns 8.8.8.8 --dns 8.8.4.4 --name ubuntu_caffe -i -t ubuntu:14.04 /bin/bash
   
   
  • 1

需要更改dns,是因为如果没有的话,容器上不了网。

2,依赖包安装

进入容器之后,所有的操作就跟普通的一个样了。 
首先安装一些基本的工具:

apt-get install wget
apt-get install unzip
apt-get install python-pip
   
   
  • 1
  • 2
  • 3

新建路径,后面所有的caffe代码都放在这里

mkdir /home/crw/Caffe
cd /home/crw/Caffe

   
   
  • 1
  • 2
  • 3

opencv 的安装: 
github上面有一个一键安装的,但是在容器里面一键安装不了,后面我是把它里面的脚本一句一句的搞出来执行。

#opencv一句一句的运行
arch=$(uname -m)
if [ "$arch" == "i686" -o "$arch" == "i386" -o "$arch" == "i486" -o "$arch" == "i586" ]; then flag=1; else flag=0; fi
echo "Installing OpenCV 2.4.9"
mkdir OpenCV
cd OpenCV
sudo apt-get -y install libopencv-dev
sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm
sudo apt-get -y install libtiff4-dev libjpeg-dev libjasper-dev
sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev
sudo apt-get -y install python-dev python-numpy
sudo apt-get -y install libtbb-dev
sudo apt-get -y install libqt4-dev libgtk2.0-dev
sudo apt-get -y install libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev
wget http://archive.ubuntu.com/ubuntu/pool/multiverse/f/faac/faac_1.28-6.debian.tar.gz
vi /etc/hosts
ifconfig
sudo apt-get -y install x264 v4l-utils ffmpeg
wget -O OpenCV-2.4.9.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download
unzip OpenCV-2.4.9.zip
cd opencv-2.4.9
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
make -j4
sudo make install
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
cd ..
   
   
  • 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

caffe 和python依赖包:

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install libatlas-base-dev
   
   
  • 1
  • 2
  • 3
  • 4

安装cuda: 
这里面个小技巧就是,如何从host 主机导入数据到容器中,可以使用如下命令(在host上运行)


sudo cp cuda_7.5.18_linux.run /var/lib/docker/aufs/mnt/92562f161e51994949dd8496360265e5d54d32fbe301d693300916cd56d4e0a2/home/crw/Caffe

sudo cp cudnn-7.0-linux-x64-v3.0-prod.tgz /var/lib/docker/aufs/mnt/92562f161e51994949dd8496360265e5d54d32fbe301d693300916cd56d4e0a2/home/crw/Caffe

sudo cp caffe-master.zip /var/lib/docker/aufs/mnt/92562f161e51994949dd8496360265e5d54d32fbe301d693300916cd56d4e0a2/home/crw/Caffe
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中,那一长串数字,是你的容器的完全id,可以用命令

docker inspect -f   '{{.Id}}' ubuntu_caffe #ubuntu_caffe 是容器的名字
   
   
  • 1
./cuda_*_linux.run -extract=`pwd`
./NVIDIA-Linux-x86_64-*.run -s --no-kernel-module
./cuda-linux64-rel-*.run -noprompt

安装cudnn:

tar -xvf cudnn-7.0-linux-x64-v3.0-prod.tgz 
cp cuda/include/cudnn.h /usr/local/cuda/include/
cp cuda/lib64/* /usr/local/cuda/lib64/
   
   
  • 1
  • 2
  • 3

安装caffe:

cd caffe-15.12.07/
cp Makefile.config.example Makefile.config
vi Makefile.config
make all
make test
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

安装caffe 的python绑定

cd python/

apt-get install python-pip
for req in $(cat requirements.txt); do pip install $req; done

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面这几个包需要手动自己去装,用上面的命令一直装不好。

apt-get install python-scipy
for req in $(cat requirements.txt); do pip install $req; done
pip install -U scikit-learn
for req in $(cat requirements.txt); do pip install $req; done
pip install scikit-image
for req in $(cat requirements.txt); do pip install $req; done
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后

make pycaffe

   
   
  • 1
  • 2

最后, 

新建一个路径,以便于磁盘映射

mkdir /media/crw/MyBook
   
   
  • 1

所有的环境都做好了之后,就可以commit 了

docker commit 92562f161e519 my-ubuntu-caffe
   
   
  • 1

这样,就在本地环境中,制作好了一个转好caffe gpu环境的容器了。

启动caffe启动容器:

sudo docker run -ti \
    --device /dev/nvidia0:/dev/nvidia0 \
    --device /dev/nvidiactl:/dev/nvidiactl \
    --device /dev/nvidia-uvm:/dev/nvidia-uvm \
    -v /media/crw/MyBook:/media/crw/MyBook \
    my-ubuntu-caffe  /bin/bash
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1,显卡直通使用, 
2,文件映射,挂载一个host主机的磁盘到容器路径下,这里设置为相同,可以减少一些不必要的麻烦。

运行caffe模型训练

会有提示说找不到cuda啥的,设置一下环境变量即可。

$ export CUDA_HOME=/usr/local/cuda
$ export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
$ PATH=${CUDA_HOME}/bin:${PATH}
$ export PATH
   
   
  • 1
  • 2
  • 3
  • 4
cd /media/crw/MyBook/Experience/FaceRecognition/Softmax/try3_3
./train.sh
   
   
  • 1
  • 2

Done~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值