3_去除警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
去除警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA(20190128)
文章目录:
人生没有解决不了的bug. But 一定有解决不完的bug !!!
Believe it or not !!!
一、警告原因分析
知彼知己,再遇亲切呀,还是先分析一下警告的原因吧!
1、出现警告
程序运行的时候出现如下的警告:
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
大概意思是:
你的CPU支持TensorFlow二进制指令集,但是不能够使用AVX2 指令集进行编译
2、原因分析
现代CPU提供了一系列低级别的指令集,除了通常的算术和逻辑之外,被称为扩展,例如, SSE2,SSE4,AVX等。
维基百科有描述:
高级矢量扩展(AVX:
Advanced Vector Extensions
)是英特尔在2008年3月提出的英特尔和AMD微处理器的x86指令集体系结构的扩展,英特尔首先通过Sandy Bridge处理器在2011年第一季度推出,随后由AMD推出Bulldozer处理器 在2011年第三季度.AVX提供了新功能,新指令和新编码方案。
特别是,AVX引入了融合乘法累加(FMA)操作,加速了线性代数计算,即点积,矩阵乘法,卷积等。几乎所有机器学习训练都涉及大量这些操作,因此将会 支持AVX和FMA的CPU(最高达300%)更快。 该警告指出您的CPU确实支持AVX(hooray!)。
那为什么没有使用呢?
由于tensorflow默认是在没有CPU扩展的情况下构建的,例如SSE4.1,SSE4.2,AVX,AVX2,FMA等。默认版本(来自pip install tensorflow的版本)旨在与尽可能多的CPU兼容。 另一个观点是,即使使用这些扩展名,CPU的速度也要比GPU低很多,所以它预计中大型机器学习任务应该在GPU上执行。
那我们应该怎么办
如果你有GPU的话,直接忽略这一项即可,因为大部分的高消耗操作都会被分配到GPU上执行(除非你设置了不这么做)。在这种情况下,你可以通过下面这个方式直接忽略这个警告:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
这种方法只是去掉警告,实际上是没有解决问题的。
如果你没有GPU,你想最大化使用CPU,你应该启动你的CPU的AVX,AVX2以及FMA拓展。在这个问题以及这个GitHub issue里面都有详细的讨论。Tensorflow使用称为bazel的ad-hoc构建系统,构建它并不是那么简单,但肯定是可行的。 在此之后,不仅警告消失,张量流性能也应该改善。
解决方法
二、去除警告方法
1、安装的Tensorflow是GPU版本(tensorflow-gpu)
如果你安装的tensorflow是GPU版本的,其实这个警告去不去除都也是没有影响的,但是如果你想去除这个警告也是可以的,只需要在程序的开头加上以下两行代码即可忽略警告
:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
解释(设置tensorflow日志显示警告的等级):
import os
os.environ[“TF_CPP_MIN_LOG_LEVEL”]=‘1’ # 这是默认的显示等级,显示所有信息
os.environ[“TF_CPP_MIN_LOG_LEVEL”]=‘2’ # 只显示 warning 和 Error
os.environ[“TF_CPP_MIN_LOG_LEVEL”]=‘3’ # 只显示 Error
2、安装的tensorflow是CPU版本(tensorflow)
-
可以通过上面的方式
忽略警告
,但是并没有从根本上解决问题 -
从源码安装tensorflow可以从根本上解决这个问题
从源码安装的官方教程总体来说还是非常麻烦的,需要很多依赖,安装一些其他的东西。
基本过程可以概括为三步:
- 下载TensorFlow源码
- 准备安装环境 (此处需要安装很多东西)
- 构建pip软件包(一个.whl后缀文件),使用pip命令进行本地安装
其中2,3步骤都非常负责,及其容易出错。最终采用的是另外一种方法,如下3。
- 到这个GitHub repo下载自己对应版本的pip软件包。
一定要对应版本!
版本查看方式:直接在命令行中输入python即可查看python的版本和GCC的版本号
>>>python
Python 3.6.5 (default, Apr 25 2018, 14:23:58)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
从中可以得出我们的版本 Python 3.6.5 clang-902.0.29.1,又这两个版本号加上自己的系统名在上面的GitHub repo里面选择对应的软件包。下载下来相当于直接完成了官网教材的前3步。
所以只需要执行第4步。
pip install --ignore-installed --upgrade /path/to/binary.whl
注意 :
Python3的pip命令是pip3 这条语句可以忽略我们已经安装好的tf包,不需要卸载,会直接升级过去。很方便。
三、材料补充说明
什么是SSE4.2和AVX?
SIMD (Single Instruction Multiple Data)单指令流多数据流,是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性技术。
在微处理器中,SIMD则是一个控制器控制多个并行的处理微元,例如Intel的MMX或SSE,以及AMD的3D NOW指令集。
所以说SSE4.2和AVX都是一种SIMD指令集。
对于TF tasks。SSE4.2和AVX使向量和矩阵计算更加高效。具体可以看这个课件。
所以该怎么做,大概只能重装一遍tensorflow了。注意这次重装时候要从源码安装,从在源码安装的时候进行相关的设置。
。