Ubuntu16.04 借助 Docker 安装 Caffe

最近在 Ubuntu 上安装 Caffe 总是有各种各样的问题,尽管因为系统版本的问题没有安装 CUDA ,少了不少麻烦,但在 make 的时候总是缺这个.o文件或者少那个.h文件。Docker 常用命令请查看参考部分的第一个

 

0. 安装 Docker

在 Ubuntu 上安装 Docker 的命令十分简单:

1. 获取 Caffe 的 Docker 镜像

恰巧有群友说到 Docker,以前看过,现在还依稀记得。现在提供两种方法来获取 Docker 镜像,大家二选一(1.1 或者 1.2)即可。考虑到有的同学没有 git 下 caffe 的源码,我们这里推荐第二种方法(跳过1.1,开始1.2 搜索并下载 Caffe 的 Docker 镜像)。

1.1 通过 Dockerfile 来创建 Docker 镜像

发现 Caffe 从 Github 上下载下来的压缩包中,根目录就有一个名为 Docker 的文件夹,可以进去后选择 CPU 文件夹或者 GPU 文件夹,根据Dockerfile来 build 不同版本的 Docker Caffe 镜像。使用如下命令来 build 镜像:

镜像保存的地方我也不知道在哪儿,查书也没查到,不过到找到了 Docker 安装的部分文件在用户根目录的某个文件夹里面。反正镜像在我们的镜像仓库里(后文会说到)。

1.2 搜索并下载 Caffe 的 Docker 镜像

使用如下命令,可以在 Docker Hub 上搜索所有用户上传的镜像,一般来说选择点星星(Star)最多的镜像。输入命令(docker search caffe)后,显示如下:

我们选择星星最多的镜像并下载,命令如下:

我们这里选择 cpu 版本。下载完成后镜像就会在我们的镜像仓库里,可以通过命令(docker images)来查看,显示如下:

2. 查看当前运行的容器

首先,我们先来使用命令(docker ps)看看当前有哪些容器正在运行:

可以看到,当前没有正在运行的容器,这个命令还可以带一个参数 -a (代表全部,docker ps -a),查看所有的容器状态,可以看到有的容器我们退出了的时间,创建了的时间等等信息:

3. 由 Docker 镜像创建并运行一个容器

既然没有正在运行的容器,那么我们根据镜像来创建一个容器吧!使用命令(docker run -tdi REPOSITORY)来创建,之后再查看当前运行的容器有哪些。

创建容器并运行的命令(docker run -tdi REPOSITORY)中,REPOSITORY 名称是镜像仓库中镜像的名字,可以通过使用命令 (docker images)来查看当前本地镜像仓库有哪些镜像,并根据要创建镜像的 REPOSITORY 名来创建容器

4. 进入容器内

在创建运行了容器后,我们进入容器。进入容器的命令(docker attach CONTAINER_ID,其中CONTAINER_ID只要开头一点可以和其他的CONTAINER_ID区分就可以),执行结果如下:

一般在执行进入容器前,我们都会输入查看当前正在运行的容器的命令(docker psdocker ps -a),看着 CONTAINER_ID 来进入指定的容器。

有时候会出现命令行伪假死状态(进入命令输入完成后,等半天命令行不动,似乎卡死了),其实没有,你输入键盘上的回车敲击几下,发现好着呢(一般而言,当输入docker attach命令完成后,瞬间就进入了容器,输入回车键就跳出命令行伪假死状态)。

5. 退出并停止容器

进入容器后,我们进行我们需要的作业,完成后或者设置完成后我们可以退出当前的容器,在容器里使用命令exit(或者直接键盘Ctrl+D)即可退出并暂停当前容器

退出后,当我们需要再次启动该容器,我们同样是先查看刚刚退出暂停的容器的CONTAINER_ID(可以用命令docker ps -a来查看),然后容器开始执行的命令(docker start CONTAINER_ID)。

对于正在运行中的容器,我们停止其运行,可以使用停止命令(docker stop CONTAINER_ID),结果如下:

可发现,我们在创建并运行某个容器的时候,可以用其 IMAGE ID (镜像ID)来创建。

6. 进入 Caffe 容器尝试使用 Python

下面是在Shell里操作,大致含义:

  • 首先查看现在是否有正在运行的容器,发现没有,那我们由 docker-caffe-cpu 的镜像 ID 创建一个容器,然后观察当前是否增加了一个运行中的容器,发现有的,那么我们就连接 attach 进这个容器中。
  • 进去后,我们到根目录的opt文件夹下,看到 caffe 安装文件在这里。
  • 输入 Python 进入,尝试 import caffe,第一次初始化中,第二次成功。

若发现输入 python 后,尝试 import caffe 失败,提示如下:

那是因为没有编译 pycaffe ,那就切换到 root 目录的 caffe 下(cd ~/caffecd /root/caffe),然后编译 pycaffe(貌似编译有点问题,后面import caffe不行,这里先Mark一下)。

7. 启动和其它问题

7.1 Ubuntu14.04启动失败

后来我在Ubuntu14.04上安装后,运行时出现如下信息的报错:

执行如下命令后,问题解决:

7.2 无法从仓库下载到镜像

使用 docker pull 命令报错信息如下:

目前就是反复使用该命令,总会有一次成功的。但这不是个办法,所以可以考虑翻墙或者国内的一些仓库,比方说使用 DaoCloud 的仓库或者是阿里的。我们这里提供一个阿里的镜像(专门做DeepLearning和HPC,里面已经集成了CUDA7.0,Caffe,Thean,Torch7等)。

可以使用该命令直接把镜像 pull 下来:

由于阿里提供的镜像比较大,将近9个G,下载下来后,用 docker images 命令查看当前的镜像信息:

其中,<none>是笔者尚未下载完被强制暂停的(只包含) caffe 的镜像。

7.3 容器内无法访问外网

注:本小节是2017年02月20日追加的博客内容。重新安装系统后把docker按照官方教程安装了,但是从网上docker pull下来的镜像,进入容器无法访问外网导致无法安装软件。下面给出解决方案和参考链接。

根据后文的参考,我属于的问题是默认的docker配置文件没有修改,需要改dns server就好了。

去掉“docker_OPTS=”–dns 8.8.8.8 –dns 8.8.4.4″”前的#号。

参考的这个,总结了Docker容器内不能联网的6种解决方案:http://blog.csdn.net/yangzhenping/article/details/43567155

参考

  1. Docker 4 — 总结(Docker常用命令):https://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html
  2. linux – FATA[0000] Get http:///var/run/docker.sock/v1.17/version: dial unix /var/run/docker.sock – Stack Overflow  http://stackoverflow.com/questions/29294286/fata0000-get-http-var-run-docker-sock-v1-17-version-dial-unix-var-run-doc
  3. 阿里开发者平台(DL+HPC的docker镜像)  https://dev.aliyun.com/detail.html?spm=5176.1972343.2.20.C16rVe&repoId=2
  4. Pulling Docker images: i/o timeout – Open Source Projects / Open Source Registry API – Docker Forums (用处可能不大) https://forums.docker.com/t/pulling-docker-images-i-o-timeout/740/11
  5. 写的很详细)Docker容器内不能联网的6种解决方案 – 每一天都有新的希望 – 博客频道 – CSDN.NEThttp://blog.csdn.net/yangzhenping/article/details/43567155

更多参考

  1. Docker —— 从入门到实践:http://udn.yyuap.com/doc/docker_practice/index.html

  2. 国内首个 Docker Hub 镜像服务 DaoCloud 上线 – 开源中国社区  http://www.oschina.net/news/57894/daocloud

One thought on “Ubuntu16.04 借助 Docker 安装 Caffe

  1. Pingback: Ubuntu16.04 借助 Docker 安装 Caffe-鲸鱼云

发表评论

电子邮件地址不会被公开。 必填项已用*标注