参考文章:https://www.jianshu.com/p/0cad02ad323b
首先确保CUDA,CUDNN已经安装配置好
1. 创建虚拟环境:
conda create –n fdpy2 python=2.7 (我的虚拟环境名为:fdpy2)
2.安装基础库:
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install git cmake build-essential
3.安装protoc
命令 whereis protoc可以查看哪些路径下安装了protoc
命令which protoc可以查看默认选用protoc的路径
命令 protoc --version可以查看当前protoc版本
系统默认的protobuf路径为/usr/bin/protoc
4. 安装 caffe
首先在你要安装的路径下 clone :
git clone https://github.com/BVLC/caffe.git
进入 caffe ,将 Makefile.config.example 文件复制一份并更名为 Makefile.config ,也可以在 caffe 目录下直接调用以下命令完成复制操作 :
cd caffe
sudo cp Makefile.config.example Makefile.config
sudo gedit Makefile.config
4-1:
修改Makefile.config:
(1)USE_CUDNN := 1
(2)USE_OPENCV := 1
(3)OPENCV_VERSION := 3
(4)CUDA_DIR := /usr/local/cuda
(5)如果是CUDA-9.0的话,则将20和21的算力去除,如下:
CUDA_ARCH := -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
(6) 注:此处为指定虚拟环境下python包的路径,而不是大环境下的python
ANACONDA_HOME := $(HOME)/anaconda2/envs/fdpy2
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include
假如虚拟环境是python3.6版本的:
ANACONDA_HOME := $(HOME)/anaconda2/envs/py3
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python3.6m \
$(ANACONDA_HOME)/lib/python3.6/site-packages/numpy/core/include
并将 PYTHON_LIBRARIES := boost_python-py35 python3.6m 打开,修改成这样(系统中只有boost_python-py35,没有boost_python-py36),重点:同时将找到虚拟环境中的libpython3.6m.so文件,复制到/usr/lib/x86_64-linux-gnu下;确认/usr/lib/x86_64-linux-gnu下的libboost_python-py35.so的文件存在,如果不存在py35后缀,而存在别的py3*文件,如libboost_python-py34.so,则修改Makefile.config中的PYTHON_LIBRARIES修改为boost_python-py34 python3.6m。
(7) PYTHON_LIB := $(ANACONDA_HOME)/lib
(8) WITH_PYTHON_LAYER := 1
(9)替换以下两行
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
将上两行换成下面:
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
(10) BUILD_DIR := build
(11) TEST_GPUID := 0
(12) Q ?= @
(13)在最后添加: LINKFLAGS := -Wl,-rpath,$(HOME)/anaconda2/envs/py3/lib
4-2:
修改Makefile:
sudo gedit Makefile
(1)将下面一行替换成下面一行
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
(2) 指定protoc路径
$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
改为下面:
$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
(3)
将这行
#NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
修改如下:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
注意:假如你是在python3的虚拟环境下配置caffe的话,还应将Makelfile的215行左右的PYTHON_LIBRARY := boost_python python2.7 修改为 PYTHON_LIBRARY := boost_python python35 (当你的python为python3.6时)
5.编译caffe:
make all -j4
make test -j4
make runtest -j4
make pycaffe
6.拷贝编译后的libcaffe.so 至配置caffe所在的虚拟环境
(1)在caffe所在目录的caffe/python目录下,执行cp -rf caffe/ ~/anaconda2/envs/fdpy2/lib/python2.7/命令,这一步命令将python包拷贝至虚拟环境目录;
(2)在caffe所在目录的build 目录下,执行cp -rf lib/ ~/anaconda2/envs/ fdpy2/lib 命令,这一步将caffe中相关库拷贝至虚拟环境目录。
激活虚拟环境:source avtivate fdpy2,然后在python 下import caffe
(3)
若果提示ImportError: No module named caffe,需要把caffe下的Python路径导入环境变量中去。sudo vim ~/.bashrc,最后一行加上export PYTHONPATH="/home/lz/Documents/caffe/python:$PYTHONPATH",export LD_LIBRARY_PATH=/home/lz/Documents/caffe/build/lib:$LD_LIBRARY_PATH这里的路径写上你自己的路径,记得source ~/.bashrc。否则的话只能在这个目录下执行Python,导入caffe了。
其实(1)(2)步做好了等同于做第三步,这样就可以在多个不同的python虚拟环境下使用caffe了
报错提示can not find module skimage.io,安装scikit-image,conda install scikit-image
报错提示No module named google.protobuf.internal,安装protobuf,pip install protobuf
make runtest 时报错提示Check failed: status == CUBLAS_STATUS_SUCCESS (13 vs. 0) CUBLAS_STATUS_EXECUTION_FAILED 解决:不要多个终端在跑或者编译,只留这个终端编译即可编译通过
1. 报错 nvcc fatal : Unknown option ‘fPIC’
解决:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
在-Xcompiler前少了一个空格
2. 报错 PyErr_Print’未定义的引用; Py_NoneStruct等未定义,修改如下,问题解决
解决:
PYTHON_LIBRARIES := boost_python-py35 python3.6m (我的python是3.6的)
3. 报错 F0104 17:15:55.187031 27536 math_functions.cu:42] Check failed: status == CUBLAS_STATUS_SUCCESS (13 vs. 0) CUBLAS_STATUS_EXECUTION_FAILED
解决:这个错误一般是出在make runtest期间,可停掉其他终端的进程,等一会再 make runtest即可通过
4. 报错
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
/usr/bin/ld: cannot find -lboost_python3
collect2: error: ld returned 1 exit status
Makefile:510: recipe for target 'python/caffe/_caffe.so' failed
解决:boost配置问题
PYTHON_LIBRARIES := boost_python-py35 python3.6m。重点:找到虚拟环境中的libpython3.6m.so文件,复制到/usr/lib/x86_64-linux-gnu下;确认/usr/lib/x86_64-linux-gnu下的libboost_python-py35.so的文件存在,如果不存在py35后缀,而存在别的py3*文件,如libboost_python-py34.so,则修改Makefile.config中为boost_python-py34。