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

318

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

19
我喜欢使用这些标志进行构建 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 上,与官方版本相比,8k矩阵乘法的CPU速度提高了3倍(0.35 -> 1.05 T ops/sec)。 - Yaroslav Bulatov
4
注意:对于gcc 5或更高版本,TensorFlow网站上提供的二进制pip软件包是使用gcc 4构建的,该软件包使用较旧的ABI。为了使您的构建与较旧的ABI兼容,您需要在bazel构建命令中添加--cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"。ABI兼容性允许针对TensorFlow pip软件包构建的自定义操作继续针对您构建的软件包工作。 - Ivan Kush
5
我有一些编译好的二进制文件,支持这些指令 https://github.com/lakshayg/tensorflow-build。你可能会发现这很有用。 - lakshayg
1
@IvanKush 加入了那个标志后,我仍然无法成功导入tensorflow(编译正常)。如果您已经成功使用gcc 5编译,请参阅:https://dev59.com/q6Tja4cB1Zd3GeqPE6IT?noredirect=1#comment78712788_45877158 - anon01
1
如果使用Ubuntu 16.04,我们在https://github.com/mind/wheels上提供了几乎所有你可能需要的构建版本。 - danqing
显示剩余2条评论
12个回答

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

6
在你的硬件上默默地运行比它本来可以运行更慢,似乎是一个不好的主意。 - Peter Cordes
总的来说,我同意@Peter Cordes的观点——但有时(以有纪律、有心的方式)隐藏警告并专注于任务是不错的。 - westsider
2
@westsider:是的,在某些情况下它可能很有用,但是除非指出其影响,否则这不是一个好答案:如果你只是隐藏警告而不重新编译,那么真正的性能将会丢失。(除非你正在使用GPU进行重型计算,否则它可能仍然会警告CPU选项?) - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接