适合问题
主要是对cpu不兼容问题安装tensorflow不成功的简单纪要。主要表现形式为
ImportError: DLL load failed with error code
ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
如果遇到相似问题,可以往下看。当然,最后会梳理一遍通用的gpu版本的tensorflow安装流程。
安装问题
今天安装tensorflow的时候遇到了一些坑,记录一下。原来笔记本实在太旧了,打dota1都卡,买了淘宝爆款低配吃鸡主机,然后在这个主机上装tensorflow遇到了一个坑。tensorflow_gpu的安装网上很多,按照步骤装了vs,cuda,cudnn,在导入tensorflow的时候,仍然报错如下:
Traceback (most recent call last):
File "C:\Users\Alan\AppData\Local\Programs\Python\Python36\lib\site-packages\t
ensorflow\python\pywrap_tensorflow_internal.py", line 18, in swig_import_helper
return importlib.import_module(mname)
File "C:\Users\Alan\AppData\Local\Programs\Python\Python36\lib\importlib\__ini
t__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 658, in _load_unlocked
File "<frozen importlib._bootstrap>", line 571, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 922, in create_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: DLL load failed with error code -1073741795
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Alan\AppData\Local\Programs\Python\Python36\lib\site-packages\t
ensorflow\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Users\Alan\AppData\Local\Programs\Python\Python36\lib\site-packages\t
ensorflow\python\pywrap_tensorflow_internal.py", line 21, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Users\Alan\AppData\Local\Programs\Python\Python36\lib\site-packages\t
ensorflow\python\pywrap_tensorflow_internal.py", line 20, in swig_import_helper
return importlib.import_module('_pywrap_tensorflow_internal')
File "C:\Users\Alan\AppData\Local\Programs\Python\Python36\lib\importlib\__ini
t__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
后来删了gpu版本,直接pip cpu版本的,仍然报同样的错误。我就觉得大事不妙。之前在实验室和公司电脑上都装过tensorflow,没这问题啊。
后来在stackoverflow上找到相同的毛病,回答问题的人引用了github的回答:
The CPU lack AVX instruction can cause this error.
I have built tensorflow wheel without AVX.
[https://github.com/fo40225/tensorflow-windows-wheel/tree/master/1.6.0/py36/CPU/sse2]>(https://github.com/fo40225/tensorflow-windows-wheel/tree/master/1.6.0/py36/CPU/sse2)
I wish this .whl may help you.
发现原来是cpu不支持avx指令集会导致这种错误。我用cpuz查看我的爆款吃鸡主机cpu是xeon 5560,百度知道是09年的洋垃圾。sandy bridige架构后的cpu才支持avx指令集,pip默认安装的tensorflow都需要avx的支持。但是回答者提供的是cpu版本的wheel包,我想要的是gpu版本的。找了半天,在github上找到了tensorflow-windows-wheel的下载:
Path | Compiler | CUDA/cuDNN | SIMD | Notes |
---|---|---|---|---|
1.8.0\py36\CPU\sse2 | VS2017 15.4 | No | x86_64 | Python 3.6 |
1.8.0\py36\CPU\avx2 | VS2017 15.4 | No | AVX2 | Python 3.6 |
1.8.0\py36\GPU\cuda91cudnn71sse2 | VS2017 15.4 | 9.1.85.3/7.1.3 | x86_64 | Python 3.6/Compute 3.0 |
提供的自定义的wheel包可以下载,针对我的问题,找了一个sse2的指令集编译的tensorflow的gpu包就可以了。
安装流程
具体的安装步骤,网上随便搜。这里主要简要记录安装流程。
需要
- python(根据上面的wheel包,需要3.6或2.7的python,没有别的可选)
- visual studio(10,12,13,15,17皆可,要在cuda前装,因为装cuda的时候会根据vs的版本装相应的一个东西)
- CUDA(上面要求9.1)
- cuDnn(既然cuda装了9.1的,cuDnn当然也是9.1的了)
- tensorflow的wheel包(上面给的网址下载)
除了最后一个需求,上面的步骤和网上其他的安装教程都差不多。注意版本要求,因为默认都提供最新的版本,像CUDA9.1就得从历史版本里找,注意一下就行啦。
我的安装步骤
- anaconda3_5.2,这是python3.6的
- 网上down的visual studio 2013安装包(vs太大了,就装了c函数库,sql server,silverlight啥的都没装)
- CUDA Toolkit 9.1(选择下载包:Windows -> x86_64 ->7(win 7) -> exe(local) -> Base Installer)(自定义安装,只要装CUDA就行,experience是录游戏视频的,其他都是驱动,一个显卡驱动,3d眼镜视频的驱动,hdmi的驱动还有个physx是图像加速)
- 下载CUDA包的时候,除了一个Base Installer,还有几个patch补丁,一并装了。
- 下载cuDnn,找到对应CUDA版本的,是个压缩包,解压,然后就3个文件夹合并到CUDA目录下 。
- 最好在环境变量里将CUDA PATH(装完CUDA后自己会有)加上到/bin和/lib/x_64,不然可能找不到cuDnn,不确定啊。
- 在cmd里cd到tensorflow的wheel包的下载地址,pip install ***.whl