我正在尝试使用启用了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
我的环境是:
Tensorflow版本:1.14(无源代码编辑)。取自https://github.com/tensorflow/tensorflow.git,分支r1.14
Visual Studio版本:VS 2017
Bazel版本:0.25.2
步骤:
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结合使用的经验?
答案 0 :(得分:0)
TF 1.14需要Bazel 0.24.1,AFAIK不适用于更新的Bazel版本(> = 0.25)。
我不知道可能是什么问题,但是我可以告诉您如何调试它。
您需要获取Bazel 0.24.1的源代码,将调试日志记录添加到DEF解析器中,从源代码构建Bazel,然后使用生成的二进制代码构建TensorFlow。
要这样做:
bazel build //src:bazel.exe
bazel-bin\src\bazel.exe
构建TensorFlow 答案 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也会更改输出目标文件的格式。