caffe
编译
环境
- Ubuntu16.04
- CUDA10
- cuDNN
- gcc 5.4
- g++ 5.4
大前提!!
在服务器上面装,但是没有sudo权限,所以依赖的包都只能装在自己用户下的conda环境里
- 按理来说这个要求应该不少吧。。但是搜出来一大堆博客都是要sudo权限,动不动就卸载、升级。。做不到啊。。只能各种在conda里删删减减。。真的好艰难!!
github下载caffe源码
BVLC/caffe
依赖
anaconda3
装好之后,新建环境,最好用python2.7。下面都是装在这个新建的conda环境里,所以要注意先进入该环境!
在caffe/python目录下
pip install -r requirements.txt #requirements.txt
在conda的环境中装必要的包
我装的版本
python2
,opencv3
版本一致很重要!
由于我是在conda环境下的,还是装一下cudatoolkit:
[!重要] 要和本机装的CUDA的版本一致!! 包括后面的子编号!我之前只看到conda装的cudatoolkit是10,本机的CUDA也是10,就认为一致,但其实本机的CUDA是10.0.x,conda默认装了最新的 cudatoolkit是10.1.x,后来卸载掉conda装的高版本,重新装10.0.x版本的cudatoolkit才行
- conda装 cudatoolkit 一般默认会装好cudnn,可以用 conda list | grep 'cu' 查看
装OpenBLAS
从源码安装
git clone https://github.com/xianyi/OpenBLAS.git cd OpenBLAS make FC=gfortran -j $(($(nproc) + 1)) make PREFIX=~/Openblas install echo 'export LD_LIBRARY_PATH=/home/shaoxiaowen/Openblas/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
[可选]如果要用matcaffe
装matlab,在linux下装完之后要激活,因为是用学校买的正版产品,需要用桌面环境打开安装程序。。
VNC用gnome桌面好难。。一直不出来terminal,最后还是改用xfce4桌面 照抄别人的配置。。终于激活上了!配置文件放在 ~/.vnc/xstartup
#!/bin/sh x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & session-manager & xfdesktop & xfce4-panel & xfce4-menu-plugin & xfsettingsd & xfconfd & xfwm4 &
修改源码的编译配置
修改Makefile.config,按照自身设备的条件
使用cuDNN,将USE_cuDNN 这一句的注释去掉
使用opencv3,将OPENCV_VERSION := 3 的注释去掉
BLAS 改为 open ,并且设置具体的include和lib路径,要具体到include文件夹 lib文件夹!
ANACONDA_HOME 这一句的注释去掉,改为自己的conda环境的路径
PYTHON_INCLUDE 和 PYTHON_LIB:把原本路径在系统下的那句注释掉,去掉ANACONDA_HOME下PYTHON_INCLUDE PYTHON_LIB 的注释
WITH_PYTHON_LAYER 这一句的注释去掉
使用matcaffe,把 MATLAB_DIR 这一句的注释去掉,改为MATLAB所在路径
LIBRARY_DIRS 添加 /usr/lib/x86_64-linux-gnu
根据CUDA版本注释一些 arch
修改Makefile
报错
tips
caffe源码的github仓库下的issue是个好东西,关键字search用起来! https://github.com/BVLC/caffe/issues
==不用CMAKE,直接MAKE==
[LATEST!!]
make all -j32
报错要用c++11
- 解决:在Makefile里,不仅要改CXXFLAGS, NVCCFLAGS也要改,还有LINKFLAGAS,在FLAGS后 += -std=c++11,https://github.com/BVLC/caffe/issues/6359
原来一直没装上opencv
- https://zoesxw.github.io/2018/07/14/caffe%E5%AE%89%E8%A3%85/
- THANK GOD!!救我狗命!!
报错没有 boost_python
- 解决:改Makefile,boost_python 改为 boost_python27
- https://stackoverflow.com/questions/49961216/pycaffe-build-fails-lboost-python-not-found
报错mexext command not found
- 解决:改Makefile.config,MATLAB_DIR 要改为mexext在的父路径
- 比如这里的mexext,在 /usr/local/MATLAB/R2019a/bin,则MATLAB_DIR=/usr/local/MATLAB/R2019a
报错 缺乏一些OpenCV的lib
缺乏 libpng.16.so
解决:
按照帖子下面的两个方法都尝试,
https://stackoverflow.com/questions/31962975/caffe-install-on-ubuntu-for-anaconda-with-python-2-7-fails-with-libpng16-so-16-n
1,其实是lib的依赖库没有添加到路径!改Makefile.config, 添加到LIB_DIR里面
用 ldd 查看缺失的库所依赖的库的路径:
ldd libpng.16.so
发现有一些库还是放在 /lib/x86_64-linux-gnu/ 下面的!!好坑
2,在Makefile.config里添加LINKFLAGS, 相当于为Makefile里的LINKFLAGS设置默认的初值
LINKFLAGS,添加当前环境下的lib:anaconda3/envs/env_name/lib
LINKFLAGS := -Wl,-rpath,/path/to/lib
【我怀疑下面这个才是根本原因】:
很可能是opencv的版本出了问题,原来现在真的有opencv4.1。。conda里面3和4 都装了。。而且指向的都是4.。
我C,就是opencv的版本!!!!!!注意用conda装的时候一定要选好版本啊啊啊啊啊啊
如果不小心装错了,先把conda环境里原本有的所有opencv都卸掉!然后再重新装!
没有报错了,接着编译pycaffe 和 matcaffe:
make pycaffe -j32
make matcaffe -j32
make runtest(其实这个没成功但是上面的都能正常用了就算了!)
==用CMAKE==
[貌似最后没完全成功,但是 make all 和 make pycaffe 似乎是OK的,
不过这些报错的解决方法应该是OK的,只是后面还有新的报错就懒得再管了,
放弃cmake直接在根目录下make了,这似乎是比较主流的做法]
cmake报的错:
报错boost
boost 1.70可能版本比较高,cmake不适合。这里的find package(boost)不再是以前的FindBoost.cmake,而是用BoostConfig.cmake,
可以通过切换回去用旧版的FindBoost.cmake
https://github.com/Kitware/CMake/blob/master/Modules/FindBoost.cmake#L238
报错找不到boost python
在Dependencies.cmake对应的那一行(报错的那一行)改 python为python27
原本大概是: find_packages(Boost COMPONENTS python),把这里的python改为python27
make阶段:
make all -j32
报错libprotobuf版本比较高 需要用C++11编译
- 在CMakeList.txt里面添加 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")
make pycaffe -j32
报错没有cudnn
- 在conda下安装 cudatoolkit 注意看看本机装的CUDA版本
- 在conda下安装cudnn
报错opencv
这是因为opencv版本不一致造成的,这里用的opencv c++库是opencv 3,原来的caffe好像都用的opencv2 https://blog.csdn.net/qq_28660035/article/details/80772071
改动的地方
make matcaffe -j32
- cmake:
- 打开CMakeLists.txt的BUILD_matlab
- 报错的话,忽略那个错。。其实是作者代码没有处理好。。
- 出错的地方在于,要把那些库文件转换为make命令中的 -l${lib_name} 的这个函数,因为库文件的变量中,还保存了PUBLIC、PRIVATE等cmake target_link_libraries这个函数的关键字,但是却没有在convert时解析这些关键字。。。所以遇到这些关键字就判为FATAL_ERROR了。。
- 找到出错的那个文件,把报错等级的error改为warning。。
- make
- 报错 找不到caffe.hpp
- 报错,mkl 找不到cblas.h
- https://github.com/BVLC/caffe/issues/6033 mkl用的头文件是mkl_cblas.h
测试使用
https://blog.csdn.net/wzz18191171661/article/details/70149070
pycaffe
编译完之后,测试pycaffe:
- 如果import失败可能是因为要添加pycaffe的路径(caffe根目录下的python文件夹)到 ~/.bashrc的PYTHONLIBRARY 并source
import caffe
caffe.__version__
- 如果提示warning 缺少一些包或是版本不对应,用 pip install
caffe
测试caffe,在caffe的根目录下:
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh
- 可以看到训练的过程,最终测试的精度是 0.98+
- 如果报错,去看看这些脚本文件都做了什么
Check failed: mdb_status == 0 (2 vs. 0) No such file or directory
一般报错这个,大多是 数据集的路径不对!看看prototxt里面指定了数据集的路径里,有没有数据集!
matcaffe
make mattest
报错 一大堆动态库找不到,这些动态库都是装在conda环境下的
意味着编译matcaffe的时候用的是conda环境的,但是mattest不是
mattest竟然用的动态库都是系统下面的?为什么不是直接用编译时候指定的anaconda_home的那些?
还要改 LD_LIBRARY_PATH ,添加conda环境下的lib路径,并且export,但是这个是很辣鸡的替代方法!【因为如果是其他情况下,需要用根目录的lib或是其他环境的lib怎么办?】
export LD_LIBRARY_PATH=/path_to_conda/envs/env_name/lib:$LD_LIBRARY_PATH
well, 官方都这么说了
报错 Could not convert handle to pointer due to invalid init_key. The object might have been cleared.
./matlab/+caffe/private/Net.m
~isempty() 改为 self.isvalid, 参考自https://blog.csdn.net/jiao_mrswang/article/details/81180632
./matlab/+caffe/private/Solver.m
40行,用 if self.isvalid 包围, 参考自https://github.com/BVLC/caffe/pull/5588
在MATLAB使用的时候可能要先添加 matcaffe的路径:
- 在caffe根目录下运行MATLAB
- 在MATLAB命令行中 输入 addpath ./matlab %添加matcaffe的路径
- 在MATLAB命令行中 输入 help caffe %如果输出caffe的详细信息则代表路径添加成功