【TensorFlow 应用】AVX2 问题分析与解决

有时候我们在使用TensorFlow进行运行代码时,会出现如下信息

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2

这里说我们的电脑是支持AVX AVX2的,但是并没有使用。

为什么出现AVX警告?

 TensorFlow 运行二进制文件需要使用AVX指令

首先了解一下 AVX AVX2 是什么,对程序起到什么作用呢?

AVX 简介

  是Intel在2008年3月提出的针对Intel和AMD微处理器的x86指令集体系结构的扩展,并由Intel首先在2011年第一季度及以后发布的Sandy Bridge处理器中提供支持。由AMD随Bulldozer处理器一起在2011年第三季度上市。AVX提供了新功能,新指令和新编码方案。

AVX引入了融合乘法累加(FMA)运算,从而加快了线性代数的计算速度,即点积,矩阵乘法,卷积等。几乎每个机器学习训练都涉及大量这些运算,因此将在支持AVX和FMA(最高300%)的CPU上速度更快

AVX AVX2仅与CPU有关 。

tensorflow为什么不使用 AVX AVX2 呢?

 1)tensorflow默认发行版是在没有CPU扩展(SSE4.1,SSE4.2,AVX,AVX2,FMA)情况下构建的;默认构建(从中为pip install tensorflow)旨在与尽可能多的CPU兼容。

2)而且即使有了这些扩展,CPU也比GPU慢很多,并且tensorflow期望在GPU上进行中型和大型的机器学习训练。

解决方案1

使用背景

我们电脑没有GPU,同时不在意AVX的支持;或者不想买昂贵的GPU,只想使用CPU执行就可以了。

这种情况下,通过以下方式忽略此警告

# Just disables the warning, doesn't enable AVX/FMA
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

命令解析:在的主程序代码中导入OS模块,并为其设置映射对象。

哈哈这样就不会看到这些烦人的警告啦。

如果使用是Unix的朋友

在bash shell中使用export命令

export TF_CPP_MIN_LOG_LEVEL=2

解决方案2

使用背景

电脑没有GPU,但是我们的电脑CPU挺争气的(支持AVX),想使用AVX去加速运行程序

这时需要从源代码编译 TensorFlow pip 软件包,然后安装。

适用系统: Ubuntu Linux 和 macOS  (不支持windows有点尴尬啊)

 Ubuntu Linux 和 macOS 经过测试的构建配置(tensorflow 版本、Python 版本、编译器、编译工具)在文章最后补充了。

Ubuntu 系统

步骤目录

安装 Python 和 TensorFlow 软件包依赖项

下载 TensorFlow 源代码 

配置编译系统

编译 pip 软件包 

编译软件包

安装软件包


安装 Python 和 TensorFlow 软件包依赖项

sudo apt install python-dev python-pip  

   如果是使用python3的朋友,请用下面的命令:

sudo apt install python3-dev python3-pip

安装 TensorFlow pip 软件包依赖项(如果使用虚拟环境,需要省略 --user 参数):

pip install -U --user pip six numpy wheel setuptools mock future>=0.17.1
pip install -U --user keras_applications==1.0.6 --no-deps
pip install -U --user keras_preprocessing==1.0.5 --no-deps

这些依赖项列在 setup.py 文件中的 REQUIRED_PACKAGES 下。

安装 Bazel  安装 Bazel,它是用于编译 TensorFlow 的编译工具。将 Bazel 可执行文件的位置添加到 PATH 环境变量中。

下载 TensorFlow 源代码 

使用 Git 克隆 TensorFlow 代码库

git clone https://github.com/tensorflow/tensorflow.git

cd tensorflow

代码库默认为 master 开发分支。我们也可以检出要编译的版本分支

git checkout branch_name  # r1.9, r1.10, etc.

配置编译系统

通过在 TensorFlow 源代码树的根目录下运行以下命令来配置编译系统:

./configure

此脚本会提示我们指定 TensorFlow 依赖项的位置,并要求指定其他编译配置选项(例如,编译器标记)。以下代码展示了 ./configure 的示例运行会话(会话可能会有所不同):

编译 pip 软件包 

 使用 bazel 构建支持 CPU 的 TensorFlow 软件包编译器:

bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

命令解析:

1)从源代码编译 TensorFlow 可能会消耗大量内存。如果系统内存有限,请使用以下命令限制 Bazel 的内存消耗量:--local_ram_resources=2048;这里限制为2GB的内存去编译。

2)官方 TensorFlow 软件包是使用 GCC 4 编译的,并使用旧版 ABI。对于 GCC 5 及更高版本,为了使编译系统与旧版 ABI 兼容,请使用 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"

编译软件包

bazel build 命令会创建一个名为 build_pip_package 的可执行文件,此文件是用于编译 pip 软件包的程序。请如下所示地运行该可执行文件,以在 /tmp/tensorflow_pkg 目录中编译 .whl 软件包。

要从某个版本分支编译,请使用以下目录:

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

要从 master 编译,请使用 --nightly_flag 获取正确的依赖项:

./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg

尽管可以在同一个源代码树下编译 CUDA 和非 CUDA 配置,但建议在同一个源代码树中的这两种配置之间切换时运行 bazel clean

安装软件包

生成的 .whl 文件的文件名取决于 TensorFlow 版本和我们的平台。例如,使用 pip install 安装软件包:

pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl

如果看到提示:TensorFlow 现已安装完毕;那恭喜呀。

macOS 系统

目录

安装 Python 和 TensorFlow 软件包依赖项

安装 Bazel

下载 TensorFlow 源代码

配置编译系统

编译 pip 软件包

编译软件包

安装软件包


安装 Python 和 TensorFlow 软件包依赖项

注意:需要 Xcode 9.2 或更高版本。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
brew install python@2  # or python (Python 3)

安装 TensorFlow pip 软件包依赖项(如果使用虚拟环境,请省略 --user 参数):

pip install -U --user pip six numpy wheel setuptools mock future>=0.17.1
pip install -U --user keras_applications==1.0.6 --no-deps
pip install -U --user keras_preprocessing==1.0.5 --no-deps

这些依赖项列在 setup.py 文件中的 REQUIRED_PACKAGES 下。

安装 Bazel

安装 Bazel,它是用于编译 TensorFlow 的编译工具。将 Bazel 可执行文件的位置添加到 PATH 环境变量中。

下载 TensorFlow 源代码

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

代码库默认为 master 开发分支。也可以检出要编译的版本分支

git checkout branch_name  # r1.9, r1.10, etc.

配置编译系统

通过在 TensorFlow 源代码树的根目录下运行以下命令来配置编译系统:

./configure

此脚本会提示我们指定 TensorFlow 依赖项的位置,并要求指定其他编译配置选项(例如,编译器标记)。以下代码展示了 ./configure 的示例运行会话(会话可能会有所不同):

编译 pip 软件包

使用 bazel 构建支持 CPU 的 TensorFlow 软件包编译器:

 bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

命令解析:

1)从源代码编译 TensorFlow 可能会消耗大量内存。如果系统内存有限,请使用以下命令限制 Bazel 的内存消耗量:--local_ram_resources=2048。这里限制为2GB的内存去编译。

2)官方 TensorFlow 软件包是使用 GCC 4 编译的,并使用旧版 ABI。对于 GCC 5 及更高版本,为了使编译系统与旧版 ABI 兼容,请使用 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"。兼容 ABI 可确保针对官方 TensorFlow pip 软件包编译的自定义操作继续支持使用 GCC 5 编译的软件包。

编译软件包

bazel build 命令会创建一个名为 build_pip_package 的可执行文件,此文件是用于编译 pip 软件包的程序。请如下所示地运行该可执行文件,以在 /tmp/tensorflow_pkg 目录中编译 .whl 软件包。

要从某个版本分支编译,请使用以下目录:

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

要从 master 编译,请使用 --nightly_flag 获取正确的依赖项:

./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg

安装软件包

生成的 .whl 文件的文件名取决于 TensorFlow 版本和您的平台。例如,使用 pip install 安装软件包:

pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl

如果看到提示:TensorFlow 现已安装完毕;那恭喜呀。

好了,愿你顺顺利利安装,愉快使用TensorFlow,专心高效打代码。如果有错误的地方,欢迎支持。

希望对你有帮助。

补充

Ubuntu Linux 和 macOS 经过测试的构建配置(tensorflow 版本、Python 版本、编译器、编译工具)如下:

Linux(CPU版)

macOS(CPU版)

发布了177 篇原创文章 · 获赞 387 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/qq_41204464/article/details/104591703