趁着2020年的春节长假,简单学习了一下梦寐以求的python。学完python皮毛,怎么能不尝试下tensorflow,毕竟人家这么火。由于只是尝试,机器性能也一般,咱就不上GPU版本了,只想着装个纯CPU版本的体验体验。但是遇到的问题也不少,在此给大家分享一下,讲述下我的心路历程。
首先声明一下本人操作系统是win10家庭中文版(系统买本自带的,懒得换了),安装的是截止目前最新的Tensorflow2.1版本(网上教程基本是老版本),Python版本也是目前python3.7的最新版本(没有尝试python3.8)
1. 准备篇
1.1 基本要求:
- 至少对python有基本的认知,主要是基本语法和pip工具;
- 了解windows的shell命令,我用的是powershell,挺好用的,跟linux的bash命令很相似,感觉比cmd好了无数倍;
- 了解python虚拟环境,知道怎么创建,我用的是virtualenv工具,简单实用。很多人也可能安装的Anaconda发行版本,那么conda命令也是支持虚拟环境创建的,但是我目前没怎么用,感觉还没到那个火候,毕竟numpy、pandas、matplotlib等常用的包就可以满足我了,不超过20个。
- 了解Tensorflow的发行版本,不知道的话自行问搜索引擎。当然,也可参考pypi上的发布历史:https://pypi.org/project/tensorflow/1.12.3/#history 其中,1.15版本是1.×的最后一个发行版本(最新更新是1.15.3 2020年的),自此以后Tensorflow进入2.×时代,自然又别有一番风味。
1.2 为啥要用虚拟环境?
我的理解是没虚拟环境的话,很容易“污染”系统原生python,比如我安个第三方包,自动安装了一大堆的依赖包,后来我不想要了,卸载这个第三方包,但是依赖包还在那,还得一个个卸载,鬼知道安装了多少个依赖包。为啥非要卸载?因为我有强迫症,不用的东西在site-packages里面躺着,我浑身不舒服。所以我要安装虚拟环境,这样我就可以为所欲为(至少学习阶段是这样),包可以随便安,随便试,捣鼓坏了,就把整个环境删了,重新建一个干干净净的,岂不妙哉!
另外,有虚部环境,我就可以尝试不同的tensorflow版本,有利于问题的排查,很有用的。
2. 系统需求
先说说硬件需求,按官方说法,你的CPU需要支持AVX指令集,因为从TensorFlow 1.6版本开始,不能跑在不支持AUX指令集的CPU上。不过不用太担心,只要你的笔记本不是老古董,一般没太大问题,这几年出的CPU都支持。实在不放心,就用CPU-Z工具查看一下。
再来看看官方说的软件需求:
- Python 3.5–3.7
- pip 19.0 or later (requires
manylinux2010
support) - Windows 7 or later (64-bit) (Python 3 only)
看着挺多,其实基本都能满足,目前都是标配吧,没什么可说的。
但是,这里有一个坑,官方没有提及,我在这里先不说,在安装部分会讲到。
给个官方安装说明的网址:https://tensorflow.google.cn/install/pip?hl=zh-CN&lang=python3,感兴趣的可以看一下,琢磨琢磨。
3. 安装步骤
第一步:当然是先创建个虚拟环境了,这个才能大展宏图嘛,创建完记得切换到虚拟环境,不然你会后悔的。
第二步:换个pip的源,换成国内的镜像站点,不然那安装速度绝对是你不能忍的,我怕你把电脑砸了。不知道怎么换,看我自学自写文章。会的以及已经换了的请忽略。我比较喜欢清华镜像......
第三步:用pip命令安装。这里高潮来了,官方还有网上各种命令层出不穷,让人眼花缭乱。下面先列举几个常见的命令方式,声明一下几条命令都能安装成功,但是能不能用就不一定了。
pip install tensorflow #最新的稳定发行版本,2.0×后默认是CPU和GPU版本在一起,1.×只表示CPU版本
pip install tensorflow-gpu #1.×的GPU版本
pip install tensorflow==1.15 # 1.×的最后一个更新版本,2019年发布
- 第一个指令:什么叫CPU和GPU版本在一起?我理解的意思就是,CPU和GPU一家亲,不搞什么分裂,一条安装命令搞定就可以了嘛,至于怎么选择,看你机器的显卡支不支持CUDA了。因此,对于显卡支持gpu版本,而又只想用cpu版本练手的小伙伴来说,就不要用第一条命令进行安装,要不然在导包的时候就会有一大堆错误,缺这个少那个,基本是由显卡驱动程序版本、CUDA版本、cuDDN版本等问题引起的。如果不想安装gpu版本,何必自找麻烦呢。
- 第二个指令:安装1.×的GPU版本,我们不涉及,请忽略。
- 第三个指令:按照对于1.×版本,tensorflow默认是CPU版本的逻辑,这个应该不会有啥问题了吧。确实,安装成功后能用,诚不欺我。虽然能运行成功,但是总是输出一些异常干什么,看着烦的很,再次强调我有强迫症。如果有的小伙伴不想试的话我贴个结果给大家看看。
测试代码:
import tensorflow as tf
version = tf.__version__
gpu_ok = tf.test.is_gpu_available()
print("tf version:", version, "\nuse GPU", gpu_ok)
运行结果。大致意思是,我的显卡支持GPU版本,所以提示我找不到一些库,如果想用gpu版本,请安装这些库,并且最后正确输出了Tensorflow的版本是1.15,无法使用gpu。虽然程序正常运行结束,但是明显基于计算机的硬件,官方还是强推了gpu版本,输出了一大堆的提示来安利你。可是,我明明只是想用cpu版本的,不想要推荐,这些输出我看着好烦啊。如果你不介意,当然也可以凑活着这么用。
2020-02-11 21:07:37.172620: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_100.dll'; dlerror: cudart64_100.dll not found
2020-02-11 21:07:37.172864: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2020-02-11 21:07:40.361931: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2020-02-11 21:07:40.413280: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll
2020-02-11 21:07:41.058786: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties:
name: GeForce MX150 major: 6 minor: 1 memoryClockRate(GHz): 1.5315
pciBusID: 0000:01:00.0
2020-02-11 21:07:41.060130: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_100.dll'; dlerror: cudart64_100.dll not found
2020-02-11 21:07:41.061137: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cublas64_100.dll'; dlerror: cublas64_100.dll not found
2020-02-11 21:07:41.062137: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cufft64_100.dll'; dlerror: cufft64_100.dll not found
2020-02-11 21:07:41.063130: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'curand64_100.dll'; dlerror: curand64_100.dll not found
2020-02-11 21:07:41.064307: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cusolver64_100.dll'; dlerror: cusolver64_100.dll not found
2020-02-11 21:07:41.065401: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cusparse64_100.dll'; dlerror: cusparse64_100.dll not found
2020-02-11 21:07:41.066423: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudnn64_7.dll'; dlerror: cudnn64_7.dll not found
2020-02-11 21:07:41.066626: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1641] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
2020-02-11 21:07:41.178436: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-02-11 21:07:41.178643: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0
2020-02-11 21:07:41.178754: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N
tf version: 1.15.0
use GPU False
上面说了这么多(大家不要烦我啊),那到底怎么才能满足我们的基本需求(只是想静静的用一下cpu版本怎么这么难)呢?答案就是,利用下面的命令安装,强制安装CPU版本。这么好用的命令,官方竟然不告诉我们,简直忍无可忍(当然也可能是我头发长、见识短,大家莫怪)。
pip install tensorflow-cpu
基于上述命令,完美的安装了最新的tensorflow 2.1 cpu版本,开心的不行。
第四步:当然是要测试一下正不正常了。
先导一下包:import tensorflow as tf. 看到结果我崩溃了,满满的红啊,贴一下结果,竟然提示dll加载失败,找不到指定的模块,这是什么鬼,心中悲恸不已,但是问题还是要解决的啊。
Traceback (most recent call last):
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\pywrap_tensorflow_internal.py", line 28, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
_mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
File "C:\Programs\Python\tensorflow210_cpu\lib\imp.py", line 242, in load_module
return load_dynamic(name, filename, file)
File "C:\Programs\Python\tensorflow210_cpu\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 "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow\__init__.py", line 101, in <module>
from tensorflow_core import *
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\__init__.py", line 40, in <module>
from tensorflow.python.tools import module_util as _module_util
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow\__init__.py", line 50, in __getattr__
module = self._load()
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow\__init__.py", line 44, in _load
module = _importlib.import_module(self.__name__)
File "C:\Programs\Python\tensorflow210_cpu\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\__init__.py", line 49, in <module>
from tensorflow.python import pywrap_tensorflow
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\pywrap_tensorflow.py", line 74, in <module>
raise ImportError(msg)
ImportError: Traceback (most recent call last):
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\pywrap_tensorflow_internal.py", line 28, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Programs\Python\tensorflow210_cpu\lib\site-packages\tensorflow_core\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
_mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
File "C:\Programs\Python\tensorflow210_cpu\lib\imp.py", line 242, in load_module
return load_dynamic(name, filename, file)
File "C:\Programs\Python\tensorflow210_cpu\lib\imp.py", line 342, in load_dynamic
return _load(spec)
ImportError: DLL load failed: 找不到指定的模块。
先搜索引擎搜一遍,众说纷纭,毫无作用。最后,看一个官方的编译和安装错误消息吧,找到了一个极其类似的,大家有兴趣可以观摩一下:Installation issue with Tensorflow-cpu, no module named '_pwyrap_tensorflow_internal'。总结一下,经过作者的仔细推敲,出现它这个问题(跟我的问题差不多)就是因为在system32系统目录下缺少了msvcp140.dll
文件,安装一下 Microsoft Visual C++ 2015 Redistributable 64 bits就可以了。
回到我们的问题,我用everyting搜了下整个硬盘(这个软件确实给力,速度嗖嗖的),在system32下我有msvcp140.dll
文件啊,为毛还能出现这种问题。忽然,我灵光一现,咦.......,是不是Tensorflow最新版本需要高版本的Microsoft Visual C++ 版本啊。
赶紧到控制中心程序那看一下,发现我最高版本竟然是2017,上官网一看都2019版本了,赶紧更新一下,重启电脑后竟然导包成功了,真是不容易啊。到现在,还感觉有些莫名其妙。
第五步:再次测试一下,把上面的测试代码再撸一遍,果然运行成功,正确输出了Tensorflow的版本以及GPU信息。但是等等,怎么还有个Warining提示,看一下原来是在新版本中,有些API在未来要被drop了,建议使用新的API。
WARNING:tensorflow:From C:/Users/zhang/PycharmProjects/timegeekbang/tensorflowtest.py:4: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.config.list_physical_devices('GPU')` instead.
2020-02-11 21:41:13.222175: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorF
那就再按新的API重新写一下测试代码吧,如下所示。输出结果正确,也有任何提示,看着真是清爽啊,舒服。
import tensorflow as tf
version = tf.__version__
# pu_ok = tf.test.is_gpu_available()
gpu_ok = tf.config.list_physical_devices("GPU")
print("tf version:", version, "\nGPU number", gpu_ok)
# 输出结果
tf version: 2.1.0
GPU number []
4. 后记
本人只是记录了一下自己的心路历程,如果能给大家带来些许启发,我也就甚感欣慰了。随着Tensorflow版本的不断更新,在安装甚至使用过程中,肯定还会有这样或那样的问题。要想解决问题,除了寻找前人的踪迹外,还需要不断的尝试、总结和思考,切不能照搬照做。说不定不久后,我写的这个会被人嗤之以鼻,但是我只想描述这么一种经历,并不想去阐述固定的东西,因为永远不变的是变化。