最近因为需要跑MobileNetV2-SSDLite的模型,用到的开源代码是基于caffe写的,所以需要在服务器上安装caffe,经过几天的安装与debug,终于安装成功,特此记录。
由于安装的是GPU版本的caffe,需要cuda和cudnn的支持,因为服务器上已经安装好,所以不再重复操作,没有安装好的可以自行上网查找相关教程。然后这里使用的是cuda8.0.61+cudnn5.1.10。
通过创建沙盒环境避免安装caffe过程中安装的包影响到base环境,因为使用python2.7,所以使用以下命令创建一个caffe专用沙盒环境:
conda create --name caffe-py27 python=2.7
进入上一步创建的沙盒环境,根据需要下载官方或经过修改的caffe版本,我这里下载的是weiliu89版本的caffe。
cd ~/anaconda3/envs/caffe-py27/
git clone https://github.com/weiliu89/caffe.git
如果后面要用到SSD,需要在这里使用以下命令以切换到ssd分支:
git checkout ssd
此时应该可以在examples文件夹里面找到一个名为ssd的文件夹。
一开始我直接使用conda install opencv
安装opencv,导致后面出现版本问题,所以最好一开始就指定安装3.1.0版本的opencv。
conda activate caffe-py27
conda install opencv=3.1.0
因为make指令只能make Makefile.config文件,而Makefile.config.example是caffe给出的makefile例子,因此,首先将Makefile.config.example的内容复制到Makefile.config。
cd caffe
cp Makefile.config.example Makefile.config
然后接下来需要对Makefile.config的内容作以下修改:
a.因为需要使用cudnn,所以去掉对应注释:
# cuDNN acceleration switch (uncomment to build with cuDNN).
USE_CUDNN := 1
b.因为使用的opencv版本为3,所以去掉对应注释:
# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3
c.根据cuda版本删去/注释掉CUDA_ARCH :=
这里对应的行
像我的话这里就删去了两行:
-gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
d.因为要使用anaconda,需要注释掉默认使用的python2.7,然后将对应使用anaconda的注释去掉,并将ANACONDA_HOME修改为自己的anaconda地址。
# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
# PYTHON_INCLUDE := /usr/include/python2.7 \
# /usr/lib/python2.7/dist-packages/numpy/core/include
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
ANACONDA_HOME := /home/chenjiarong/anaconda3/envs/caffe-py27
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include
同时需要修改
# We need to be able to find libpythonX.X.so or .dylib.
# PYTHON_LIB := /usr/lib
PYTHON_LIB := $(ANACONDA_HOME)/lib
e.若要使用python来编写layer,可以去掉对应注释:
# Uncomment to support layers written in Python (will link against Python libs)
WITH_PYTHON_LAYER := 1
f.使用Ubuntu的话需要修改以告诉caffe你的hdf5的地址:
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
g.如果后面有error出现try using -rpath or -rpath-link
的提示的话,可以增加:
LINKFLAGS := -Wl,-rpath,$(ANACONDA_HOME)/lib
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换为:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
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
现在完成了前期工作,开始编译caffe:
make all -j8
make test -j8
make runtest -j8
成功的话最后可以看到诸如以下的输出:
[ RUN ] ArgMaxLayerTest/0.TestCPUMaxValTopK
[ OK ] ArgMaxLayerTest/0.TestCPUMaxValTopK (1 ms)
[----------] 12 tests from ArgMaxLayerTest/0 (45 ms total)
[----------] Global test environment tear-down
[==========] 2101 tests from 277 test cases ran. (992402 ms total)
[ PASSED ] 2101 tests.
如果前面切换到ssd分支的话应该会输出:
[ RUN ] Im2colLayerTest/2.TestGradientForceND
[ OK ] Im2colLayerTest/2.TestGradientForceND (3773 ms)
[----------] 8 tests from Im2colLayerTest/2 (33252 ms total)
[----------] Global test environment tear-down
[==========] 2361 tests from 309 test cases ran. (719642 ms total)
[ PASSED ] 2361 tests.
至此就说明caffe编译成功了。
编译pycaffe
make pycaffe -j8
加入环境变量
echo export PYTHONPATH="/home/chenjiarong/anaconda3/envs/caffe-py27/caffe/python" >> ~/.bashrc
保存退出
source ~/.bashrc
进入caffe环境
conda activate caffe-py27
打开python
python
导入caffe
>>>import caffe
若不报错则表示caffe的python接口已正确编译,当然通常不会这么好运,这是我导入时出现的错误:
ImportError: No module named skimage.io
所以使用
conda install scikit-image
再次导入,出现错误:
AttributeError: 'module' object has no attribute 'nancumprod'
猜测还是因为一些依赖库没有安装,直接使用:
conda install cython scikit-image protobuf scikit-learn ipython pandas jupyter tqdm lxml pillow
一股脑将所有依赖库统统给安装了,那其实前一步直接使用这个就行了。。。
然后可以验证一下:
python -c "import caffe;print caffe.__version__"
我这里输出的是1.0.0(前面切换到ssd分支的话这里输出1.0.0-rc3),终于成功安装了caffe!!!