Build Caffe from Source on CentO

2019-03-15  本文已影响0人  菜鸟瞎编

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路径,默认如下:

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

就把这几个patch安装了 https://developer.nvidia.com/cuda-90-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal

上一篇下一篇

猜你喜欢

热点阅读