存在的问题
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
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
_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 "
", line 1, in
File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\__init__.py", line 40, in
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
from tensorflow.python import pywrap_tensorflow
File "E:\Develop\Anaconda3\envs\tf2.0\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 74, in
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
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
_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版本
以上是我在安装过程中的经历和体会,如有错误请指正, 祝大家安装顺利 。