使用LTCG构建Tensorflow

时间:2019-07-17 19:04:06

标签: windows tensorflow bazel

我正在尝试使用启用了LTCG(链接时间代码生成)的VS 2017在Windows上构建Tensorflow 1.14。我在构建过程中遇到了崩溃:

external/bazel_tools/tools/def_parser/def_parser.exe bazel-out/x64_windows-opt/bin/tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so.gen.def _sparse_feature_cross_op.so @bazel-out/x64_windows-opt/bin/tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so.gen.def-0.params

ERROR: E:/tensorflow/tensorflow/contrib/layers/BUILD:22:1: DefParser tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so.gen.def failed (Exit -1073741819): def_parser.exe failed: error executing command

我的环境是:

步骤:

set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC
set BAZEL_VC_FULL_VERSION=14.16.27023
set BAZEL_VS=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
python .\configure.py  
<Use all of the defaults>
bazel build -s --config=opt --copt=/GL --linkopt=/LTCG //tensorflow/tools/pip_package:build_pip_package  

我尝试了多种版本的bazel(0.21、0.26、0.27、0.28),并且在更改BAZEL_ *环境变量的同时尝试了VS 2019,但我仍然遇到相同的错误。我已经在本地运行external/bazel_tools/tools/def_parser/def_parser.exe bazel-out/x64_windows-opt/bin/tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so.gen.def _sparse_feature_cross_op.so @bazel-out/x64_windows-opt/bin/tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so.gen.def-0.params命令,它的确崩溃了,并显示-1073741819错误代码。

有没有人有使用LTCG构建Tensorflow或将Bazel与LTCG结合使用的经验?

2 个答案:

答案 0 :(得分:0)

TF 1.14需要Bazel 0.24.1,AFAIK不适用于更新的Bazel版本(> = 0.25)。

我不知道可能是什么问题,但是我可以告诉您如何调试它。

您需要获取Bazel 0.24.1的源代码,将调试日志记录添加到DEF解析器中,从源代码构建Bazel,然后使用生成的二进制代码构建TensorFlow。

要这样做:

  1. 下载Bazel 0.24.1 release
  2. 下载并提取0.24.1 sources OR git clone Bazel的GitHub树并查看0.24.1标签
  3. 将调试日志记录/ printf调用添加到您认为合适的third_party / def_parser / *
  4. 使用0.24.1发行版二进制文件,在修补的源代码树中运行bazel build //src:bazel.exe
  5. 使用生成的bazel-bin\src\bazel.exe构建TensorFlow
  6. 如果您需要添加更多的调试日志记录,请重复步骤3..5

答案 1 :(得分:0)

我刚刚尝试使用带有/GL/LTCG选项的MSVC 2019 v142工具集(精确版本14.25.28610)构建TF 2.2,但出现了相同的错误,但是位置略有不同。这是我的cmd行:

set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC

bazel build --config=opt --config=windows --compilation_mode=opt --strip=always --copt="/MT" --copt="/Oy" --copt="/fp:fast" --copt="/GL" --linkopt="/DEBUG:NONE" --linkopt="/LTCG" --linkopt="/NODEFAULTLIB:msvcrt.lib" --linkopt="/NODEFAULTLIB:vcruntime.lib" --local_ram_resources=6512 --subcommands //tensorflow/tools/lib_package:libtensorflow > out.log 2>&1

我不得不直接指定MSVC tools文件夹,因为Bazel一直尝试使用旧版本,this issue中的详细信息。

这是失败的地方:

SUBCOMMAND: # //tensorflow:tf_custom_op_library_additional_deps.dll [action 'DefParser tensorflow/tf_custom_op_library_additional_deps.dll.gen.def', configuration: e5dbf2de175ef0b99efae20c93576efaae21f61b49e23200be8ee726f25b19c6]
cd C:/users/roman.kruglov/_bazel_roman.kruglov/e5u6xdzn/execroot/org_tensorflow
  SET PATH=C:\Program Files\Git\bin;C:\Program Files\Git\usr\bin;C:\WINDOWS;C:\WINDOWS\System32;C:\WINDOWS\System32\WindowsPowerShell\v1.0
    SET PYTHON_BIN_PATH=C:/Users/roman.kruglov/AppData/Local/Programs/Python/Python37/python.exe
    SET PYTHON_LIB_PATH=C:/Users/roman.kruglov/AppData/Local/Programs/Python/Python37/lib/site-packages
    SET RUNFILES_MANIFEST_ONLY=1
    SET TF2_BEHAVIOR=1
    SET TF_CONFIGURE_IOS=0
    SET TF_ENABLE_XLA=1
  external/bazel_tools/tools/def_parser/def_parser.exe bazel-out/x64_windows-opt/bin/tensorflow/tf_custom_op_library_additional_deps.dll.gen.def tf_custom_op_library_additional_deps.dll @bazel-out/x64_windows-opt/bin/tensorflow/tf_custom_op_library_additional_deps.dll.gen.def-0.params
ERROR: C:/data_d/git/test/tensorflow/tensorflow/BUILD:750:1: DefParser tensorflow/tf_custom_op_library_additional_deps.dll.gen.def failed (Exit -1073741819)

我的猜想当前是-发生这种情况是因为启用/GL后cl.exe会产生不同格式的输出。如here.obj files produced with /GL will not be available to such linker utilities as EDITBIN and DUMPBIN所示。我猜这个DefParser工具无法读取该输出。我将尝试在不启用“全局优化”的情况下进行重建,并分享我的发现。

我想这是行不通的。

P.S。。我尝试使用/ GL进行构建,并且运气不佳。我设法在没有/ GL和很多东西的情况下进行构建。互联网上有几处尝试相似的尝试均以相同的症状失败。

因此,我得出的结论是我的猜测是正确的,并且不可能通过全局优化或链接时间代码生成等来构建TF。我猜想Linux也是如此,因为使用lto也会更改输出目标文件的格式。