这是运行脚本检查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,

什么是SSE4.2和AVX? 这些SSE4.2和AVX如何提高Tensorflow任务的CPU计算。 如何使用这两个库使Tensorflow编译?


当前回答

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

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

其他回答

我编译了一个小型的Mac Bash脚本(很容易移植到Linux)来检索所有CPU特性,并应用其中的一些来构建TF。我在TF大师和使用有点经常(一对夫妇在一个月)。

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

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

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

引用tensorflow安装文档:

为了与尽可能多的机器兼容,TensorFlow默认只在x86机器上使用SSE4.1 SIMD指令。大多数现代pc和mac都支持更高级的指令,所以如果您正在构建一个只在您自己的机器上运行的二进制文件,您可以在bazel构建命令中使用——copt=-march=native来启用这些指令。

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

Bazel build -config=mkl ——配置= "选择" ——科普特人=“3 = broadwell” ——科普特人= " o3 " / / tensorflow /工具/ pip_package: build_pip_package

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

我刚刚遇到了同样的问题,似乎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=两者只适用于gcc,不适用于clang。-mfpmath=sse可能同样好,如果不是更好的话,它是x86-64的默认值。32位构建默认为-mfpmath=387,因此更改它将有助于32位。(但如果你想要高性能的数字运算,你应该构建64位二进制文件。)

我不确定TensorFlow默认的-O2或-O3是什么。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