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

新手上路,请多包涵

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

当我执行 import tensorflow as tf 时,出现以下错误:

 ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory

不同的版本:

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

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

原文由 vvvvv 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

我安装了 nvidia-cuda-toolkit 包:

 $ sudo apt install nvidia-cuda-toolkit

它奏效了。

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

原文由 vvvvv 发布,翻译遵循 CC BY-SA 3.0 许可协议

接受的答案是错误的(安装 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*

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

 sudo cp --preserve=links cuda/lib64/libcudnn* /usr/local/cuda/lib64

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

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 root root 409M May 2 20:02 libcudnn.so.7.6.5

-rw-r–r– 1 root root 386M May 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

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

 sudo ldconfig -v

检查日志。 我不知道它到底做了什么,但事实证明这是非常重要的事情。此外,如果日志显示符号链接已损坏或类似这些内容,那么 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

然后运行命令 source ~/.bashrc

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

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

 sudo apt-cache policy cuda
sudo apt-get install cuda=10.1.243-1

验证方式:

 nvcc --version
nvidia-smi

编辑: 我发现在运行 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:

如果您看到它,则表明仍然存在配置错误。

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进