ImportError: DLL load failed 高效解决方法 Win10+Python3.7+Anaconda2019.03+tensorflow-gpu2.0/1.14+CUDA10.0

存在的问题       

ImportError: DLL load failed: 找不到指定的模块。

安装tensorflow-gpu很容易因为版本不兼容和缺少运行时环境(动态链接库.dll)而出问题,但是我按正确版本安装(期间更换了tensorflow和cuda、cudnn的版本)还是多次出现了“ImportError: DLL load failed: 找不到指定的模块。”这个问题。我发现网上(百度/谷歌)有很多答案,有详尽的安装过程和自己的解决方法,却仍然人没说到点子上。这个问题困扰了我一天,出错原因和解决方法放到后面讲。

报错信息如下:

Python 3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
Traceback (most recent call last):
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 28, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: 找不到指定的模块。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\__init__.py", line 40, in <module>
    from tensorflow.python.tools import module_util as _module_util
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\__init__.py", line 49, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 74, in <module>
    raise ImportError(msg)
ImportError: Traceback (most recent call last):
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 28, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "E:\Develop\Anaconda3\envs\tf2.0\lib\imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: 找不到指定的模块。


Failed to load the native TensorFlow runtime.

See https://www.tensorflow.org/install/errors

for some common reasons and solutions.  Include the entire stack trace
above this error message when asking for help.

 

OSError: [WinError 126] 找不到指定的模块

除了这个问题,我还出现过的问题是找不到cudart64_100.dll

这个Error就好解决了,因为dll文件的名字都告诉你了。一般是因为

1.cuda/cudnn版本和tensorflow版本不一致,导致缺少dll

如果你安装的是cuda10.1,而"\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin"里面是cudart64_101.dll,当然会找不到cudart64_100.dll了。。。这时候你要么再装一个cuda10.0(cudnn也要换),要么更换成支持cuda10.1的tensorflow版本(目前tensorflow1.14.0可以支持,其它版本请自行确认)

 

 2.环境变量没有配置对。

如果你安装了cuda10.0、cudnn7.6.0,在安装目录(\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin)下面搜索是可以找到这个文件的。

这时候只要配置好环境变量就可以啦。(Tips:更改CUDA_PATH的路径可以自由切换cuda版本)

 

解决方法(ImportError: DLL load failed)

在windows系统上安装tensorflow-gpu,很多人遇到这个问题,网上也有很多解决方法,我看了好多篇,解决方法大概有以下几种。

1. 降版本安装tensorflow和cuda,或者换个教程全部卸载重装(如果还是较新版本的tensorflow,问题依然存在emmmm)。

       有的人是“不小心”换成了tensorflow(cpu)版,当然没有问题了,也不用cuda/cudnn了。只不过这不是我们的初衷(cpu训练神经网络实在是太慢了,不然花钱买那么贵的显卡干嘛...)

       另一种情况是 降版本之后的tensorflow-gpu不需要较新的动态链接库(.dll文件)了,系统中已有的Visual C++ 库运行时组件可以满足运行需要;或者你用的处理器较老(有网友提到)?,tensorflow不支持,Python版本较老?不适用于较新的tensorflow及其依赖库等等,这个就要仔细一点了,网上有相应的安装教程,写的很好。

2. 安装Microsoft visual studio 2015/2017

      Microsoft visual studio恰好提供了相应的tensorflow版本需要的Visual C++ 库运行时组件,tensorflow得以运行成功。其实装visual studio肯定不是必须的,不然tensorflow官方说明里面就提到了,visual studio是个集成开发环境(很大,只选基础的C++开发环境都要8G),怎么可能用tensorflow-gpu还必须装它,无非是系统缺少相应的运行时组件。

       下面这俩组件原来是2015版本的,tensorflow-gpu1.14.0安装完成后,导入出错。我昨晚装了visual studio 2019以后被替换为2015-2019版本的了,然后以为是vs版本问题又卸载,重装了visual stdio2017,这个组件也没有变。现在tensorflow1.14.0(root环境)和tensorflow2.0(我用conda创建了个tf2.0环境)就都可以用了。你可以在控制面板里查看你的Visual C++ 依赖库版本。

卸载visual stdio 2017,再次检测tensorflow是否可以导入。

已卸载,Microsoft Visual C++ 2015-2019 Redistributable (x64)和(x86)组件还在。

tensorflow依然可用。

3. 安装Microsoft Visual C++ 2015 Redistributable (x64)

       有网友(https://cloud.tencent.com/developer/news/361221)提到自己试了很多解决方法没有效果,最后安装了一下Microsoft Visual C++ 2015 Redistributable (x86)、Microsoft Visual C++ 2015 Redistributable (x64)错误就完全消失了,可以import tensorflow了。这里就是把缺少的C++运行时组件装到Windows系统里了,至于为什么gpu版必须要用这个组件,我觉得可能是tensorflow用gpu训练神经网络要调用cuda提供的驱动及相应的系统底层函数(动态链接库.dll)。网友(@蓝三金https://blog.csdn.net/qq_20084101/article/details/89148256)在Ubuntu环境下,直接用anaconda装好tensorflow2.0 (pip install tensorflow-gpu==2.0.0-beta0)、cudnn、cudatoolkit (conda install cudnn cudatoolkit numba)、numba (用于支持 Anaconda 找到安装的 cudatoolkit 和 cudnn),一条龙服务看着真舒服,可是我在win10下卸载anaconda跟着教程重新来了一遍还是那个错误... 不得不说Windows确实很坑,等我换了电脑就用双系统装Linux......

正确的解决方法

           做好TensorFlow和cuda/cudnn的版本匹配,然后安装相应的Visual C++ 库运行时组件就可以了。

这是Microsoft Visual C++ Redistributable for Visual Studio 2019的下载地址 https://visualstudio.microsoft.com/zh-hans/downloads/?utm_medium=post-banner&utm_source=microsoft.com&utm_campaign=channel+banner&utm_content=launch+vs2019&rr=https%3A%2F%2Fwww.microsoft.com%2Fen-us%2Fdownload%2Fdeveloper-tools

 

这是Microsoft Visual C++ 2015 Redistributable Update 3的下载地址https://www.microsoft.com/en-us/download/details.aspx?id=53587

 

如果你想知道到底缺了哪些dll

可以通过Visual Studio的dumpbin.exe找到依赖的DLL(把下面的路径替换为你dumpbin.exe的路径和tensorflow的安装路径),检测加载module时出现错误的“_pywrap_tensorflow_internal.pyd”所需要的dll文件。(pyd是一种Python动态模块,相当于C语言中的dll文件,只是改了后缀为pyd

"E:\Program Files(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\bin\Hostx64\x64\dumpbin.exe" /dependents E:\Develop\Anaconda3\Lib\site-packages\tensorflow\python\_pywrap_tensorflow_internal.pyd

 

我的结果是下面这样:

Microsoft (R) COFF/PE Dumper Version 14.21.27702.2
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file E:\Develop\Anaconda3\Lib\site-packages\tensorflow\python\_pywrap_tensorflow_internal.pyd

File Type: DLL

  Image has the following dependencies:

    cusparse64_100.dll
    cusolver64_100.dll
    cublas64_100.dll
    cudnn64_7.dll
    cufft64_100.dll
    curand64_100.dll
    cudart64_100.dll
    python37.dll
    ADVAPI32.dll
    MSVCP140.dll
    WS2_32.dll
    SHLWAPI.dll
    KERNEL32.dll
    VCRUNTIME140.dll
    api-ms-win-crt-runtime-l1-1-0.dll
    api-ms-win-crt-math-l1-1-0.dll
    api-ms-win-crt-stdio-l1-1-0.dll
    api-ms-win-crt-string-l1-1-0.dll
    api-ms-win-crt-heap-l1-1-0.dll
    api-ms-win-crt-utility-l1-1-0.dll
    api-ms-win-crt-environment-l1-1-0.dll
    api-ms-win-crt-time-l1-1-0.dll
    api-ms-win-crt-locale-l1-1-0.dll
    api-ms-win-crt-filesystem-l1-1-0.dll
    api-ms-win-crt-convert-l1-1-0.dll

  Summary

      457000 .data
        1000 .gfids
        2000 .nvFatBi
    29E66000 .nv_fatb
      289000 .pdata
     2198000 .rdata
       87000 .reloc
     63F0000 .text
        1000 .tls
       11000 _RDATA


然后搜索上述DLL,找到缺失的dll

(tf2.0) C:\Users\DELL>where SHLWAPI.dll
C:\Windows\System32\shlwapi.dll

(tf2.0) C:\Users\DELL>where VCRUNTIME140.dll
E:\Develop\Anaconda3\envs\tf2.0\vcruntime140.dll
E:\Develop\Anaconda3\envs\tf2.0\Library\bin\vcruntime140.dll
E:\Develop\Anaconda3\vcruntime140.dll
E:\Develop\Anaconda3\Library\bin\vcruntime140.dll
C:\Windows\System32\vcruntime140.dll

(tf2.0) C:\Users\DELL>where cusparse64_100.dll
E:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\cusparse64_100.dll

这是我故意改了文件名

(tf2.0) C:\Users\DELL>where cublas64_100.dll
信息: 用提供的模式无法找到文件。

然后搜索确定DLL来自于哪里,装上对应版本的模块(可能是缺少Visual C++ 库运行时组件、cuda版本不一致)。

方法来源 https://github.com/tensorflow/tensorflow/issues/7623

 

安装成功界面

2.0.0版本

1.14.0版本

 

以上是我在安装过程中的经历和体会,如有错误请指正,祝大家安装顺利

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值