caffe学习(一)caffe + centOS 6.5 + CUDA 6.5配置

caffe应该是当下最火的深度学习开源框架了,其性能强大,每天可以处理60M的图片(K40显卡),测试一张图片只要1ms,而且其模块都已经定义好,不需要写什么代码就能轻松调用,虽然是c++开发的却能很好的支持python,简直不能更赞。

开发环境

虽然它这么好用,安装它可不是一个省心的事,最好的参考资料还是官网安装资料http://caffe.berkeleyvision.org/installation.html,配置之前先介绍一下自己的软硬件环境

  • 显卡K20c(没显卡也能玩caffe)
  • Linux服务器版本centOS6.5(版本有点低,这有点坑,系统自带的python是2.6版本,cmake是2.6版本,这都给安装带来了不便,由于是服务器没得选,只能硬着头皮上了,而且网上多是基于Ubuntu系统的配置,所以更要把安装过程记录一下)
  • python升级到2.7版本,再把cmake升级到2.8版本,我都是下载的源代码安装的,要注意的是安装好之后还要将原来版本移除掉并链接到新版本,如下

    mv /usr/bin/python /usr/bin/python_old
    ln -s /usr/local/bin/python2.7 /usr/bin/python

  • 安装numpy1.9.2版本,也是官网源代码

安装CUDA和MKL

我使用的是CUDA 6.5版本,并且通过edu邮箱申请了一个MKL的student版本。这两个都是商业软件,问题比较少,安照网上的资料很容易就配置好了。

依赖库安装

按照官网说法,先试了一遍

sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel

但是有几个包是不行的,protobuf-devel, leveldb-devel, hdf5-devel找不到,由于我服务器版本比较低,boost和boost-devel都只有1.41版本,注意要把boost也升级一下。protobuf是谷歌开发的一种实现内存外存交换的协议接口,再这个统一的通讯协议下不同开发者可以使用自己喜欢的方式进行模型参数的管理。

首先先把protobuf, leveldb, hdf5, boost高级版本的tar包下载下来解压并用make和make install安装起来,然后下载其分别对应的devel的rpm安装,并通过rpm命令安装:

rpm -i xxx.rpm

安装OpenCV

安装了这么多年OpenCV,头一次遇到这么大坑,先尝试了大家推荐的shell一键安装

git https://github.com/ouxinyu/Install-OpenCV-master
cd Install-OpenCV-master/RedHat
./opencv_latest.sh

看上去一切很美,但是执行downloading ippicv_linux_20140513.tgz这个文件的时候就怎么都过不去了,没能解决,于是还是乖乖的安装官网的教程去下载了一个OpenCV 2.4.9的tar解压安装,安装过程也是安装OpenCV官方的教程来的,但是由于要使用其中的GPU模块,原本预想很顺利的安装过程出了error,查了资料发现是OpenCV的bughttp://code.opencv.org/issues/3814,拷贝文件NCVPixelOperations.hpp替换掉源文件,重新build make,搞定

cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

cd ..
make
sudo make install

安装caffe

复制一个配置文件先

cp Makefile.config.example Makefile.config

把里面的CPU_ONLY,BLAS,PYTHON_DIR目录都按照情况配置好,然后执行

make all -j8
make test -j8
make runtest -j8

-j8选项可以提高编译速度,不是必须的,如果在runtest时候一片绿色,没报错,恭喜,说明caffe已经配置好了,可以愉快的使用了。

测试MNIST

进入到caffe根目录下,执行如下操作

./data/mnist/get_mnist.sh               # 下载minst数据库
./examples/mnist/create_mnist.sh        # 把数据转成lmdb格式
./examples/mnist/train_lenet.sh         # 训练mnist

从输出结果看到,test集上得到99.2%的正确率,还是很不错的。

其他说明

pycaffe配置

  • 由于我这里python没配置好,所以make pycaffe没能通过,有待解决。
    解决方案,下载Anaconda-2.3.0-Linux-x86_64.sh,下载后运行,
    直接把python升级到2.7版本,同时安装好了所有相关依赖包,简直完美啊,,解决了python2.6和2.7共存的问题,同时一键安装python和相关插件,并且配置好了相关环境变量,同时还是64位版本的python,强烈推荐。
    修改Makefile.config中和python相关内容

    PYTHON_INCLUDE := /root/anaconda/include/python2.7 /root/anaconda/lib/python2.7/site-packages/numpy/core/include/
    PYTHON_LIB := /root/anaconda/pkgs/python-2.7.10-0/lib
    INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
    LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

执行

make pycaffe

编译成功了,简直酸爽。
最后配置一下环境变量

export PYTHONPATH=/root/caffe_test/caffe/python:$PYTHONPATH

python环境下

import caffe

报错信息

from ._caffe import Net, SGDSolver
ImportError: /usr/local/lib/libboost_python.so.1.58.0: undefined symbol: PyUnicodeUCS2_FromEncodedObject

anaconda只差boost没有包含,而是我安装的boost版本1.58跟anaconda要求的1.57版本,重新安装一遍boost 1.57

# download boost_1_57_0.tar.bz2
tar xvf boost_1_57_0.tar.bz2
cd boost_1_57_0
./bootstrap.sh
./b2
./b2 install /usr

记得安装完boost一定要yum install boost-devel一下(血和泪的教训)
出现新的错误,说no module name google.portobuf,重新安装protobuf和protobuf-devel并没有解决这个问题,上网上重新下载protobuf2.6.1版本,弄错了是不行的。解压后,

./autogen.sh
./configure
make
make check
make install

出错loading shared libraries: libprotobuf.so.8: cannot open shared object file: No such file or directory,此时应该是连接出错
locate libprotobuf.so.9 看下libprotobuf.so.9的确存在/opt/protobuf/lib下面

cd /etc/ld.so.conf.d/
vi protobuf.conf   # protobuf.conf中只要加入一行: /opt/protobuf/lib
ldconfig

安装protobuf的python模块

cd python
python setup.py build
python setup.py test
python setup.py install

python setup.py build的过程中可能报几个错,然而没关系,我们并不需要所有的protobuf的模块,配置pycaffe最重要的就是注意anaconda和依赖包版本的对应,boost要求1.57版本,protobuf是2.6.1版本,弄错了是不行的。

  • cuDNN的加速模块也没有安装测试一下,有空再配置一下。