Build Caffe from Source on CentO
1、安装依赖库
sudo yum install boost-devel gflags-devel glog-devel hdf5-devel leveldb-devel lmdb-devel snappy-devel numpy protobuf-c-compiler openblas-devel python-devel
如果某些包找不到,可以添加阿里云的yum源,参考 centos 7 添加 aliyun yum 源、epel源
2、编译安装
从https://github.com/BVLC/caffe/下载源码包
1)、配置Makefile.config
cp Makefile.config.example Makefile.config
打开 USE_CUDNN := 1, 支持cuDNN加速。
打开 WITH_PYTHON_LAYER := 1,支持Python Layer。
打开 USE_NCCL := 1,支持多GPU。需要先下载nccl源码, 编译安装。
在Makefile.config中将BLAS改为open,如下:
#BLAS := atlas
BLAS := open
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
BLAS_INCLUDE := /usr/include/openblas
BLAS_LIB := /usr/lib64
找到CUDA_ARCH 位置,如下:
# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 through *_61 lines for compatibility.
# For CUDA < 8.0, comment the *_60 and *_61 lines for compatibility.
# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
根据注释, 注释掉 *21和 *21。如果CUDA在9.0以下则不用注释。
配置python路径,默认如下:
Caffe在运行的时候会调用这个路径下的python包。
如果添加了Python Layer,在运行时报错
ImportError: No module named xxx
,很可能就是因为这个python所指的路径下缺包。有一种情况就是,用户可能搭建可多个python环境,然后用pip list能查到这个包,却仍然报错,那就可能是因为查到的包不是上面路径下的包。
2)、配置Makefile
编译过程中有多处依赖C++11,在Makefile中添加依赖:
CXXFLAGS += -std=c++11 或者CXXFLAGS += -std=gun++11
NVCCFLAGS += -std=c++11
虽然这里添加了C++11的依赖,但是后面编译过程中可能还会出现类似“usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.”的错误,需要在Makefile中找到具体的编译命令添加 C++11依赖。
不要把python配置为Anaconda环境下的python,否则会导致libprotobuf链接时找不到符号。
3)、接下来开始编译
make all -j8
make pycaffe
make distribute
将 distribute目录拷贝到其他目录,并添加进环境变量
设置环境变量,示例
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/tools/distribute/lib
export PATH=$PATH:$HOME/tools/distribute/bin
export C_INCLUDE_PATH=$C_INCLUDE_PATH:$HOME/tools/distribute/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$HOME/tools/distribute/include
export PYTHONPATH=$PYTHONPATH:$HOME/tools/distribute/python
3、注意事项
如果在Caffe源码中添加自定义层,这时往往需要添加一个 param ID。如果你后面要用ncnn转换生成的模型,需要保证Caffe中的 param ID 和 ncnn中的 param ID不冲突。
我在Caffe的caffe-master/src/caffe/proto/caffe.proto中添加shuffle_channel_param ID值为149
image
刚好和ncnn中 ncnn-master/tools/caffe/caffe.proto的 psroi_pooling_param的ID值相同
image
这导致ncnn在转换模型时将shuffle_channel_param转换成 psroi_pooling_param。
解决办法:将这两个文件中的shuffle_channel_param ID值都改为其他不冲突的值, 重新编译。
如果在运行的时候报这个错误:
Check failed: status == CUBLAS_STATUS_SUCCESS (13 vs. 0) CUBLAS_STATUS_EXECUTION_FAILED