【问题标题】:ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory [closed]ImportError:libcudnn.so.7:无法打开共享对象文件:没有这样的文件或目录[关闭]
【发布时间】:2018-04-04 17:11:02
【问题描述】:

我在 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

我知道this,但它并没有解决我的问题。

【问题讨论】:

    标签: python-3.x tensorflow ubuntu-16.04


    【解决方案1】:

    接受的答案是错误的(安装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 5月2日20:02 libcudnn.so.7.6.5

    -rw-r--r-- 1 root root 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
    

    删除旧的“链接”并创建新的。使用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 repo。

    另外,在安装 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:

    ...

    如果您看到它,那么仍然有一些配置错误。

    【讨论】:

      【解决方案2】:

      我没有足够的声誉来评论亚历克斯的回答。但是现在在 Ubuntu 20.04 上,路径已经改变了!另外,现在做cp时不需要--preserve=links!所以我可能应该发布一个新答案:

      conda create --name tfgpu10.1 python=3.8 创建的环境中,为 TensorFlow 2.3.1 和 CUDA 10.1 安装 cuDNN 库 7.6:

      1. 转到https://developer.nvidia.com/cuDNN
      2. 在“下载 cuDNN v7.6.5(2019 年 11 月 5 日),用于 CUDA 10.1”中下载“cuDNN Library for Linux”
      3. 使用tar -xvzf cudnn-10.1-linux-x64-v7.6.5.32.tgz提取
      4. “安装”文件:
        sudo cp cuda/include/cudnn.h /usr/lib/cuda/include/
        sudo cp cuda/lib64/libcudnn* /usr/lib/cuda/lib64/
        
      5. 设置权限:
        sudo chmod a+r /usr/lib/cuda/include/cudnn.h /usr/lib/cuda/lib64/libcudnn*
        

      测试输出:

      Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
      [GCC 7.3.0] :: Anaconda, Inc. on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import tensorflow as tf
      2020-12-02 03:58:41.089993: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
      >>> tf.config.list_physical_devices("GPU")
      2020-12-02 03:58:48.538295: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcuda.so.1
      2020-12-02 03:58:48.587523: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
      2020-12-02 03:58:48.587838: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1716] Found device 0 with properties: 
      pciBusID: 0000:01:00.0 name: GeForce GTX 1650 Ti computeCapability: 7.5
      coreClock: 1.485GHz coreCount: 16 deviceMemorySize: 3.82GiB deviceMemoryBandwidth: 178.84GiB/s
      2020-12-02 03:58:48.587860: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
      2020-12-02 03:58:48.589111: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcublas.so.10
      2020-12-02 03:58:48.590284: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcufft.so.10
      2020-12-02 03:58:48.590488: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcurand.so.10
      2020-12-02 03:58:48.591785: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcusolver.so.10
      2020-12-02 03:58:48.592520: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcusparse.so.10
      2020-12-02 03:58:48.595129: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudnn.so.7
      2020-12-02 03:58:48.595213: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
      2020-12-02 03:58:48.595555: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
      2020-12-02 03:58:48.595815: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1858] Adding visible gpu devices: 0
      [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
      

      【讨论】:

        【解决方案3】:

        我安装了nvidia-cuda-toolkit 包:

        $ sudo apt install nvidia-cuda-toolkit
        

        它成功了。

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

        【讨论】:

        • 对我没有帮助。
        【解决方案4】:

        这对我不起作用,在我的情况下,这是因为我安装了多个版本的 Cuda,并且我拥有的 cudnn 版本比我尝试使用的版本更旧,所以我安装了 cudnn紧随 nvidia 的 instructions 之后的新版本就为我做到了。

        【讨论】:

        • 请不要提供评论作为答案。
        猜你喜欢
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2018-12-03
        • 2017-09-03
        • 2018-01-23
        • 1970-01-01
        • 2015-04-12
        • 2018-11-26
        相关资源
        最近更新 更多