去除警告:Your CPU supports instructions that this TensorFlow binary was not compiled

·  阅读 262

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情


人生没有解决不了的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)

  1. 可以通过上面的方式忽略警告,但是并没有从根本上解决问题

  2. 从源码安装tensorflow可以从根本上解决这个问题

从源码安装的官方教程总体来说还是非常麻烦的,需要很多依赖,安装一些其他的东西。 基本过程可以概括为三步:

  • 下载TensorFlow源码
  • 准备安装环境 (此处需要安装很多东西)
  • 构建pip软件包(一个.whl后缀文件),使用pip命令进行本地安装

其中2,3步骤都非常负责,及其容易出错。最终采用的是另外一种方法,如下3。

  1. 到这个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了。注意这次重装时候要从源码安装,从在源码安装的时候进行相关的设置。

分类:
人工智能
标签:
收藏成功!
已添加到「」, 点击更改