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

Gab*_*Chu 265 x86 simd compiler-optimization compiler-options 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
Run Code Online (Sandbox Code Playgroud)

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

1)什么是SSE4.2和AVX?

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

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

小智 153

我刚遇到同样的问题,似乎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
Run Code Online (Sandbox Code Playgroud)

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

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

bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
Run Code Online (Sandbox Code Playgroud)

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

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

我不知道什么TensorFlow的默认-O2或者-O3是. gcc -O3实现完全优化,包括自动矢量化,但有时会使代码变慢.


这样做:--copt为了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,因此雅罗斯拉夫的命令应该是罚款).此外,如果您使用的CPU不支持其中一个选项(如FMA),则使用-mfma会使二进制文件出现非法指令.

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

-march=native启用-mtune=native,因此它可以优化您的CPU,例如哪种AVX指令序列最适合未对齐的负载.

这一切都适用于gcc,clang或ICC.(对于ICC,您可以使用-xHOST而不是-march=native.)

  • 它确实工作> +1!所以似乎`-march = native`不是它的工作.除此之外,删除`--config = cuda`(如果不需要CUDA支持)和`-k`(因为在编译期间没有发生错误)也可以. (5认同)
  • 我不得不放弃`--copt = -mfpmath = both`以使其与macOS上的`clang`一起使用.它会影响生成的二进制文件吗? (4认同)
  • 卸载并重新安装新的编译版本后,我仍然收到AVX,AVX2和FMA的警告. (3认同)
  • 只是为了澄清:当我创建配置文件时...我是否只使用--copt = -march = native?或者,我是否可以在原始帖子中看到所有可以选择放入优化的优化? (2认同)

Sal*_*ali 128

让我们从解释为什么你首先看到这些警告开始.


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

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

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


什么是SSE4.2和AVX?

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

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

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

这足以回答您的下一个问题.


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

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


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

您需要编译一个二进制文件以利用这些指令.最简单的方法是自己编译.正如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

  • 这个命令行是什么意思?在这种情况下我应该安装`bazel`吗? (3认同)
  • 3 个多小时后(经过时间:11984.258 秒)我得到了“失败:构建没有成功完成”。自己编译没那么简单。 (3认同)

Tho*_*ale 51

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

如果你想在conda-env中运行自编译版本,你可以.这些是我运行的一般说明,用于通过附加说明在我的系统上安装tensorflow.注意:此版本适用于AMD A10-7850版本(检查CPU是否支持哪些指令......可能会有所不同)运行Ubuntu 16.04 LTS.我在conda-env中使用Python 3.5.Credit转到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.
Run Code Online (Sandbox Code Playgroud)

至于你的第二个问题:

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

最后你的第一个问题:

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

我将强调我自己的错误概念,希望能为您节省一些时间:SSE4.2并不是SSE4.2的新版指令.SSE4 = SSE4.1(一组47条指令)+ SSE4.2(一组7条指令).

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


Jos*_*der 25

这些是SIMD 矢量处理指令集.

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

引用tensorflow安装文档:

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

  • "tensorflow安装文档"链接不起作用.所以我想知道这个答案是否仍然有效.请回复! (4认同)

JAR*_*ARS 19

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

  1. 按照文档 - 从源安装TensorFlow的说明进行操作

  2. 提示时

    当指定bazel选项"--config = opt"时,请指定在编译期间使用的优化标志[Default is -march = native]

然后复制粘贴此字符串:

-mavx -mavx2 -mfma -msse4.2
Run Code Online (Sandbox Code Playgroud)

(默认选项导致错误,所以其他一些标志也是如此.我没有上述标志的错误.顺便说一句,我回复n了所有其他问题)

在安装之后,我根据默认轮子对另一个安装进行深度模型训练时验证了~2x到2.5x的加速 - 在macOS上安装TensorFlow

希望能帮助到你

  • 如果您的编译器正确支持它,`-march = native`应该会更好.它还设置`-mtune = native`以为您的CPU提供良好的指令选择.例如,在Haswell及更高版本中,它会禁用`-mavx256-split-unaligned-store`和`-mavx256-split-unaligned-load`,默认情况下启用`-mtune = generic`并且当数据不是时会损害性能已知是对齐的,但结果是在运行时. (4认同)

Sre*_*A R 7

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

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

请参考 tensorflow的自定义构建

  • Windows版本包括AVX2 https://github.com/fo40225/tensorflow-windows-wheel (2认同)

Edu*_*rdo 6

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

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

  1. 安装Bazel

从其中一个可用版本下载它,例如0.5.2.解压缩,进入目录并进行配置:bash ./compile.sh.将可执行文件复制到/usr/local/bin:sudo cp ./output/bazel /usr/local/bin

  1. 安装Tensorflow

克隆张量流: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
Run Code Online (Sandbox Code Playgroud)
  1. 点子包.要构建它,您必须描述您想要的指令(您知道,Tensorflow告知您缺少这些指令).

构建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时,它不会再抱怨丢失指令了.

  • 仅使用`-c opt --copt = -march = native`进行构建应至少与`--copt = -mavx --copt = -mavx2 --copt = -mfma --copt = -msse4.1一样好--copt = -msse4.2`.(两者都会使警告静音,但是`-march = native`可能通过专门针对您正在构建的系统上的CPU进行调整来制作更快的代码).另请注意,`--copt = -mavx2 --copt = -mfma`意味着所有早期的AVX和SSE选项,因此这一长串选项显然是由不了解gcc选项的人编写的. (4认同)

小智 5

我为Mac编译了一个小的Bash脚本(可以轻松地移植到Linux)以检索所有CPU功能,并将其中一些功能应用于构建TF。我是TF管理员,经常使用(一个月内几次)。

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


小智 5

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

bazel build --config=mkl --config="opt" --copt="-march=broadwell" --copt="-O3" //tensorflow/tools/pip_package:build_pip_package

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

  • 最近有什么变化吗?最后我检查了 `--copt="-march=native"` 正在吃 `=`。(顺便说一句,那些双引号没有任何作用;它们会在 `bazel` 看到你的命令行之前被 shell 删除。) (2认同)