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

这是从运行脚本以检查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编译?
参考资料:
Stack Overflow
收藏
评论
共 10 个回答
高赞 时间 活跃

我只是遇到了同样的问题,似乎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位二进制文件。)

我不确定-O2-O3 TensorFlow的默认值是什么。 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的./configure默认启用-march=native ,因此使用它应该避免手动指定编译器选项。

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

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

收藏
评论

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
收藏
评论

由于所有这些答复以及一些试验和错误,我设法将其安装在具有clang的Mac上。因此,只要分享我的解决方案以防某人有用。

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

  2. 当提示您输入

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

然后复制粘贴此字符串:

-mavx -mavx2 -mfma -msse4.2

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

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

希望能帮助到你

收藏
评论

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

它对速度有重大影响。就我而言,培训所需的时间几乎减少了一半。

参考Tensorflow的自定义构建

收藏
评论

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


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

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

好消息是, 您很可能只想学习TF或进行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

收藏
评论

要使用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. 安装挡板

从其可用版本之一下载它,例如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通知您丢失了)。

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

收藏
评论

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

如果要在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分钟。

收藏
评论

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

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

收藏
评论

这些是SIMD 向量处理指令集

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

引用tensorflow安装文档

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号