有时候我们在使用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 软件包依赖项
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 软件包依赖项
注意:需要 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版)