我的AI之路(3)--安装Caffe

      安装Caffe之前得安装好支持环境,你可以在Linux下一个个地安装那些编译支持库包,但是那样太麻烦了,Anaconda提供了完整的支持库,下载Caffe源码后编译前修改配置文件,把支持库改为Anaconda的路径即可轻松build,省去按照出错提示一步步安装很多支持库的麻烦。

      最新的Anaconda 5.1 支持Windows、MacOS和Linux,有Python 2.7 version和Python 3.6 version两个版本,分别支持Python 2.7和Python 3.6, 我使用的是64-bit Fedora Linux,并且我打算使用Python 3.6(我觉得Python 3.6的语法上比Python 2.7上更符合一般编程语言的语法描述习惯,另外Python 2.7在2020年将停止支持,所以建议还是使用Python 3.6),因此下载https://repo.anaconda.com/archive/Anaconda3-5.1.0-Linux-x86_64.sh到本地,然后执行 

bash Anaconda3-5.1.0-Linux-x86_64.sh

即可把 anaconda3安装到/home/<username>下,如果你习惯使用Python 2.7,可以下载https://repo.anaconda.com/archive/Anaconda2-5.1.0-Linux-x86_64.sh并安装,安装完后会生成 /home/<username>/anaconda2,所以两个版本实际上是可以同时安装的,并不会冲突,在编译caffe等软件时根据你使用的版本的需要,修改路径配置,指向所需的ananconda版本即可。

      安装好了anaconda3,再安装一些caffe的运行依赖包,Fedora/CentOS/RHEL linux下需安装这些:

     sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel openblas-devel gflags-devel glog-devel lmdb-devel

      对于Ubuntu,还需要安装git和python-dev, protobuf-compiler, 以及以上的库的名字前面须加前缀lib,devel改成dev,再就是libhdf5-serial-dev, libgoogle-glog-dev这几个包名跟Fedora下不一样。

安装完了依赖环境,下面下载Caffe源码。

一般书上推荐使用的git clone https://github.com/bvlc/caffe.git 命令很难把Caffe源码一次性下载下来,我两天内不同时段试了好几次都没成功,老是中途下载中断,于是参考了网上推荐的办法:

      cd /home/<username>/

      mkdir caffe   #创建一个下载的工作目录

     cd caffe

     git init           #创建git本地库

     git fetch https://github.com/bvlc/caffe.git

     如果中途下载中断,可以重复执行上面这个git fetch https://github.com/bvlc/caffe.git命令,虽然使用git fetch每次重新开始下载时也是从0%开始下载,但是前面下载过的部分的速度明显很快,我估计是并没有下载数据而是在核对本地已下载的数据和git repo里的数据,已经下载了就不再重传,因为中断之前已经下载的部分的进度比较快,比如说中断前已经下载了19%,再次执行上面的git fetch https://github.com/bvlc/caffe.git 命令,虽然进度仍然从0%开始,但是很快就达到了19%,然后后面下载的进度就慢了一些,应该就是在真正下载后面的未下载的数据了,我下载时中断了几次,重复执行git fetch命令终于成功下载完全部代码,全部下载完后显示 HEAD   ->FETCH_HEAD,然后执行

    git checkout FETCH_HEAD

可以看到/home/<username>/caffe/下面有了很多源码目录。

接下来以caffe提供的示例配置文件为基础创建配置文件:

cp Makefile.config.example Makefile.config

vi Makefile.config


在这个文件中,做如下修改:

CPU_ONLY := 1  #把这前面的注释去掉,先只使用CPU,对于使用GPU,后面熟练了再回头来安装CUDA后打开。

OPENCV_VERSION := 3  #把这前面的注释去掉,我使用最新的opencv3,没办法,我啥都喜欢用最新的版本尝鲜大笑

BLAS := open  #把这里的atlas改为open,意思是使用OpenBlas,因为它的性能比atlas好,几乎接近Intel的MKL并且是开源的


把指向Linux系统本身环境Python 2.7的PYTHON_INCLUD注释掉:

# PYTHON_INCLUDE := /usr/include/python2.7 \
#               /usr/lib/python2.7/dist-packages/numpy/core/include

设置NANCONDA_HOME和指向ANACONDA里的PYTHON_INCLUDE, PYTHON_LIB:

ANACONDA_HOME := $HOME/anaconda3
PYTHON_INCLUDE := $ANACONDA_HOME/include \
                $ANACONDA_HOME/include/python3.6m \
                $ANACONDA_HOME/lib/python3.6/site-packages/numpy/core/include

# Uncomment to use Python 3 (default is Python 2)

PYTHON_LIBRARIES := boost_python3 python3.6m

注意保持把指向Linux系统本身环境里的PYTHON_INCLUDE和PYTHON_LIB路径设置注释掉,确保使用anaconda3里面的python

# PYTHON_INCLUDE := /usr/include/python3.6m \
#                 /usr/lib/python3.6/dist-packages/numpy/core/include
# PYTHON_LIB := /usr/lib
PYTHON_LIB := $ANACONDA_HOME/lib

# Whatever else you find you need goes here.
INCLUDE_DIRS := $PYTHON_INCLUDE /usr/local/include

LIBRARY_DIRS := $PYTHON_LIB /usr/local/lib /usr/lib

注意:以上标红色的部分原来都是使用的 $(var)形式取值, 必须改成 $var或者${var}形式,否则后面执行make runtest时总是报错,一些so库找不着,实际上是存在的,上面的路径设置也正确,但是$(x)是执行x命令而不是获取变量x的值,导致出错!这问题也是让我没少喝茶睡觉,后来回头仔细看Makefile.config,发现企图以这$()种形式取值是错误的,原因就在这里敲打


多说一点,如果是Ubuntu,还得修改Makefile:

找到
LIBRARIES +=glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
更改最后两项为:

LIBRARIES +=glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

这是因为Ubuntu下使用的包是libhdf5-serial-dev,如果不做以上修改,下面在运行 make runtest 时会报错:

make runtest
.build_release/tools/caffe
.build_release/tools/caffe: error while loading shared libraries: libhdf5_hl.so.10: cannot open shared object file: No such file or directory


Makefile.config配置文件建立和修改完毕后,执行下面的命令编译Caffe源码:

 make -j    # -j 使用多个CPU核同时编译,比不使用多核编译要快,没错误的话,在我本子上没几分钟就编译完了

这时可能报错: g++: command not found

这是因为gcc-c++没有安装,执行下面命令安装:

sudo yum install gcc-c++

然后执行 

make -j

Caffe编译完后执行

make test

make runtest

假若执行make runtest时报错:

libhdf5.so, libhdf5_hl.so.100: cannot open shared object file: No such file or directory

这说明你忘了修改Makefile.config里面的$(var),所有$(var)形式取值, 必须改成 $var或者${var}形式

改完后然后再执行:

make clean

make -j

make test

make runtest

没有错误的话则很多test case显示OK:


最后显示全部test cases的运行结果:


O了,后面有什么问题遇到再补充,修行取经路上妖魔鬼怪多着,后续路上一一除掉得意

猜你喜欢

转载自blog.csdn.net/XCCCCZ/article/details/80299784