存在的問題 ? ? ??
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版本
?
以上是我在安裝過程中的經歷和體會,如有錯誤請指正, 祝大家安裝順利 。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
