ubuntu编译caffe可能遇到的坑
caffe作为深度学习最早的框架之一,对于现在DL的发展起到了很大的贡献。然而相比于现在更加主流的tensorflow、pytorch等,其编译过程常常让人很痛苦。
这篇博客记录一下caffe编译配置过程中常见的问题,能够解决的问题会给出解决方案。
首先caffe不一定非要手动编译,以ubuntu为例,在20.04之前的版本,可以通过apt安装caffe-cuda和caffe-cpu(cpu版本)。然而Ubuntu20.04只有caffe-cpu,可能过段时间会加上吧。
1. g++版本
g++版本要求7或更低,如果更新了Ubuntu20.04,g++版本一般是9,可以通过sudo权限重置软连接更改版本。
2. 依赖库
众所周知,caffe依赖库较多,需要手动解决。主要包括 opencv、boost、gflags、glog、hdf5、protobuf等。当然 Ubuntu下都可以用apt安装,也算不那么麻烦了。
sudo apt install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev libleveldb-dev libatlas-base-dev
sudo apt install --no-install-recommends libboost-all-dev
实际上不在一开始装完也没关系,中途报错再看(编译caffe就要做好报好多错的准备呀)。一般错误提示确实某个库,如xxx,可以apt search xxx
搜索名字,一般对应的库名都是libxxx-dev这种的,遇到确实再单独安装即可。
3. Makefile.config
安装编译的流程,我们需要复制 Makefile.config.example 到 Makefile.config,然后根据自己机器的情况修改。这里说几个常见要改的地方吧:
1). CUDA路径
上图所示是一般自己编译cuda时,最后一步系统默认放在/usr/local/cuda-version, 并建立软连接/usr/local/cuda指向它。但是直接apt安装cuda-toolkit路径并不默认此处。(apt安装多在/usr/lib/x86_64-linux-gnu)这里要注意。
2). OpenCV
早起版本的caffe默认使用opencv2(实际兼容opencv3或4,但可能遇到其他问题要修改代码),config文件中可能有相关的设置,根据自身opencv版本进行设置。
另外make时可能找不到一些库(最常见的是找不到opencv,会报一些诸如"cv::imread"连接错误这些的,此时启用pkg-config,如下图所示,可解决
3). 包含路径与链接库路径
如上图所示,一般使用apt安装依赖的话,上述这些应该涵盖了搜索的范围。找不到就自己find一下,确认在那个路径。
比较有趣的是hdf5,是放在xx/hdf5/serial,无论是头文件还是.so库文件都放在自身名字下2级目录内,只包含了/usr/include或/usr/lib是不够的。
还有snappy这个库,如果缺失,在编译时不会报错,但在链接时会报错连接错误,找不到 -lsnappy,一般都是没装,但是前面的步骤不报错。
4). cuda架构
上图是我在cuda 10.1版本下编译时的设置,删掉了原来最前面的*20/*21,这些是cuda 9
以前需要的。config example里关于这部分在不同cuda版本怎么设置说的比较清楚了,主要是容易忘。
3. 其他
1)
./include/caffe/util/cudnn.hpp:8:34: fatal error: caffe/proto/caffe.pb.h
虽然装了protobuf,但还是可能出现上面的报错。原因可能是protobuf的版本不匹配。这个问题可以自己手动去protoc:
cd CAFFE_ROOT/src/caffe/proto/
protoc --cpp_out=CAFFE_ROOT/include/caffe/ caffe.proto
然后在CAFFE_ROOT/include/caffe/就会生成对应的.h文件。
2)
undefined reference to `cv::imread(std::string const&, int)'
安装了opencv出现上述错误,一般是没找到opencv库文件。
在config文件中启用启用pkg-config即可。