最近因工作原因需要编译caffe框架,因此又重新捡起来搞一遍,结果发现编译过程中有不少烂坑,发出来跟大伙共享一下。
先说PC环境:
ubuntu 18.04 LTS
2080Ti x 4 + i9 10990
OpenCV 4.2.0 (从源码自行编译)
anaconda3 (可用可不用)
caffe (github上最新版本)
caffe编译方式一:不使用anaconda3
首先,关闭.bashrc中所有与anaconda有关的环境变量选项,不让anaconda参与编译,并把caffe源码目录下的Makefile.config.example改为Makefile.config,然后打开并编辑:
改动不大,把cuda选项打开即可。 caffe编译默认带opencv,如果不是特殊需要,不用指定opencv的版本(此处我们用自己编译安装的4.2.0版本,而不是opencv3)。python用的是系统自带的2.7版本,如果没有安装numpy的话,记着sudo apt install python-numpy。其它的一些依赖的库都可以通过apt install 去安装,比如glog,gflags,lmdb等等,此处略去不表。
接下来执行cmake ../ 和 make -j,第一个编译错误来了,cmake会报告说CUDA_cublas_device_LIBRARY 这个符号找不到。 明明cuda工作正常,别的训练都能跑的妥妥的,为啥这里就不行? 答案来了,你的cmake版本太低。caffe官方推荐3.12及以上版本。
此时你只能卸载然后从cmake官网下载所需要的版本。
这个问题解决完后,继续编译,会遇到 CV_LOAD_IMAGE_COLOR 符号找不到的bug,这是因为opencv的版本导致的,caffe已经很久不更新了,当年它是配合着opencv3编写的,opencv升级到4.x时代后,部分符号有变化,不过还好,要改的地方不多,涉及三个文件5处代码:
modified: src/caffe/layers/window_data_layer.cpp
modified: src/caffe/test/test_io.cpp
modified: src/caffe/util/io.cpp
caffe编译方式二:使用anaconda3
首先,启用anaconda,即在.bashrc中启用相关环境变量。然后配置Makefile.config,跟上面一样,打开cuda,然后配置python对应的参数:
另外,需要注意的是,caffe目录下还有一个CMakelist文件,注意,里面关于python版本的,默认是2,此处要改为3,因为我的anaconda里面,python版本是3.7。如果不改,编译的时候,caffe还是会用老的那一套python2的环境变量。
提醒,此处检查一下protobuf的版本(protoc --version),caffe需要3.6.1版本的protobuf,否则一样是报错。
此时,大的问题解决的差不多了,但是最后的链接阶段,系统会提示libopencv_imgproc无法识别很多TIFF相关的函数。这个就有点奇怪了,我编译opencv的时候是开了tiff=on的,检查系统,系统也apt install过tiff,此时,你可以ldd一下报错的那个opencv的库文件,搜一下里面tiff:
ldd /usr/local/lib/libopencv_imgcodecs.so.4.2.0 |grep tiff
此处的tiff版本是5。然后再执行一下conda list | grep tiff,你会发现conda里用的是tiff 4.1,也就是说,编译opencv4的时候,我们用了tiff5的库文件,但是编译caffe的时候,系统错误的把opencv的库去链接了conda里的tiff4.1的动态库,因版本不同,因此会有接口函数找不到。
处理方式也比较简单粗暴,直接卸载conda里的tiff即可。
至此,caffe的编译算是告一段落。
本文暂时没有评论,来添加一个吧(●'◡'●)