TensorFlow GPU 编译标志?

TensorFlow GPU compile flags?

我正在寻找有关在 Ubuntu 18.04 上将 TensorFlow 与 NVIDIA GPU 结合使用时编译标志选项的说明。我将 TensorFlow 用于 Python(用于训练)和从 C++ 调用(用于在生产中执行)。

因为 Ubuntu 18.04 附带 GCC 7.x 我必须使用 CUDA 9.2,所以我不能使用 Google 提供的 TensorFlow 预编译二进制文件(那些目前只能工作使用不符合 GCC 7.x 的 CUDA 9.0)。因此,我必须从源代码编译 TensorFlow 才能与 Python 和 C++

一起使用

目前我正在使用以下编译标志:

Python 编译:

bazel build --config=opt \
            --config=cuda //tensorflow/tools/pip_package:build_pip_package

C++编译:

bazel build -c opt \
            --copt=-mavx \
            --copt=-mavx2 \
            --copt=-mfma \
            --copt=-mfpmath=both \
            --copt=-msse4.2 \
            --config=cuda //tensorflow:libtensorflow_cc.so

这主要基于互联网上的大众投票,这让我感到不舒服。以下是 sites/posts 参考的一些内容,它们让我做出了这些选择:

https://www.tensorflow.org/install/source 有:

bazel build --config=opt \
            --config=cuda //tensorflow/tools/pip_package:build_pip_package

http://www.bitbionic.com/2017/08/18/run-your-keras-models-in-c-tensorflow/ 有:

bazel build --jobs=6 \
            --verbose_failures \
            -c opt \
            --copt=-mavx \
            --copt=-mfpmath=both \
            --copt=-msse4.2 //tensorflow:libtensorflow_cc.so

How to compile Tensorflow with SSE4.2 and AVX instructions? 有:

bazel build -c opt \
            --copt=-mavx \
            --copt=-mavx2 \
            --copt=-mfma \
            --copt=-mfpmath=both \
            --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

有:

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

有人可以告诉我们这些标志选项吗?具体我有以下问题:

1) mavxmavx2mfmamfpmath 标志是什么?这些应该用于 Python 和 C++ 编译还是仅用于 C++ 编译? Google 演练没有将这些用于 Python 编译这一事实使我倾向于相同的。

2) 显然--copt=-msse4.2是为Intel CPU启用SSE优化而--config=cuda是为CUDA GPU启用,但是CUDA末尾的-k选项是什么旗帜?请注意,上面的一些示例使用了 -k 选项,而有些则没有。

3) 是否有记录这些选项的地方?我想知道是否还有其他可能有益的标志,或者是否应省略上述某些标志。我检查了 TensorFlow 和 Bazel GitHubs,没有找到关于这个主题的任何内容。

1) bazel 将标志传递给 gcc。有关确切含义,请参阅 GCC 文档。例如,对于 fpmath,请参见 https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/i386-and-x86_002d64-Options.html。当您知道 CPU 您将 运行 上的二进制文件支持这些选项时,您应该使用它们。随处使用它们应该不会有什么坏处。

2) -k 是此处记录的 bazel 标志:https://docs.bazel.build/versions/master/user-manual.html#flag--keep_going

3) 是的,见上文。

从 gcc 文档看来,tensorflow 默认值 -march=native 是利用处理器的所有功能所必需的。这可能比手动设置这些优化标志更好,因为您可能会遗漏一些。