ubuntu18.04 + cuda9.0 + cudnn7.0 安装Caffe(伯克利官方)问题总结

一、CUDA和cuDNN

之前装pytorch的时候安装过,此处省略安装过程

二、Caffe的版本

问过师姐+百度,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

四、遇到的问题

1.执行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 416 19:47 libcudnn.so -> libcudnn.so.5*
lrwxrwxrwx 1 root root        13 416 19:55 libcudnn.so.5 -> libcudnn.so.7*
-rwxr-xr-x 1 root root 305352592 416 19:45 libcudnn.so.7*
-rwxr-xr-x 1 root root 305352592 416 19:45 libcudnn.so.7.4.1*
-rwxr-xr-x 1 root root 316941798 416 19:45 libcudnn_static.a*

然后重新执行sudo make all -j8,不报这个错误了,这一步搞定

2.执行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

3.执行sudo make test -j8时报错:error while loading shared libraries: libcudart.so.9.0: cannot open shared object file: No such file or directory

或者: libcudnn.so.7 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

你可能感兴趣的:(Ubuntu系统)