最近一段时间在深度学习框架caffe,看了它官方的文档和一部分代码,结合以前一些基本的神经网络知识,算是有了个大概的认识。在自己本机上ubuntu14.04上很容易配置好caffe的依赖环境,下载了一个训练好的ImageNet分类模型,写了几个python小脚本跑起来做图像分类。目前跑了10W多张,从所分类别的结果看,还不错,但要进一步验证准确性,就需要投入一些人力去辨别了,而辨别前,需要搭建一定的环境进行开发,于是,开始了折腾之旅。
按照caffe官方的installation指南,caffe依赖于一下几个包:
· CUDA library version 6.5 (recommended), 6.0, 5.5, or 5.0 and the latestdriver version for CUDA 6 or 319.* for CUDA 5 (and NOT 331.*)
· BLAS (provided via ATLAS, MKL, or OpenBLAS).
· OpenCV.
· Boost (>= 1.55, although only 1.55 and 1.56 are tested)
· glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb
· Python 2.7, numpy (>= 1.7), boost-provided boost.python
· MATLAB with the mex compiler.
但其实CUDA和MATLAB不是必须的,caffe支持仅用CPU处理。于是就需要安装剩下的几个包。
公司服务器的源里有BLAS包,但也折腾了一下。
OpenCV 2.4.9
先是安装了源里的OpenCV,但看了下头文件,应该是2.0版本之前的,而caffe中用的C++的接口Mat,所以只能自己编译了。
编着编着,Error跳了出来:
No rule to make target `/lib64/libz.so', needed by `lib/libopencv_core.so.2.4.9'
搜了下,是要安装zlib。
然后又是cblas.h找不到,安装blas-devel包。
源里没有gflags-develglog-devel lmdb-devel这几个包,手动安装如下:
# glog
wgethttps://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make && make install
# gflags
wgethttps://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake.. && make VERBOSE=1
make && make install
# lmdb
git clone git://gitorious.org/mdb/mdb.git
cd mdb/libraries/liblmdb
make && make install
其中gflags的时候,cmake版本太低,又手动编译了cmake 2.8。。
接下来就是编译大头了:OpenCV 2.4.9。这个库确实大了些,大概有2.5G左右,编译过程中几次因为空间不足而编译停止,时间基本都花在这上面了。不得不看下编译选项,先把能关的都关了,实在不行就不编译一些包,毕竟也只是用到少数的一部分核心函数而已。下面是编译OpenCV时遇到的问题:
error: unable to find a register to spill inclass 'GENERAL_REGS'
用stackoverflow上的这个方法可以解决。
[ 92%] Generating pyopencv_generated_funcs.h, pyopencv_generated_func_tab.h, pyopencv_generated_types.h, pyopencv_generated_type_reg.h, pyopencv_generated_const_reg.h
File "/usr/home/wanglei23/build/opencv-2.4.9/modules/python/src2/gen2.py", line 815
cname1=("cv::Algorithm" if classinfo.isalgorithm elseclassinfo.cname)))
^
SyntaxError: invalid syntax
make[2]: *** [modules/python/pyopencv_generated_funcs.h] Error 1
make[1]: *** [modules/python/CMakeFiles/opencv_python.dir/all] Error 2
make: *** [all] Error 2
想想应该是Python版本问题,默认版本是2.4.3,升级到2.6,在编译时指定Python的一些信息(感谢Stackoverflow),另外为了节省空间,关闭了一些选项,于是生成Makefile的命令就成了:
env CC=/usr/bin/gcc44 CXX=/usr/bin/g++44 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/ -D BUILD_PYTHON_SUPPORT=ON -D PYTHON_EXECUTABLE=/usr/bin/python2.6 -D PYTHON_INCLUDE=/usr/include/python2.6/ -D PYTHON_LIBRARY=/usr/lib64/libpython2.6.so -D PYTHON_PACKAGES_PATH=/usr/lib/python2.6/site-packages/ -D PYTHON_NUMPY_INCLUDE_DIR=/usr/lib/python2.6/site-packages/numpy/core/include/ -D BUILD_TESTS=NO -D BUILD_PERF_TESTS=NO ..
折腾了好久,编译到92%时就开始担心会不会再次出现空间不足的问题,我的目录已经都清空了!!如果还有问题,要么找老大多分点空间,要么精简OpenCV,好在最后终于跳出了100%,舒了一口气~~
依赖解决了,最后也就是要编译caffe了。下面是遇到的问题:
./include/caffe/util/io.hpp:9:21: error:hdf5_hl.h: No such file or directory
src/caffe/layers/hdf5_data_layer.cpp:14:21: error: hdf5_hl.h: No such file ordirectory
src/caffe/layers/hdf5_output_layer.cpp:4:21: error: hdf5_hl.h: No such file ordirectory
其间遇到个问题:hdf5.h和hdf5_hl.h,一个头文件(忘了是哪个了。。)包含了这两个,但include文件夹只有hdf5.h,看了下hdf5_hl.h就是hdf5.h的精简版,果断注释之,编译安装通过,后续应该不会有什么影响。
有点想不通,为啥会加两个这样的头文件呢?
之后又是boost库版本过低,升级吧,唉。。。
好不容易将caffe编译好,跑了几个自带的测试,终于没问题了,但编译Python接口时又出现了问题,编译是能通过的,但import就出错segmentation fault,查了好久原因,原来是用pip install numpy竟然装到了/usr/lib64目录下的Python中,而/usr/lib下的Python中也有numpy,于是冲突,想了想就把pip安装的卸载了,编译好后终于没问题了,但又陷入了其他依赖库的问题中,egg pain啊!caffe自带的python接口依赖于scikit-image,而scikit-image又依赖于比较高版本的numpy,我是真不想折腾numpy了,于是就先这样吧,至少C/C++编译出来也测试通过了,先用着。
看了下scikit-image在caffe的python接口的作用,貌似就是读入图像并转换成float类型,还用到个resize,看能不能修改下,用Image库来完成,如果可以到时可以提交个PR~~
今天和同事聊这个库,他说网上流传这个库难装,我确实体会到了,在自己的机子上倒没什么问题,但到了比较陈旧的服务器上,问题就来了,简单总结下,就是在服务器上安装时,先把基本的软件升级,比如gcc、python、cmake什么的,然后安装比较基本的库,如boost和OpenCV等其他的一些依赖,最后在编译caffe,编译时尤其要注意Makefile.conf里面的一些配置,改成自己实际安装的位置,我是绕来绕去把自己都绕晕了。。。caffe难装归难装,贵在好用啊,模块结构清晰,只需要写个深度学习的结构配置文件,就可以用了,还是非常方便的~~继续好好研究研究,不仅是深度学习框架方面的,代码规范方面的也可以多多学习~~~