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


288

这是从运行脚本以检查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编译?

18
我喜欢bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package 在Xeon E5 v3上使用这些标志构建,与官方发布的版本(0.35-> 1.05 T ops / sec)相比,我在8k matmul CPU速度上提高了3倍
Yaroslav

4
别忘了NOTE on gcc 5 or later: the binary pip packages available on the TensorFlow website are built with gcc 4, which uses the older ABI. To make your build compatible with the older ABI, you need to add --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" to your bazel build command. ABI compatibility allows custom ops built against the TensorFlow pip package to continue to work against your built package.从这里tensorflow.org/install/install_sources
Ivan Kush

4
我有一些TF的编译二进制文件,支持这些指令github.com/lakshayg/tensorflow-build。您可能会发现这很有帮助。
Lakshay Garg'7

1
@IvanKush添加了该标志后,我仍然无法成功导入tensorflow(编译正常)。如果你成功地用gcc编译5,请参阅:stackoverflow.com/questions/45877158/...
anon01

1
如果使用Ubuntu 16.04,我们将在github.com/mind/wheels上
danqing 2017年

Answers:


160

我只是遇到了同样的问题,似乎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

更新:构建脚本可能正在吃东西-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,因此Yaroslav的命令应该没问题)。另外,如果您使用的CPU不支持这些选项之一(例如FMA),则使用-mfma会产生二进制文件,错误指令无效。

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

-march=nativeenable -mtune=native,因此它针对您的CPU进行了优化,例如哪种AVX指令序列最适合未对齐的负载。

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


6
它的工作确实> +1!因此,似乎-march=native没有工作。此外,删除--config=cuda(如果不需要CUDA支持)和-k(由于编译期间没有发生错误)也可以工作。
Marc

4
卸载并重新安装新的编译版本后,我仍然收到有关AVX,AVX2和FMA的警告。
Benedikt S. Vogler

5
我不得不放弃--copt=-mfpmath=both使其与clangmacOS一起使用。它会影响生成的二进制文件吗?
gc5

2
只是为了澄清:创建配置文件时......我是否仅使用--copt = -march = native?还是我将所有在原始帖子中看到的优化都放在其中,我可以选择进行优化?
Thornhale

1
我收到一条错误消息,说“ build”命令仅受工作空间支持?该怎么办?
谦虚的

133

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


很有可能您尚未从源代码安装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


4
此命令行是什么意思?bazel在这种情况下我应该安装吗?
YZ

1
是否有人使用MSYS2或Visual Studio 2017 ommunity Edition在64位窗口下进行构建?并可以分享步骤?
James Chang

1
可以将此pip软件包安装到本地计算机上的conda环境中吗?
dgketchum

3
3个多小时后(经过的时间:11984.258s),我得到了FAILED: Build did NOT complete successfully。自己编译并不是那么简单。
imbrizi

同样在这里。我的构建也失败了,然后在日志中我可以看到:cl:命令行警告D9002:忽略未知选项'-mavx'cl:命令行警告D9002:忽略未知选项'-mavx2'cl:命令行警告D9002:忽略未知选项'-mfma'cl:命令行警告D9002:忽略未知选项'-mfpmath = both'cl:命令行警告D9002:忽略未知选项'-msse4.2'cl:命令行警告D9002:忽略未知选项'- FNO严格走样” CL:命令行警告D9002:忽略未知的选项‘-fexceptions’所以这些选项是不知道
石栏

53

首先让我回答您的第三个问题:

如果要在conda-env中运行自编译版本,则可以。这些是我运行的一般说明,并附有其他说明以使tensorflow安装在系统上。注意:此构建适用于运行Ubuntu 16.04 LTS的AMD A10-7850构建(检查您的CPU支持哪些指令...可能有所不同)。我在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条指令)。

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


.whl文件存储在哪里,因为我也想在Windows上安装它?
WiLL_K

它存储在这里:/ tmp / tensorflow_pkg(在Linux驱动器上)
Thornhale

你能告诉我这需要多少时间吗?大约2个小时,我的笔记本电脑冻结了。它的运行ububtu具有4GB的ram和i5处理器
WiLL_K 17-4-6

嗯,编译张量流确实需要很长时间。在我的8 GB笔记本电脑上,大约需要1.5个小时。但是,您的安装时间可能会有所不同,并且会受到可用内存的严重影响。这些编译会占用大量RAM。为了减少资源需求并可能防止冻结,可以通过在“ bazel build”之后添加以下标志来运行编译:--local_resources 2048,.5,1.0这通常有助于冻结,但可能会使编译时间加倍。例如:在我的较快系统之一上,不带标志的编译花费2200秒,而带标志4500!
Thornhale

1
总的来说,我发现在Windows上执行ML背后的工作非常痛苦。您最终将花费大量时间来尝试使工作正常,如果您在linux环境中工作,那将是正常的。我相信需要为每个OS编译tensorflow。此外,如果您转到此处:link,您将看到tensorflow不受官方支持。确实存在一些有关如何为Windows编译tensorflow的指南:link。尽管我必须承认,但我还没有尝试过。我只是在用ubuntu。
Thornhale

25

这些是SIMD 向量处理指令集

对于许多任务,使用矢量指令更快。机器学习就是这样的任务。

引用tensorflow安装文档

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


为什么Tensorflow二进制文件不使用CPU调度?海湾合作委员会对这的支持不佳吗?
克里斯·普希布雷

4
链接“ tensorflow安装文档”不起作用。所以我想知道这个答案是否仍然有效。请回复!
Thornhale

@ChrisPushbullet您可以编译Tensorflow以支持GPU的几种不同的计算功能,但是它们会大大增加二进制文件的大小。我的猜测是对于CPU也是一样。
Davidmh,

22

由于有了所有这些答复以及一些尝试和错误,我设法通过安装在Mac上clang。因此,只是分享我的解决方案,以防它对某人有用。

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

  2. 当提示您输入

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

然后复制粘贴此字符串:

-mavx -mavx2 -mfma -msse4.2

(默认选项会导致错误,其他一些标志也会导致错误。上述标志我没有任何错误。顺便说一句,我回答n了所有其他问题)

安装后,在针对基于默认轮子的其他安装进行深度模型训练时,我验证了约2倍至2.5倍的加速- 在macOS上安装TensorFlow

希望能帮助到你


4
-march=native如果您的编译器正确支持,它应该会更好。它还可以-mtune=native为您的CPU做出良好的指令选择。例如,在Haswell及更高版本上,它会禁用-mavx256-split-unaligned-store-mavx256-split-unaligned-load,默认情况下会启用和,并且在-mtune=generic未知数据对齐但最终在运行时会损害性能。
彼得·科德斯

1
谢谢!在我的情况下-march=native导致错误,而其他选项则没有。也许是特定的编译器。我只是在分享这些内容,以防其他人遇到相同的障碍。
JARS

1
什么错 除非构建系统在其中包含一个字符串的情况下使之阻塞=,或者您不使用gccor clang,否则它将正常工作。而且确实-mtune=native -mavx2 -mfma 为你工作?还是-mtune=skylake?(或您拥有的任何CPU)。顺便说一句,-mavx2意味着-mavx-msse4.2。将它们全部包含在配方中并没有什么坏处,而且我认为这使人们可以更轻松地省去其CPU不支持的内容。
彼得·科德斯

1
不久前,我已经编辑了该问题的最佳答案,但我自己没有使用tensorflow。如果-march=native其构建系统有问题,我想知道。(和/或您应该在上游报告它,以便他们可以修复其构建脚本)。
彼得·科德斯

1
非常感谢您的建议。为了进行检查,我只使用来重新运行.configure脚本,-march=native这是错误:/ Users / jose / Documents / code / tmptensorflow / tensorflow / tensorflow / core / BUILD:1442:1:C ++编译规则'// tensorflow / core:lib_internal_impl'失败(出口1)。在tensorflow / core / platform / denormal.cc:37包含的文件中:/Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2:错误: “SSE3指令集未启用” #ERROR“SSE3指令集未启用”使用苹果LLVM 7.0.2版(铛-700.1.81)
JARS

7

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

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

  1. 安装挡板

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

  1. 安装Tensorflow

克隆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
  1. 点子包。要构建它,您必须描述所需的指令(您知道,那些Tensorflow通知您丢失了)。

构建点子脚本: 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

构建点子包: 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时,它将不再抱怨缺少指令。


4
用just建立-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选项的人编写的。
彼得·科德斯

1
@PeterCordes,看看这个问题(github.com/tensorflow/tensorflow/issues/7449),即使是淡淡的维护者也没有断言为什么march = native不能按预期工作。正如您似乎“了解gcc选项”一样,您可能可以帮助他们修复它,因为他们将问题标记为需要“社区支持”。
爱德华多

谢谢,我来看一下...嗯,有人说这没用--copt=-mavx2如果 --copt=-mfma有效,则--copt=-march=native应该起作用,除非解析=存在问题。对于gcc / clang / icc,您肯定希望构建脚本最终传递-march=native给编译器。通过构建脚本使之成为现实。
彼得·科德斯

7

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

它对速度有重大影响。以我为例,培训时间几乎减少了一半。

参考 Tensorflow的自定义构建



@SreeraghAR您的方法降低了我的tensorflow和keras。
毕马威(KPMG)'18

请确保根据TensorFlow,Python版本和硬件安装正确的文件。
Sreeragh AR

@SreeraghAR TensFlow版本为1.10.0并使用MacOS Sierra。帮助我找到文件。
毕马威(KPMG)'18

嗯..找不到与您的版本相对应的版本。有人必须制造一个定制轮。github.com/yaroslavvb/tensorflow-community-wheels 立即解决方案可以使用Tensorflow 1.9.0
Sreeragh AR


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


1
最近有什么变化吗?最后我检查--copt="-march=native"是吃了=。(顺便说一句,那些双引号不会做任何事情;在bazel看到您的命令行之前,它们会被外壳删除。)
Peter Cordes

4

2.0兼容解决方案:

在Terminal(Linux / MacOS)或Command Prompt(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

2
其中的哪一部分指定-march=native,或其他GCC / clang选项?我没有在其中提及AVX,FMA或SSE4.2。(而且Bazel或Tensorflow的构建脚本是否仍以只能选择-mavx工作之类的方式破坏,而不是-march=native?如果这就是这个问题的最高答案的问题所在)
Peter Cordes

对于tf 2.1.0版的CPU支持,选项--config = opt对我不起作用,我使用--config = v2解决了该问题。同样值得一提的是,构建它的正确bazel版本是29.0。
托里克

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,则可以考虑提供更具体的优化标志,如gcc文档中所述

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


-1

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

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

5
静默地运行速度比硬件上的速度慢似乎是一个坏主意。
彼得·科德斯

我总体上同意@Peter Cordes的观点-但有时(以有纪律的,专心的方式)隐藏警告并专注于任务非常好。
西行者

2
@westsider:是的,在某些情况下可能会有用,但这不是一个好的答案,除非它指出了含义:如果仅隐藏警告而不是重新编译,就会损失真正的性能。(除非您可能正在使用GPU进行繁重的工作,否则它可能还会警告CPU选项吗?)
Peter Cordes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.