tensorflow:“试图改变一个冻结的物体”,bazel

时间:2017-12-07 05:32:30

标签: python macos tensorflow bazel

MacOS high sierra,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 test --linkopt = -headerpad_max_install_names   dragnn / ... syntaxnet / ... util / utf8 /...

     

     

错误:   /用户/ XXX /桌面/ NLP / syntaxnet /模型/科研/ syntaxnet / dragnn / PROTOS / BUILD:35:1:   Traceback(最近一次调用最后一次):文件   “/用户/ XXX /桌面/ NLP / syntaxnet /模型/科研/ 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 ...“,< 5 more arguments>)文件   “/private/var/tmp/_bazel_XXX/f74e5a21c3ad09aeb110d9de15110035/external/protobuf_archive/protobuf.bzl”   第374行,在py_proto_library py_libs + = [default_runtime]中尝试   变异冻结对象错误:包含错误:dragnn / protos

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

  

信息:已用时间:0.709s未成功:构建未成功完成   (已加载17个包)错误:无法启动构建。无法运行   测试

任何想法可以做到这一点?感谢。

3 个答案:

答案 0 :(得分:6)

此错误表示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版本
    • 语法网将//research/syntaxnet中的TF子模块引用更新为bugfixed版本。
  • 作为一种解决方法,也许您可​​以修补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)

免责声明:这是一个“盲目”修复;我还没有尝试过是否有效。

答案 1 :(得分:0)

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有效,但不是syntaxnet)。

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:in _transitive_hdrs rule @ org_tensorflow // tensorflow / core / kernels:bounds_check_lib_gather: Traceback(最近一次调用最后一次):         文件“/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(),这似乎避免了错误。

答案 2 :(得分:0)

长话短说。我受到了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次测试通过。