当前位置: 首页 > 知识库问答 >
问题:

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

巩俊远
2023-03-14

这是运行脚本检查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. 这些是怎么做的。2和AVX改进了Tensorflow任务的CPU计算
  3. 如何使用这两个库来编译Tensorflow

共有3个答案

唐俊楚
2023-03-14

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

如果想在conda env中运行自编译版本,可以。以下是我运行的一般说明,以便在系统上安装tensorflow,并附带其他说明。注意:此版本适用于运行Ubuntu16.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%。

最后,请回答第一个问题:

上面已经给出了很多答案。总结一下:AVX,SSE4。1,4。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分钟。

董嘉祯
2023-03-14

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

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

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

好的事情是,最有可能你只是想学习/实验与TF,所以一切都会正常工作,你不应该担心它

什么是SSE4。2和AVX?

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

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

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

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

这些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_包:build_pip_包

柳修为
2023-03-14

我刚刚遇到了同样的问题,似乎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支持包括自动矢量化在内的全面优化,但这有时会降低代码的速度。

它的作用是:--coptforbazel build将一个用于编译C和C文件的选项直接传递给gcc(但不是链接,因此您需要另一个用于跨文件链接时间优化的选项)

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

 类似资料:
  • 问题内容: 这是从运行脚本以检查Tensorflow是否正常运行时收到的消息: 我注意到它提到了SSE4.2和AVX, 什么是SSE4.2和AVX? 这些SSE4.2和AVX如何改善Tensorflow任务的CPU计算。 如何使用这两个库使Tensorflow进行编译? 问题答案: 我只是遇到了同样的问题,似乎的建议并未涵盖SSE4.2支持,添加就足够了。最后,我成功建立了 没有任何警告或错误。

  • 我是TensorFlow的新手。我最近安装了它(Windows CPU版本),收到以下消息: 成功安装TensorFlow-1.4.0 TensorFlow-TensorBoard-0.4.0 RC2 当我想跑的时候 (我是通过https://github.com/tensorflow/tensorflow找到的) 我收到以下消息: 2017-11-02 01:56:21.698935:I C:\

  • 本文向大家介绍如何使用Python使用Tensorflow编译和拟合模型?,包括了如何使用Python使用Tensorflow编译和拟合模型?的使用技巧和注意事项,需要的朋友参考一下 Tensorflow是Google提供的一种机器学习框架。它是一个开放源代码框架,可与Python结合使用,以实现算法,深度学习应用程序等等。它用于研究和生产目的。 它具有优化技术,可帮助快速执行复杂的数学运算。 这

  • 当我尝试在< code>import上设置< code>tensorflow(使用和不使用venv)时,我收到以下错误: 我去了官方网站的错误页面,发现可能是AVX和AVX2指令集支持的问题,为了检查它,建议运行以下代码: 但是当我尝试时,我得到了以下错误: 错误:需要Microsoft Visual C 14.0 我已经(x86、x64)安装了微软视觉 C 可再发行组件。 我认为“找不到C库”可

  • 在导入python2.7中的tenstorflow后,我使用以下命令:

  • 本文向大家介绍Intel指令集中MMX,SSE,SSE2,SSE3和SSE4指的是什么?相关面试题,主要包含被问及Intel指令集中MMX,SSE,SSE2,SSE3和SSE4指的是什么?时的应答技巧和注意事项,需要的朋友参考一下 MMX(Multi Media eXtension,多媒体扩展指令集)是一些整数并行运算指令。 SSE(Streaming SIMD Extensions,单指令多数据