导入错误:libcudnn.so.7:无法打开共享对象文件:没有这样的文件或目录

vin*_*zee 5 python-3.x tensorflow ubuntu-16.04

Tensorflow 1.6.0在 Python 3.6.4 环境中安装了带有 anaconda 的 GPU 版本。

当我这样做时import tensorflow as tf,我收到以下错误:

ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

不同的版本:

  • cudnn : 7.1.1
  • cuda : 9.0.176
  • tensorflow : 1.6.0
  • Ubuntu : 16.04

我知道这一点,但它没有解决我的问题。

Ale*_*lex 5

接受的答案是错误的(安装nvidia-cuda-toolkit)。通过安装该工具包,您基本上是在 nvidia 指南中已安装的 cuda 之上安装了第二个 CUDA。

问题原来是符号链接的问题。灵感来自这个话题http://queirozf.com/entries/installing-cuda-tk-and-tensorflow-on-a-clean-ubuntu-16-04-install 但实际分辨率不同

所以在某一时刻 CuDNN安装nvidia教程的会要求你这样做:

sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,使用过滤器复制文件libcudnn*会破坏复制文件的符号链接。相反,我建议运行以下命令,但它仍然会破坏链接:

sudo cp --preserve=links cuda/lib64/libcudnn* /usr/local/cuda/lib64
Run Code Online (Sandbox Code Playgroud)

您可以通过运行来验证链接 ls -lha libcudnn*/usr/local/cuda/lib64文件夹中。如果你碰巧没有看到这样的图片:

lrwxrwxrwx 1 root root 13 May 2 20:02 libcudnn.so -> libcudnn.so.7

lrwxrwxrwx 1 root root 17 May 2 20:02 libcudnn.so.7 -> libcudnn.so.7.6.5

-rwxr-xr-x 1 根根 409M 5 月 2 日 20:02 libcudnn.so.7.6.5

-rw-r--r-- 1 根 386M 5 月 2 日 20:02 libcudnn_static.a

然后你才发现问题。实际的解决方案涉及执行以下操作:

sudo rm /usr/local/cuda/lib64/libcudnn.so
sudo rm /usr/local/cuda/lib64/libcudnn.so.7
cd /usr/local/cuda/lib64/
sudo ln -s libcudnn.so.7.6.5 libcudnn.so.7
sudo ln -s libcudnn.so.7 libcudnn.so
Run Code Online (Sandbox Code Playgroud)

删除旧的“链接”并创建新的链接。再次验证链接ls -lha libcudnn*。之后在详细模式下运行以下命令:

sudo ldconfig -v
Run Code Online (Sandbox Code Playgroud)

检查日志。我不知道它到底做了什么,但事实证明这是非常重要的事情。此外,如果日志说符号链接已损坏或类似这些行的内容,则tensorflow则将继续显示主题中提到的错误。

奖金!确保您将以下路径附加为最后几行nano ~/.bashrc

export PATH=/usr/local/cuda/bin:/opt/nvidia/nsight-compute/2019.4.0${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDADIR=/usr/local/cuda${CUDADIR:+:${CUDADIR}}
export CUDA_HOME=/usr/local/cuda
Run Code Online (Sandbox Code Playgroud)

然后运行命令 source ~/.bashrc

以上所有步骤都假设您没有使用nvidia-cuda-toolkit,而是使用了nvidiacuda 存储库。

此外,在安装 CUDA 时,请确保您没有针对10.2. 在编写 TF 的那一刻,支持版本高达Cuda 10.1,因此以下是安装所需版本的正确方法:

sudo apt-cache policy cuda
sudo apt-get install cuda=10.1.243-1
Run Code Online (Sandbox Code Playgroud)

验证者:

nvcc --version
nvidia-smi
Run Code Online (Sandbox Code Playgroud)

编辑:我发现您在运行ldconfig命令后应该避免看到的错误:

/usr/local/cuda-10.1/targets/x86_64-linux/lib:

...

libnppist.so.10 -> libnppist.so.10.2.0.243

libcuinj64.so.10.1 -> libcuinj64.so.10.1.243

> /sbin/ldconfig.real: /usr/local/cuda-10.1/targets/x86_64-linux/lib /libcudnn.so.7 不是符号链接

libcudnn.so.7 -> libcudnn.so.7.6.5

libnppc.so.10 -> libnppc.so.10.2.0.243

libnppicom.so.10 -> libnppicom.so.10.2.0.243

libnvgraph.so.10 -> libnvgraph.so.10.1.243

/usr/lib/x86_64-linux-gnu/libfakeroot:

...

如果您看到它,那么仍然存在配置错误。


vin*_*zee 0

我安装了这个nvidia-cuda-toolkit包:

$ sudo apt install nvidia-cuda-toolkit
Run Code Online (Sandbox Code Playgroud)

它起作用了。

我在tensorflow网站和nvidia安装页面上都没有找到解决方案。我在寻找使用命令行获取cuda版本的方法时幸运地找到了它:How to get the cuda version?