在 python3.5 下使用 Caffe

Using Caffe with Python3.5

Posted by Coldmooon on May 15, 2016

一、前言

本文介绍如何在 python3.5 下使用 caffepython 接口。之所以要强调 python3.5 是因为:
1)python3.5 目前是 python3 的最新版;
2)安装方法没官网介绍那么简单,里面暗桩很多。一不小心就遇到不给任何错误提示的情况下程序崩溃。而且python3.5 的安装方法要比低版本的 python3.3/3.4 麻烦。
尽管如此,作为版本控我还是喜欢用新版。所以,经过了大量折腾之后总算找到了让 caffe 兼容 python3.5 的方法。

二、准备工作

我的主机环境是 Ubuntu 14.04 + Anaconda3-4.0。要让 caffe 支持 python3.5 需要下面几样依赖:

  • python3.5
  • protobuf 3.0 或以上版本。
  • libboost 1.55 或以上版本

三、正式配置

1)安装 Anaconda3

点击下载Anaconda3-4.0.0。运行下面的命令进行安装

bash Anaconda3-4.0.0-Linux-x86_64.sh

注意:必须是 Anaconda3-4.0.0 以上版本,旧的 Anaconda3-2.5 版本不行!

2)手动编译和安装 protobuf 3.0 以上版本。

必须是手动编译和安装,用 apt-get 安装的是 2.0 版本,不行。
protobufreleases 页面去下载两个安装包:

  • protobuf-cpp-3.0.0-beta-2.zip 或以上版本;
  • protobuf-python-3.0.0-beta-2.zip 或以上版本。

注意,仔细看 protobuf 的说明。安装 protobuf 需要安装两样东西, 少一样都不行:

  • the protocol compiler;
  • the protobuf runtime

因此, 接下来首先安装 the protocol compilerprotobuf cpp runtime

解压第一个安装包 `protobuf-cpp-3.0.0-beta-2.zip`,并进入解压出来的目录
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.

这样 the protocol compilerprotobuf cpp runtime 就同时编译和安装好了。下面编译和安装 protobuf python runtime:

解压第二个安装包 `protobuf-python-3.0.0-beta-2.zip`,并进入解压出来的目录
$ cd python
$ python setup.py build
$ python setup.py test
$ python setup.py install

这样 protobuf python runtime 就编译和安装好了。注意 protobuf python runtime 是作为 pip 的包安装的。但是你可以从 conda 里面看到它:

$ conda list | grep protobuf
protobuf                  3.0.0b2                   <pip>

出现上面的结果就证明 protobuf3.0 已经安装完成了。

3)安装 libboost
注意,这一步跟官方安装教程不一样,而且是必须的:

sudo apt-get install libboost1.55-all-dev

如果有 1.55 以上版本更好,没有就安装 1.55 版本。接下来做一个关键步骤:

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.55.0 /usr/local/lib/libboost_python3.so

注意: 你安装完 libboost1.55-all-dev 之后,会在系统中存在两个版本的 liboost_python:

  • libboost_python-py33.so.1.55.0
  • libboost_python-py34.so.1.55.0

这里必须选择 libboost_python-py34.so.1.55.0py34 以上的版本。如果你选择了 py33 版本。那么你将在得不到任何错误提示的情况下 python kernel 直接崩溃。就跟 segmentation fault 一样的令你抓狂。我折腾了一整天才发现是 py33 的问题。。。。如下图所示:

img

img

当你在 python 接口中运行任何带有输出功能的代码时,就会得到上面的错误,例如 solver.net.forward()。 而运行 solver.step(1) 这种无输出功能的代码没事。

4)编辑 Makefile.conf 文件,加入对 Anaconda3 的支持

目前官方 caffe 是不支持 Anaconda3 的,必须自己改。所以我发了个 pull request #3869,增加了对 Anaconda3 的支持。具体改动如下:

在 `Makefile.conf` 增加下面的代码, 详细请看 #3869
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                       $(ANACONDA_HOME)/include/python3.5m \
                       $(ANACONDA_HOME)/lib/python3.5/site-packages/numpy/core/include

5) 编译 caffe

make all -j 8
make pycaffe -j 8

四、运行

在终端下运行 jupyter notebook。下面就 enjoy 吧。