【问题标题】:tensorflow: "trying to mutate a frozen object", bazeltensorflow:“试图改变一个冻结的对象”,bazel
【发布时间】:2017-12-07 05:32:30
【问题描述】:

MacOS 高山,MBP 2016,在终端。

我按照这里的指示进行操作: https://github.com/tensorflow/models/tree/master/research/syntaxnet ./configure 的所有选项都选择为默认值(并且所有 python 目录都经过双重检查。)。在此之前所有步骤都已完成:

bazel test ...
# On Mac, run the following:
bazel test --linkopt=-headerpad_max_install_names \
  dragnn/... syntaxnet/... util/utf8/...

我假设我应该运行后一行(“bazel test --linkopt”等)。但有趣的是,我得到了相同的结果。

这会引发大约 10 个错误,每个错误都是相同类型的“试图改变冻结的对象”,并得出测试未运行、加载包 dragnn/protos 错误和无法开始构建的结论。

这是错误的一般形式:

syntaxnet>> bazel 测试 --linkopt=-headerpad_max_install_names dragnn/...syntaxnet/...util/utf8/...

.

错误: /Users/XXX/Desktop/NLP/syntaxnet/models/research/syntaxnet/dragnn/protos/BUILD:35:1: Traceback(最近一次通话最后一次):文件 "/Users/XXX/Desktop/NLP/syntaxnet/models/research/syntaxnet/dragnn/protos/BUILD", 第 35 行 tf_proto_library_py(name = "data_py_pb2", srcs = ["dat..."]) 文件 "/Users/XXX/Desktop/NLP/syntaxnet/models/research/syntaxnet/syntaxnet/syntaxnet.bzl", 第 53 行,在 tf_proto_library_py py_proto_library(name = name, srcs = srcs, srcs_versi...", ) 文件 "/private/var/tmp/_bazel_XXX/f74e5a21c3ad09aeb110d9de15110035/external/protobuf_archive/protobuf.bzl", 第 374 行,在 py_proto_library py_libs += [default_runtime] 试图 变异一个冻结的对象错误:包包含错误:dragnn/protos


... [各种 'name = "...pb2"' 文件的相同错误] ...

信息:已用时间:0.709 秒失败:构建未成功完成 (已加载 17 个包)错误:无法开始构建。无法运行 测试

知道这是怎么回事吗?谢谢。

【问题讨论】:

  • 你的 bazel 版本是什么?你是怎么安装的?
  • 询问,因为有 this issue 已于 2017 年 11 月 1 日修复
  • brew install bazel
  • 会检查一下。谢谢!!!我今晚做了 brew install 和 brew upgrade ,所以不确定修复该问题的提交是否被我的安装捕获。我会查明真相的。谢谢。
  • 是的,你可以从源代码as described here 编译,但不是下载你需要从 git 克隆的包

标签: python macos tensorflow bazel


【解决方案1】:

此错误表明py_proto_library 规则实现中存在错误。

tf_proto_library_pysyntaxnet.bzl 中定义。它是py_proto_library 的包装,由tf_workspace 宏的protobuf_archive 规则定义。

“protobuf_archive”下载 Protobuf 3.3.0,其中包含 //:protobuf.bzl 和错误的 py_proto_library 规则实现:在第 374 行中,它尝试改变不可变对象 py_libs

确保您使用最新的 Bazel 版本,目前是 0.8.1。

如果问题仍然存在,那么:

  • 我建议通过以下方式提交错误:

    • Protobuf,修复 py_proto_library 规则
    • TensorFlow,在tf_workspace 中更新他们的 Protobuf 版本,以及
    • Syntaxnet 将 //research/syntaxnet 中的 TF 子模块引用更新为已修复错误的版本。
  • 作为一种解决方法,也许您可​​以修补 protobuf.bzl

补丁是改变这些行:

   373    if default_runtime and not default_runtime in py_libs + deps:
   374      py_libs += [default_runtime]
   375
   376    native.py_library(
   377        name=name,
   378        srcs=outs+py_extra_srcs,
   379        deps=py_libs+deps,
   380        imports=includes,
   381        **kargs)

对这些:

   373    if default_runtime and not default_runtime in py_libs + deps:
   374      py_libs2 = py_libs + [default_runtime]
   375    else:
   376      py_libs2 = py_libs
   377
   378    native.py_library(
   379        name=name,
   380        srcs=outs+py_extra_srcs,
   381        deps=py_libs2+deps,
   382        imports=includes,
   383        **kargs)

免责声明:这是一个“盲目”修复;没试过好不好用。

【讨论】:

  • 昨晚我编译了一个 0.8.1 的新二进制文件,得到了同样的错误,所以今晚我将尝试这个“盲目修复”。谢谢建议!!!
  • 这让我克服了那个错误;关于 cc_libs += [default_runtime] 存在以下几乎相同的错误,然后是 apple_cc_toolchain Xcode 版本的错误,然后是“execvp(external/local_config_cc/wrapped_clang, ...)”:权限被拒绝,然后是另一个和另一个。只是一个兔子洞。
  • 你走了多远?
  • 我清理了所有内容,回到推荐的 Bazel 0.5.4,并再次执行所有步骤。 Syntaxnet 最终编译,但运行例如 demo.sh --conll 使其崩溃,教程在 import graph_builder 方面存在大量问题,等等。目前在 Docker 容器中进行开发,这很痛苦,但我会尽快再次尝试编译。
【解决方案2】:
Tried same pattern patch for cc_libs. 

  if default_runtime and not default_runtime in cc_libs:
    cc_libs2 = cc_libs + [default_runtime]
  else:
    cc_libs2 = cc_libs
  if use_grpc_plugin:
    cc_libs += ["//external:grpc_lib"]

  native.cc_library(
      name=name,
      srcs=gen_srcs,
      hdrs=gen_hdrs,
      deps=cc_libs2 + deps,
      includes=includes,
      **kargs)

显示新错误,但继续编译。 (Linux 的 Windows 系统上的 Ubuntu 16——别问,原生 tensorflow 1.4 winx64 可以工作,但语法网不行)。

greg@FX11:/mnt/c/code/models/research/syntaxnet$ bazel test ... 错误:/home/greg/.cache/bazel/_bazel_greg/adb8eb0eab8b9680449366fbebe59ec2/external/org_tensorflow/tensorflow/core/kernels/BUILD:451:1:在_transitive_hdrs规则@org_tensorflow//tensorflow/core/kernels:bounds_check_lib_gather: 回溯(最近一次通话最后): 文件“/home/greg/.cache/bazel/_bazel_greg/adb8eb0eab8b9680449366fbebe59ec2/external/org_tensorflow/tensorflow/core/kernels/BUILD”,第 451 行 _transitive_hdrs(name = 'bounds_check_lib_gather') _transitive_hdrs_impl 中的文件“/home/greg/.cache/bazel/_bazel_greg/adb8eb0eab8b9680449366fbebe59ec2/external/org_tensorflow/tensorflow/tensorflow.bzl”,第 869 行 设置()

刚刚将 set() 更改为 depset() ,这似乎避免了错误。

【讨论】:

    【解决方案3】:

    长话短说。我受到sstrasburg 的评论的启发。

    首先,卸载新版本的 bazel。

    brew uninstall bazel
    

    here下载bazel 0.5.4。

    chmod +x bazel-0.5.4-without-jdk-installer-darwin-x86_64.sh
    ./bazel-0.5.4-without-jdk-installer-darwin-x86_64.sh
    

    之后,再次运行

    bazel test --linkopt=-headerpad_max_install_names dragnn/... syntaxnet/... util/utf8/...
    

    终于找到了

    执行了 57 个测试中的 57 个:57 个测试通过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2016-11-11
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多