这是运行脚本检查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编译?
我刚刚遇到了同样的问题,似乎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。)
多亏了所有这些回复和一些试验和错误,我成功地将它安装在Mac上。所以分享一下我的解,也许对别人有用。
请遵循文档-从源代码安装TensorFlow的说明
当提示
当bazel选项"——config=opt"被指定时,请指定在编译过程中使用的优化标志[默认值是-march=native]
然后复制粘贴这个字符串:
-mavx -mavx2 -mfma -msse4.2
(默认选项会导致错误,其他一些标志也是如此。我没有得到错误与上述标志。顺便说一句,我回答了n个其他问题)
安装后,我验证了在训练深度模型时,相对于基于默认轮子的另一个安装(在macOS上安装TensorFlow),速度提高了~2倍到2.5倍
希望能有所帮助
我刚刚遇到了同样的问题,似乎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。)
当从源代码构建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类型与你将要运行TensorFlow的CPU类型相同,那么你应该接受默认值(-march=native)。这个选项将针对您机器的CPU类型优化生成的代码。
如果你在一种CPU类型上构建TensorFlow,但将在另一种CPU类型上运行TensorFlow,那么可以考虑提供gcc中描述的更具体的优化标志
文档。
在按照前面的项目列表配置TensorFlow之后,您应该能够通过在运行的任何bazel命令中添加——config=opt标志来构建针对目标CPU的完全优化的TensorFlow。