如何使用SSE4.2和AVX指令编译Tensorflow?

时间:2016-12-22 23:21:15

标签: tensorflow x86 compiler-optimization simd compiler-options

这是从运行脚本以检查Tensorflow是否正常工作时收到的消息:

I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

我注意到它提到了SSE4.2和AVX,

1)什么是SSE4.2和AVX?

2)这些SSE4.2和AVX如何改进Tensorflow任务的CPU计算。

3)如何使用这两个库进行Tensorflow编译?

12 个答案:

答案 0 :(得分:145)

我刚遇到同样的问题,看起来Yaroslav Bulatov的建议并没有涵盖SSE4.2支持,添加--copt=-msse4.2就足够了。最后,我成功建立了

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

没有收到任何警告或错误。

任何系统的最佳选择可能是:

bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

更新:the build scripts may be eating -march=native,可能是因为它包含= 。)

-mfpmath=both仅适用于gcc,而非clang。 -mfpmath=sse可能同样好,如果不是更好,并且是x86-64的默认值。 32位构建默认为-mfpmath=387,因此更改它将有助于32位。 (但是如果你想要数字运算的高性能,你应该构建64位二进制文​​件。)

我不确定TensorFlow默认的-O2-O3是什么。 gcc -O3支持完全优化,包括自动矢量化,但有时会使代码变慢。

这样做:--copt for bazel build直接将选项传递给gcc以编译C和C ++文件(但不进行链接,因此您需要一个不同的选项来进行跨文件链接时优化)

x86-64 gcc默认只使用SSE2或较旧的SIMD指令,因此您可以在任何 x86-64系统上运行二进制文件。 (见https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html)。这不是你想要的。您希望创建一个利用CPU可以运行的所有指令的二进制文件,因为您只在构建它的系统上运行此二进制文件。

-march=native启用CPU支持的所有选项,因此会使-mavx512f -mavx2 -mavx -mfma -msse4.2变为冗余。 (另外,-mavx2已启用-mavx-msse4.2,因此Yaroslav的命令应该没问题。此外,如果您使用的CPU不支持其中一个选项(如FMA),则使用-mfma会使二进制文件出现非法指令。

TensorFlow's ./configure defaults to enabling -march=native,因此使用它应该避免需要手动指定编译器选项。

-march=native启用-mtune=native,因此it optimizes for your CPU可以解决哪些AVX指令序列最适合未对齐的加载。

这一切都适用于gcc,clang或ICC。 (对于ICC,您可以使用-xHOST代替-march=native。)

答案 1 :(得分:121)

让我们首先解释为什么你会在第一时间看到这些警告

很可能你没有从源代码安装TF,而是用pip install tensorflow之类的东西。这意味着您安装了预先构建的(由其他人)二进制文件,这些二进制文件未针对您的体系结构进行优化。这些警告告诉你这一点:你的架构上有一些东西可用,但它不会被使用,因为二进制文件没有用它编译。以下是documentation的部分。

  

TensorFlow检查启动时是否已使用   CPU上可用的优化。如果优化不是   包括在内,TensorFlow会发出警告,例如: AVX,AVX2和FMA   说明不包括在内。

好的是很可能你只是想学习/试验TF所以一切都会正常工作你不应该担心它

什么是SSE4.2和AVX?

维基百科对SSE4.2AVX有一个很好的解释。这种知识不需要擅长机器学习。您可以将它们视为一组额外的instructions,以便计算机对单个指令使用多个数据点来执行可能自然并行化的操作(例如添加两个数组)。

SSE和AVX都是SIMD(单指令,多数据)的抽象概念的实现,这是

  

Flynn分类中的一类并行计算机。它描述了   具有多个执行相同处理元素的计算机   同时操作多个数据点。因此,这样的机器   利用数据级并行,但不是并发:有   同时(并行)计算,但只有一个过程   (指令)在特定时刻

这足以回答你的下一个问题。

这些SSE4.2和AVX如何改善TF任务的CPU计算

它们允许更有效地计算各种矢量(矩阵/张量)运算。您可以在these slides

中阅读更多内容

如何使用这两个库进行Tensorflow编译?

您需要编译一个二进制文件以利用这些指令。最简单的方法是compile it yourself。正如Mike和Yaroslav建议的那样,你可以使用以下bazel命令

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

答案 2 :(得分:51)

让我先回答你的第3个问题:

如果你想在conda-env中运行自编译版本,你可以。这些是我运行的一般说明,用于通过附加说明在我的系统上安装tensorflow。注意:此版本适用于AMD A10-7850版本(检查CPU是否支持哪些指令......可能会有所不同)运行Ubuntu 16.04 LTS。我在conda-env中使用Python 3.5。信用转到tensorflow源安装页面和上面提供的答案。

git clone https://github.com/tensorflow/tensorflow 
# Install Bazel
# https://bazel.build/versions/master/docs/install.html
sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel
# Create your virtual env with conda.
source activate YOUR_ENV
pip install six numpy wheel, packaging, appdir
# Follow the configure instructions at:
# https://www.tensorflow.org/install/install_sources
# Build your build like below. Note: Check what instructions your CPU 
# support. Also. If resources are limited consider adding the following 
# tag --local_resources 2048,.5,1.0 . This will limit how much ram many
# local resources are used but will increase time to compile.
bazel build -c opt --copt=-mavx --copt=-msse4.1 --copt=-msse4.2  -k //tensorflow/tools/pip_package:build_pip_package
# Create the wheel like so:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
# Inside your conda env:
pip install /tmp/tensorflow_pkg/NAME_OF_WHEEL.whl
# Then install the rest of your stack
pip install keras jupyter etc. etc.

关于你的第二个问题:

在我看来,带有优化的自编译版本非常值得。在我的特定设置中,过去需要560-600秒的计算现在只需要大约300秒!虽然确切的数字会有所不同,但我认为您的特定设置一般可以提高35-50%的速度。

最后您的第一个问题:

上面已经提供了很多答案。总结一下:AVXSSE4.1, SSE4.2,MFA是X86 CPU上不同类型的扩展指令集。许多包含用于处理矩阵或向量运算的优化指令。

我将突出自己的误解,希望能为您节省一些时间:并不是SSE4.2是更新版本的指令取代SSE4.1。 SSE4 = SSE4.1(一组47条指令)+ SSE4.2(一组7条指令)。

在张量流编译的上下文中,如果您的计算机支持AVX2和AVX,以及SSE4.1和SSE4.2,您应该将这些优化标志放入所有中。不要像我那样做,只是选择SSE4.2认为它更新,应该取代SSE4.1。那显然是错的!我不得不重新编译,因为这让我花费了40分钟。

答案 3 :(得分:25)

这些是SIMD vector processing instruction sets

对于许多任务,使用向量指令更快;机器学习就是这样一项任务。

引用tensorflow installation docs

  

为了与尽可能广泛的机器兼容,TensorFlow默认只在x86机器上使用SSE4.1 SIMD指令。大多数现代PC和Mac都支持更高级的指令,因此如果您构建的二进制文件只能在自己的计算机上运行,​​则可以在bazel构建命令中使用--copt=-march=native来启用它们。

答案 4 :(得分:15)

感谢所有这些回复+一些试验和错误,我设法将其安装在event.clipboardData.getData('text')的Mac上。所以只需分享我的解决方案,以防对某人有用。

  1. 按照Documentation - Installing TensorFlow from Sources

  2. 上的说明操作
  3. 提示

    如果指定了bazel选项“--config = opt”,请指定在编译期间使用的优化标志[默认为-march = native]

  4. 然后复制粘贴此字符串:

    clang

    (默认选项导致错误,所以其他一些标志也是如此。上面的标志没有错误.BTW我回答-mavx -mavx2 -mfma -msse4.2 所有其他问题)

    安装完成后,我根据默认车轮训练深度模型相对于另一个安装时验证了~2x到2.5x的加速 - Installing TensorFlow on macOS

    希望有所帮助

答案 5 :(得分:7)

这是最简单的方法。只有一步。

它对速度有重大影响。就我而言,训练步骤的时间几乎减半。

参考 custom builds of tensorflow

答案 6 :(得分:6)

我最近从源代码安装了它,而下面是从源代码安装它所需的所有步骤,并提供了上述说明。

其他答案已经描述了显示这些消息的原因。我的回答逐步介绍了如何安装,这可能会帮助人们像我一样对实际安装进行调整。

  1. 安装Bazel
  2. 从其中一个可用的releases下载,例如0.5.2。 解压缩,进入目录并进行配置:bash ./compile.sh。 将可执行文件复制到/usr/local/binsudo cp ./output/bazel /usr/local/bin

    1. 安装Tensorflow
    2. 克隆张量流:git clone https://github.com/tensorflow/tensorflow.git 转到克隆目录进行配置:./configure

      它会提示您几个问题,下面我建议您回答每个问题,当然,您可以根据自己的喜好选择自己的答案:

      Using python library path: /usr/local/lib/python2.7/dist-packages
      Do you wish to build TensorFlow with MKL support? [y/N] y
      MKL support will be enabled for TensorFlow
      Do you wish to download MKL LIB from the web? [Y/n] Y
      Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: 
      Do you wish to use jemalloc as the malloc implementation? [Y/n] n
      jemalloc disabled
      Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
      No Google Cloud Platform support will be enabled for TensorFlow
      Do you wish to build TensorFlow with Hadoop File System support? [y/N] N
      No Hadoop File System support will be enabled for TensorFlow
      Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] N
      No XLA JIT support will be enabled for TensorFlow
      Do you wish to build TensorFlow with VERBS support? [y/N] N
      No VERBS support will be enabled for TensorFlow
      Do you wish to build TensorFlow with OpenCL support? [y/N] N
      No OpenCL support will be enabled for TensorFlow
      Do you wish to build TensorFlow with CUDA support? [y/N] N
      No CUDA support will be enabled for TensorFlow
      
      1. pip包。要构建它,你必须描述你想要的指令(你知道,Tensorflow告诉你的那些指示缺失)。
      2. 构建pip脚本:bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package

        构建pip包:bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

        安装刚刚构建的Tensorflow pip包:sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

        现在下次启动Tensorflow时,它不会再抱怨丢失说明了。

答案 7 :(得分:4)

我为Mac编译了一个小的Bash脚本(很容易移植到Linux)以检索所有CPU功能并应用其中一些来构建TF。我是TF大师,经常使用(一个月内几次)。

https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f

答案 8 :(得分:3)

要使用SSE4.2和AVX编译TensorFlow,您可以直接使用

  

bazel build --config = mkl                   --config = “选择”                   --copt = “ - 行军= Broadwell微架构”                   --copt = “ - O3”                   // tensorflow /工具/ pip_package:build_pip_package

来源: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl

答案 9 :(得分:3)

2.0兼容解决方案:

在终端机(Linux / MacOS)或命令提示符(Windows)中执行以下命令以使用 Bazel 安装Tensorflow 2.0:

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

#The repo defaults to the master development branch. You can also checkout a release branch to build:
git checkout r2.0

#Configure the Build => Use the Below line for Windows Machine
python ./configure.py 

#Configure the Build => Use the Below line for Linux/MacOS Machine
./configure
#This script prompts you for the location of TensorFlow dependencies and asks for additional build configuration options. 

#Build Tensorflow package

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

#GPU support
bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package

答案 10 :(得分:2)

从源代码构建TensorFlow时,您将运行configure脚本。 configure脚本要求的一个问题如下:

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]

configure脚本会将您指定的标志附加到构建TensorFlow pip包的bazel命令。从广义上讲,您可以通过以下两种方式之一来响应此提示:

  • 如果您使用与运行TensorFlow的CPU类型相同类型的CPU类型构建TensorFlow,则应接受默认值(-march=native)。此选项将优化为计算机的CPU类型生成的代码。
  • 如果您在一种CPU类型上构建TensorFlow但在不同的CPU类型上运行TensorFlow,则考虑提供更具体的优化标志,如the gcc documentation中所述。

按照前面的项目符号列表中的描述配置TensorFlow后,您应该能够通过将--config=opt标志添加到正在运行的任何bazel命令来为目标CPU构建完全优化的TensorFlow。

答案 11 :(得分:0)

要隐藏这些警告,您可以在实际代码之前执行此操作。

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf