TensorFlow GPU编译标志?

时间:2018-10-24 21:05:06

标签: tensorflow gpu nvidia

当在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

这主要基于互联网上的普遍投票,这使我感到不舒服。以下是所咨询的一些网站/帖子,使我做出了这些选择:

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

Re-build Tensorflow with desired optimization flags 具有:

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 GitHub,但未找到与此主题相关的任何内容。

2 个答案:

答案 0 :(得分:0)

1)bazel将标志传递给gcc。有关确切含义,请参见GCC文档。例如,对于int[] counts = new int[100]; for (int i = 1; i <= 1000; i++) { counts[(int)(Math.random() * 100)]++; } System.out.println("Count for each number between 0 and 9:"); for (int i = 0; i < 10; i++) { System.out.println(i + "s: " + counts[i]); } ,看到类似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)是,请参见上文。

答案 1 :(得分:0)

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