之前装pytorch的时候安装过,此处省略安装过程
问过师姐+百度,Caffe没有很多版本,主要是BAIR实验室维护的官方版本,贾扬清的个人版本(但在某个网页看到似乎已经停止维护了)。我选择了前者,网址:http://caffe.berkeleyvision.org/
这里有个误会,安装教程中sudo apt install caffe-cuda
这一句不是安装整个caffe,只是安装了一部分依赖项而已。。。别弄错了
1.下载源码
2.安装依赖(~/caffe目录有一部分,~/caffe/python目录还有一部分requirements)
3.改Makefile.config
4.改Makefile
5.依次执行下面几句命令
sudo make clean
sudo make all -j8 # j后面的数字是指你要用cpu的几个核心来做这件事,可以自己改
sudo make test -j8
sudo make runtest -j8
sudo make pycaffe -j8
sudo make all -j8
时报错:usr/bin/ld: cannot find -lcudnn参考两个链接
https://github.com/BVLC/caffe/issues/5253
https://stackoverflow.com/questions/43996484/ubuntu-caffe-installation-error-usr-bin-ld-cannot-find-lcudnn
发现有这么几个可能:
(AAA) 没有安装cuDNN,或者cuDNN和CUDA版本不对应
之前装好了CUDA和cuDNN,现在查看一下linux系统中二者的版本,方法看这个链接:https://blog.csdn.net/u011394059/article/details/78455252
看网上说要求CUDA 9.0对应cuDNN 7.0,我的cuDNN版本是7.4.1(这一点在下一步的libcudnn.so.7.4.1
文件得到了验证),不是7.0版本,但平时用pytorch可以GPU加速运算,所以版本没问题
(BBB) cudnn.h文件没有包含在include路径中
首先定位cudnn.h文件,方法是在命令行中执行:
sudo locate cudnn.h
返回结果中有一句是/usr/local/cuda-9.0/include/cudnn.h
把这个路径加入编译caffe时的Makefile.config文件中,问题没有解决,排除B可能
(CCC) libcudnn.so文件没有在LD_LIBRARY_PATH中
首先定位libcudnn.so文件,方法是在命令行中执行:
sudo locate libcudnn.so
得到的结果:
/usr/local/cuda-9.0/lib64/libcudnn.so
/usr/local/cuda-9.0/lib64/libcudnn.so.5
/usr/local/cuda-9.0/lib64/libcudnn.so.7
/usr/local/cuda-9.0/lib64/libcudnn.so.7.4.1
然后查看LD_LIBRARY_PATH,看上面的路径有没有在其中。查看方法:
sudo gedit ~/.bashrc
发现是有的,文件最后两行如下,排除C可能
export PATH=/usr/local/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64$LD_LIBRARY_PATH
(DDD) libcudnn.so没有有效的连接,即连接已断开
这个是偶然间发现的,在/usr/local/cuda-9.0/lib64/
这个路径中查看libcudnn.so文件的属性,发现写着链接已断,猜想是这个问题导致了报错。于是查找本来应该链接到哪里,翻到了安装cuDNN时的教程
https://blog.csdn.net/xierhacker/article/details/53035989
教程对于cuDNN的安装是这么说的:
# 下载完cudnn5.0之后进行解压,cd进入cudnn5.1解压之后的include目录,在命令行进行如下操作:
sudo cp cudnn.h /usr/local/cuda/include/ #复制头文件
# 再将cd进入lib64目录下的动态文件进行复制和链接:
sudo cp lib* /usr/local/cuda/lib64/ #复制动态链接库
cd /usr/local/cuda/lib64/
sudo rm -rf libcudnn.so libcudnn.so.5 #删除原有动态文件
sudo ln -s libcudnn.so.5.1.5 libcudnn.so.5 #生成软衔接
sudo ln -s libcudnn.so.5 libcudnn.so #生成软链接
注意两个事儿:
第一,复制动态链接库这一步,复制到/usr/local/cuda/lib64/
这个路径中的文件有下面这几个
libcudnn.so
libcudnn.so.7
libcudnn.so.7.4.1
libcudnn_static.a
第二,从生成软链接的两句代码可以看到
libcudnn.so 链接到了 libcudnn.so.5
libcudnn.so.5 链接到了 libcudnn.so.5.1.5
libcudnn.so.5.1.5 没有任何链接
没有对 libcudnn.so.7 libcudnn.so.7.4.1 libcudnn_static.a 这三个文件做任何处理
所以去/usr/local/cuda/lib64/
路径下看看libcudnn这几个文件是怎么链接的,方法是在目标路径打开终端,执行ll libcudnn.so*
,返回结果证明libcudnn.so.5.1.5 确实没有有效链接。另外如果我没有记错,libcudnn.so.7链接到libcudnn.so.7.4.1,libcudnn.so.7.4.1链接到libcudnn_static.a。
这个时候猜想应该把libcudnn.so.5链接到libcudnn.so.7上,没有确切的依据,就是感觉能成为一条通路,说不定就好用了;但另一方面pytorch还训练着模型呢,万一这儿把cuDNN的配置改错了,影响了训练就完蛋了。但经过挣扎还是这么做了,想今天装好caffe。。方法是执行下面这句
sudo ln -s libcudnn.so.7 libcudnn.so.5
之后执行ll libcudnn.so*
查看现在的链接情况:
mortimerli@mortimerli-All-Series:/usr/local/cuda/lib64$ ll libcudnn*
lrwxrwxrwx 1 root root 13 4月 16 19:47 libcudnn.so -> libcudnn.so.5*
lrwxrwxrwx 1 root root 13 4月 16 19:55 libcudnn.so.5 -> libcudnn.so.7*
-rwxr-xr-x 1 root root 305352592 4月 16 19:45 libcudnn.so.7*
-rwxr-xr-x 1 root root 305352592 4月 16 19:45 libcudnn.so.7.4.1*
-rwxr-xr-x 1 root root 316941798 4月 16 19:45 libcudnn_static.a*
然后重新执行sudo make all -j8
,不报这个错误了,这一步搞定
sudo make all -j8
时报错:/usr/bin/ld: warning: libcudart.so.9.0, needed by /usr/local/lib/libopencv_core.so, may conflict with libcudart.so.9.1参考这个网址: https://blog.csdn.net/CAU_Ayao/article/details/84976668
sudo make test -j8
时报错:error while loading shared libraries: libcudart.so.9.0: cannot open shared object file: No such file or directory参考链接:https://blog.csdn.net/qq_31261509/article/details/78755968?utm_source=blogxgwz3
确定无法打开的文件,执行类似下面的命令,将软连接复制到/usr/local/lib
目录下
sudo cp /usr/local/cuda-9.0/lib64/libcudart.so.9.0 /usr/local/lib/libcudart.so.9.0 && sudo ldconfig
sudo cp /usr/local/cuda-9.0/lib64/libcublas.so.9.0 /usr/local/lib/libcublas.so.9.0 && sudo ldconfig
sudo cp /usr/local/cuda-9.0/lib64/libcurand.so.9.0 /usr/local/lib/libcurand.so.9.0 && sudo ldconfig
sudo cp /usr/local/cuda-8.0/lib64/libcudnn.so.7 /usr/local/lib/libcudnn.so.7 && sudo ldconfig