基于 docker 的 caffe 环境搭建与使用示例

基于 docker 的 caffe 环境搭建与使用示例

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

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

  1. 下载完成后,测试是否安装正确。
    输入:
$ docker run -ti elezar/caffe:cpu caffe --version

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

libdc1394 error: Failed to initialize libdc1394
caffe version 1.0.0-rc3

也可以输入:

$ docker images

可以看到本地多了一个 caffe 镜像。

img

3. Docker 下 caffe 的使用

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

$ sudo docker run -t -i elezar/caffe:cpu /bin/bash
  • 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 / 目录下:

img

然后就可以正常使用了。

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

$ cd /opt/caffe/data/mnist/
$ ./get_mnist.sh

可以看到当前目录下生成了新的 mnist 数据:

img

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

3.3 容器中数据如何保存

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

$ docker start container_ID
$ docker attach container_ID

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

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

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

3.3.1 docker commit

$ docker commit c5f24e953610 mycaffe

其中 c5f24e953610 是我们之前所使用容器的 ID,可以通过 docker ps -a 查看;mycaffe 是新生成的镜像的名称。
这时候我们再使用 docker images 命令查看现有镜像,发现除了原始的 elezar/caffe 外,还多了一个名为 mycaffe 的镜像,即为我们刚创建的镜像:

img

如果我们现在为 mycaffe 创建一个容器,并查看 data/mnist / 目录,就会发现之前生成的 mnist 数据存在了,说明容器中的数据被我们保存下来了:

$ docker run -ti mycaffe /bin/bash
$ cd /opt/caffe/data/mnist/
$ ls

img

3.3.2 docker Volume

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

$ mkdir dockerData
$ cd dockerData
$ touch test-file

img

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

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

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

img

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

img

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

3.4 附:Docker 删除指令

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

reference:

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

posted @ 2020-04-21 18:08  别再闹了  阅读(631)  评论(0)    收藏  举报