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

这是从运行脚本检查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编译使用这两个库?

我只是遇到了同样的问题,好像Yaroslav Bulatov的build议不包括SSE4.2的支持,join--copt=-msse4.2就足够了。 最后,我成功搭build了

 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 

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

对于任何系统来说,最好的select是:

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

更新: 构build脚本可能正在吃-march=native ,可能是因为它包含= 。)

-mfpmath=both只能用gcc,而不是clang。 -mfpmath=sse可能是一样好,如果不是更好的话,并且是x86-64的默认值。 32位构build默认为-mfpmath=387 ,所以更改这将有助于32位。 (但如果你想要高性能的数字处理,你应该build立64位的二进制文件。)

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


这是做什么: – --coptbazel build传递一个选项直接gcc编译C和C ++文件(但不链接,所以你需要一个不同的select跨文件链接时间优化)

x86-64 gcc默认只使用SSE2或更老版本的SIMD指令,所以你可以在任何 x86-64系统上运行二进制文件。 (请参阅https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html )。 这不是你想要的。 你想制作一个二进制文件,利用你的CPU可以运行的所有指令,因为你只在你构build的系统上运行这个二进制文件。

-march=native启用您的CPU支持的所有选项,因此它使-mavx512f -mavx2 -mavx -mfma -msse4.2冗余。 (另外, -mavx2已经启用了-mavx-msse4.2 ,所以Yaroslav的命令应该没问题)。 另外,如果您使用的CPU不支持这些选项之一(如FMA),则使用-mfma将会生成一个二进制文件,该文件包含非法指令。

TensorFlow的./configure默认启用-march=native ,所以使用它应该避免需要手动指定编译器选项。

-march=native启用-mtune=native ,所以它优化了你的CPU ,比如哪个AVX指令序列最适合未alignment的加载。

这全部适用于gcc,clang或ICC。 (对于ICC,您可以使用-xHOST而不是-march=native 。)

我们首先解释为什么你首先看到这些警告


很可能你没有从源代码安装TF,而不是使用像pip install tensorflow 。 这意味着你安装了(由其他人)预先构build的未经优化的二进制文件。 这些警告告诉你:你的架构上有一些东西可用,但不会被使用,因为二进制文件没有被编译。 这里是文档的一部分。

TensorFlow会在启动时检查是否已经使用CPU上可用的优化进行编译。 如果不包括优化,TensorFlow将发出警告,例如AVX,AVX2和FMA指令不包括在内。

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


什么是SSE4.2和AVX?

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

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

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

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


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

它们允许更有效地计算各种向量(matrix/张量)操作。 您可以在这些幻灯片中阅读更多内容


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

你需要有一个二进制编译来利用这些指令。 最简单的方法是自己编译它 。 正如Mike和Yaroslav所build议的那样,您可以使用以下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

我先回答你的第三个问题:

如果你想在conda-env中运行一个自编译的版本,你可以。 这些是我运行tensorflow安装在我的系统上的一般说明,附加说明。 注意:这个版本是针对运行Ubuntu 16.04 LTS的AMD A10-7850版本(请检查您的CPU支持哪些指令,可能会有所不同)。 我在conda-env中使用Python 3.5。 请参阅张量源代码安装页面和上面提供的答案。

 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%的速度。

最后你的第一个问题:

上面已经提供了很多答案。 总结: AVX , SSE4.1,SSE4.2 ,MFA是X86 CPU上不同types的扩展指令集。 许多包含处理matrix或向量操作的优化指令。

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

在张量stream编译的情况下,如果你的电脑支持AVX2和AVX,SSE4.1和SSE4.2,那么你应该把这些优化标志放在里面。 不要像我这样做,只是去SSE4.2认为它是新的,应该取代SSE4.1。 这显然是错误的! 我必须重新编译,因为那花了我40分钟。

这些是SIMD vector处理指令集 。

使用vector指令对于许多任务来说更快; 机器学习是这样一个任务。

引用tensorflow安装文档 :

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

我为Mac编译了一个小的Bash脚本(可以轻松地移植到Linux上)来检索所有的CPUfunction,并将其中的一些function应用于构buildTF。 我在TF大师,并经常使用(一个月的几次)。

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

从源代码构buildTensorFlow时,您将运行configure脚本。 configure脚本问的其中一个问题如下:

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

configure脚本会将你指定的标志附加到构buildTensorFlow pip包的bazel命令中。 大体而言,您可以通过以下两种方式之一来回应此提示:

  • 如果要在与运行TensorFlow的CPUtypes相同的CPUtypes上构buildTensorFlow,则应接受默认值( -march=native )。 该选项将优化机器CPUtypes的生成代码。
  • 如果在一个CPUtypes上构buildTensorFlow,但是会在不同的CPUtypes上运行TensorFlow,那么考虑提供一个更具体的优化标志,如gcc文档中所述 。

按照前面的项目符号列表所述configuration完TensorFlow之后,只需将--config=opt标志添加到正在运行的任何bazel命令中,就可以为目标CPU构build完全优化的TensorFlow。

我最近从源代码安装它,波纹pipe是所有需要从源代码安装它提供的说明可用的步骤。

其他答案已经描述了为什么显示这些消息。 我的答案一步一步地介绍如何安装,这可能会像我一样帮助人们在实际的安装上苦苦挣扎。

  1. 安装Bazel

从其中一个可用版本下载,例如0.5.2 。 提取它,进入目录并configuration它: bash ./compile.sh 。 将可执行文件复制到/usr/local/binsudo cp ./output/bazel /usr/local/bin

  1. 安装Tensorflow

克隆tensorflow: git clone https://github.com/tensorflow/tensorflow.git转到克隆的目录来configuration它:./ ./configure

它会提示你几个问题,下面我提出了对每个问题的回答,你当然可以根据自己的喜好select自己的回答:

 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. 点子包。 要build立它,你必须描述你想要的指示(你知道,Tensorflow通知你缺less)。

构buildpip脚本: 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

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

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

现在下次启动Tensorflow时,不会再抱怨丢失的指令。

这很容易,对速度有很大的影响。 就我而言,训练步骤花费的时间几乎减半。

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

参考tensorflow的自定义构build

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

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

感谢所有这些答复+一些试验和错误,我设法将它安装在Mac上与clang 。 所以只要分享我的解决scheme,以防对某人有用。

  1. 按照https://www.tensorflow.org/install/install_sources上的说明进行操作;

  2. 当提示

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

然后复制粘贴这个string:

 -mavx -mavx2 -mfma -msse4.2 

(默认的选项会导致错误,其他标志也是如此,我没有遇到上述标志的错误,顺便说一句,我回答了所有其他问题)

安装完成后,在根据默认轮子( https://www.tensorflow.org/install/install_mac )对另一个安装进行深度模型的训练时,我会validation一个2倍到2.5倍的加速比。

希望它有帮助