贫僧终于沦落到要去配置Caffe
了。。。用的python
版本还是3。。。
准备
先写出个目录:
1. 安装依赖包(贫僧在实际安装的时候跳过了这一步,因为之前已经安装过了)
2. 安装caffe
3. 安装pycaffe
4. bug
安装依赖包
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
验证安装成功的方法:
再运行上面的指令一次,看看有没有“已经是最新版”之类的提示,有的话就成功了。
安装依赖包这部分内容参考了这篇文章,因为之前装过所以贫僧这次没有再装一次。
安装caffe
在你想安装的路径下运行这行指令(这里贫僧就是在~目录下运行的):
git clone https://github.com/BVLC/caffe.git
然后:
$ cd ~/caffe # 不一定是~/caffe,这里的路径换成你安装的路径
在编译之前要编辑Makefile.config,直接复制caffe目录下的Makefile.config.example(这是caffe给出的配置文件例子,复制然后更改可以省很多时间)并改成这个名字:
$ sudo cp Makefile.config.example Makefile.config
Makefile.config内容
这里直接放贫僧的修改过的内容了,因为贫僧把opencv安装在了虚拟环境里面,而且要用到python3,所以改了python相关的路径(PYTHON_INCLUDE
和PYTHON_LIB
,改成了创建好了的cv
虚拟环境相关的路径)。如果opencv就安装在系统的python里面的话应该不用改太多东西的。
# cuDNN acceleration switch (uncomment to build with cuDNN).
USE_CUDNN := 1
# 贫僧修改了这里,删掉了注释符
# uncomment to disable IO dependencies and corresponding data layers
USE_OPENCV := 1
# 贫僧修改了这里,删掉了上一行的注释符
# USE_LEVELDB := 0
# USE_LMDB := 0
# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3
# 贫僧修改了这里,删掉了上面的前面的注释符
# 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_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
#贫僧删掉了上面的这两行:-gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
# 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
# Uncomment to use Python 3 (default is Python 2) # 贫僧修改了这里,删掉了下面的注释(因为要用到python3)
PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/tank/.virtualenvs/cv/include/python3.5m \
/usr/tnak/.virtualenvs/cv/lib/python3.5/site-packages/numpy/core/include
# Uncomment to support layers written in Python (will link against Python libs)
WITH_PYTHON_LAYER := 1
# 贫僧删掉了上面的注释符
# Whatever else you find you need goes here.
# 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
# 贫僧修改了上面这行的内容
然后再改下Makefile:
将:
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
根据这篇博文的说法还要修改/usr/local/cuda/include/host_config.h
,但是可能是因为贫僧用了cuda9.1,所以这个文件里面并没有#error-- xxx省略xxx
的注释,所以就没有修改。
编译(记得把数字改成你的电脑的核心数目):
make all -j 4
如果不记得核心数的话直接用下面这个也行(推荐用这个):
make all -j $(($(nproc) + 1))
编译成功之后就可以进行测试了:
sudo make runtest -j 4
然后要编译pycaffe:
sudo make pycaffe -j 4
编译成功了就基本上没什么问题了。。。可能会出现一两个错误,这种错误要么是因为cuda程序员引入了新的bug(真遇到过。。。),要么就是偶然出现的(Torch里面遇到过)或者是别的原因。如果遇到这种情况就跑多1~2次,如果情况消失了那么很可能只是偶然的,是测试程序设计的问题,如果是遇到了这种情况:
那么就一定是cuda9.1的锅了。。。
cuda9.1引发的血案的解决方法:
修改caffe目录下的Makefile:
将:
# Debugging
ifeq ($(DEBUG), 1)
COMMON_FLAGS += -DDEBUG -g -O0
NVCCFLAGS += -G
else
COMMON_FLAGS += -DNDEBUG -O2
endif
改成:
ifeq ($(DEBUG), 1)
COMMON_FLAGS += -DDEBUG -g -O0
NVCCFLAGS += -G
else
COMMON_FLAGS += -DNDEBUG -O2
NVCCFLAGS += -G
endif
然后重新编译:
make clean && make all -j 4 && sudo make runtest -j 4 && sudo make pycaffe -j 4
可能遇到的bug
使用Python3编译PyCaffe时出现的bug
贫僧在编译PyCaffe
的时候遇到了这个bug:
/usr/bin/ld: cannot find -lboost_python3 pycaffe
问题出现原因(参考了这篇文章):
caffe
默认是python2.7
,而python2.7
有lboost_python2
,python3
没有,所以要用ubuntu
自带的python3
来建立一个软连接,不过要注意对应的python
版本号。
解决方法:
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py35.so /usr/lib/x86_64-linux-gnu/libboost_python3.so
没有caffe模块
这是在python交互界面里面触发的:
>>> import caffe
输出:
...略略略
ImportError: No module named caffe
这是因为没有把pycaffe路径添加到环境变量里面,所以只需要改改~/.bashrc
就可以解决了:
export PYTHONPATH=/home/ubuntu/caffe/python:PYTHONPATH
记得要用绝对路径,如果是用了~/
之类的相对路径的话可能会用不了。如果别的用户要用caffe的话添加这个路径就可以用了。
没有skimage模块
还是import的时候出现的错误:
ImportError: No module named 'skimage'
这个比较好解决,只需要pip安装一下这个模块就可以了:
pip install -U scikit-image
然后基本上就可以开始愉快地import了。。。
Pycharm中import caffe的方法
现在配置好了之后在pycharm里面是没有办法直接import caffe的,因为pycharm不能够读取~/.bashrc来确定caffe的位置,所以这时候就需要手动添加搜索库的地址。因为已经有人写了所以就不详细讲,内容来自这里的问答。
打开项目翻译器设置,点那个齿轮图案的按钮,选show all
,然后选中要设置的翻译器,再点面板右边最下面的那个按钮
把caffe的路径(这里的话就是/home/ubuntu/caffe/python和/usr/local/lib/python3.5/dist-packages)添加进去:
这样就可以import caffe
了。。。
参考资料
Ubuntu16.04 Caffe 安装步骤记录(超详尽):很推荐看,基本上这篇文章的大部分东西都是参考这篇博文的,虽然比较旧了。。。
virtualenv 下安装caffe教程:这个博主很有个性。。。内容太简略了。。。如果要把caffe装到virtualenv的话可以参考