Caffe 無痛開始:使用 docker


https://amoshyc.github.io/blog/caffe-wu-tong-kai-shi-shi-yong-docker.html

Introduction

Caffe is a deep learning framework made with expression, speed, and modularity in mind. It is developed by the Berkeley Vision and Learning Center (BVLC) and by community contributors.

Caffe 是當紅的 Deep Learning 框架,但他的安裝是極為複雜,非常容易失敗。我們可以改用 Caffe 官方提供的 docker image,把一切都包好了,讓我們可以在 docker 中使用 Caffe,不擔心污染到 host OS,並輕易地刪除或創建 Caffe 的環境。

在本文我們將使用 cpu 版本的 caffe docker image,該 image 已內建 caffe, pycaffe (python 2.7), numpy, scipy, 等。另外我還希望使用 Jupyter, matplotlib 等。本文會說明如何無痛開始使用 Caffe,旨在快速開始使用 caffe 而不被那些複雜的安裝嚇退。但如果你的程式或產品需要 gpu 的話,這篇文對你就沒什麼幫助,請還是乖乖安裝或用 nvidia-docker。


本文是在 Fedora 25 上測試,你要先會 docker 與 linux 的基本操作才看得懂這篇文。我的 username 是 amoshyc,看到時請自動將之轉為你的 username。以下所有 docker 的指令預設情況下,都必需使用 sudo 來執行。

建構容器

docker run -d -p 8888:8888 -v /home/amoshyc/workspace:/workspace:z --name caffe -i bvlc/caffe:cpu bash

這指令會創造出一個名為 caffe 的容器在背景執行。若 local 沒有 bvlc/caffe:cpu 的 image,這指令會去下載,這個 image 解壓後有 1.5 GB 大,請小心。

-i 代表互動模式。 -d 代表一開始容器是在背景執行。 --name caffe 設定容器的名稱。 -p 8888:8888 將 port 8888 打開,這是 Jupyter 的預設 port。 -v /home/amoshyc/workspace:/workspace:z 讓容器的 /workspace 對應到 host OS 的 ~/workspace:z 是為了防止 Fedora SE Linux 警告所須加的參數(host OS 不是 Fedora 不用加)。冒號之前是 host OS 的資料夾,之後是容器中的資料夾,都必需使用絕對路徑。

容器操作

進入離開容器:

docker exec -it caffe bash
(在容器中)exit

啟動關閉容器:

docker start caffe
docker stop caffe

刪除容器:

docker rm caffe

列出所有容器:

docker ps -a

在進入容器後,就可以使用各種 caffe 的指令了。另外,caffe 的各個工具已經被加到 PATH 中,可以執行:

caffe --version

來測試。

此外,我也建議先去跑跑 /opt/caffe/examples/mnist/ 底下的程式,細節請參該目錄底下的 readme.md 或者你也可以在 Github 上看到該 文檔 的內容。MNIST 相當於 Machine Learning 的 Hello World,這資料夾底下是放 Lenet,一個著名的用來解 MNIST 的 CNN。另外也建議搭配著 /opt/caffe/examples/01-learning-lenet.ipynb 一起看,Github 的連結在 這裡 。我個人認為這是要搞懂 caffe 相當好的 example。


在容器中,clear 指令是不起作用的,不過你只要:

export TERM=linux

之後在同一個 shell 底下,clear 指令就會正常運作了。

在容器中,如果想透過 apt 安裝套件,請記得先:

apt update

安裝 Jupyter

我們想要在容器中執行 Jupyter 並在 host OS 的瀏覽器中使用。這相當於從外部網路連到一個伺服器上的 Jupyter,是一個相對危險的形為,所以得進行一些設定。

通用設定檔

如果你覺得設定 Jupyter 很麻煩,我這裡提供一個 設定檔,可以讓你不用手動設定。首先你得安裝 Jupyter:

pip install jupyter

下載設定檔到 /root/.jupyter/:

wget https://gist.githubusercontent.com/amoshyc/9c6f3939aec47e3ff41809931d1f8f64/raw/8224dc93e3a11f9317e4bc41d863ca466681ecd6/jupyter_notebook_config.py -P /root/.jupyter/

然後在你想要的工作資料夾(通常是 /workspace):

jupyter notebook

之後開啟 host OS 的 http://localhost:8888/,登入的密碼是 amoshyc

自定設定檔

產生一個你之後從 host OS 中登入 Jupyter 所需的密碼,好記好打就可以了。啟動 python:

>>> from notebook.auth import passwd
>>> passwd()

輸入你想要的密碼並複製產生的字串(不含那兩個單引號)。

產生設定檔:

jupyter notebook --generate-config

使用 vim 編輯 /root/.jupyter/jupyter_notebook_config.py,請在該檔案加入:

c.NotebookApp.ip = '*'
c.NotebookApp.password = '<your hashed password>'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888

<your hashed password> 填你複製的那個字串。存檔後,你就可以執行:

jupyter notebook

之後在 host OS 的 http://localhost:8888/ 登入並使用 Jupyter 了。

其它常用套件安裝

numpy, scipy 已經預裝好了。這裡我們安裝用來畫圖的 Matplotlib,圖片操作的 Pillow 及 caffe 內建畫出網路 draw_net.py 所需的 graphviz:

apt update
apt install graphviz
pip install matplotlib pillow

==========================================================================================================
http://yuenshome.cn/?p=3164

最近在 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 ps 或 docker 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 ~/caffe 或 cd /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
This entry was posted in 学习笔记·杂 and tagged UbuntudockerCaffe on 2016年5月16日.

Post navigation

← Ubuntu16.04 安装 LaTeXUbuntu 16.04 安装 TensorFlow 遇到的问题及解决 

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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM