【问题标题】:Building Tensorflow with LTCG使用 LTCG 构建 TensorFlow
【发布时间】:2019-07-17 19:04:06
【问题描述】:

我正在尝试使用启用了 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 的经验?

【问题讨论】:

    标签: windows tensorflow bazel


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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 工具文件夹,因为 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 也会改变输出对象文件的格式。

      【讨论】:

        猜你喜欢
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 2019-11-19
        • 2019-09-03
        相关资源
        最近更新 更多