我正在尝试提供从syntaxnet导出的模型,但是parser_ops不可用。找到带有ops的库文件(out-of-tree):
../models/syntaxnet/bazel-out/local-opt/bin/syntaxnet/parser_ops.so
我目前正在攻击mnist_inference示例,(因为我不知道如何使用bazel在树外构建任何东西),而我正在运行的命令是:
./bazel-out/local-opt/bin/tensorflow_serving/example/mnist_inference --port=9000 /tmp/model/00000001
我得到的错误是:
F tensorflow_serving/example/mnist_inference.cc:208] Check failed: ::tensorflow::Status::OK() == (bundle_factory->CreateSessionBundle(bundle_path, &bundle)) (OK vs. Not found: Op type not registered 'FeatureSize')
FeatureSize肯定是在parser_ops.so中定义的,我只是不知道如何加载它。
答案 0 :(得分:3)
我不太熟悉TF(我在Bazel上工作),但看起来你需要添加parser_ops作为mnist_inference的依赖。
有一种正确的方法可以做到这一点并采用错误的(更简单的)方式。
基本上,您将syntaxnet添加为您正在构建的示例的依赖项。不幸的是,语法网项目和tensorflow服务项目以不同的名称导入tensorflow本身,所以你必须对服务的WORKSPACE文件进行一些修改以使其工作。
将以下内容添加到tensorflow_serving WORKSPACE文件中:
local_repository(
name = "syntaxnet",
path = "/path/to/your/checkout/of/models/syntaxnet",
)
这允许您从tensorflow项目中引用syntaxnet中的目标(通过在其前面添加" @ syntaxnet")。不幸的是,如上所述,您还必须将所有syntaxnet的外部依赖项放入WORKSPACE文件中,这很烦人。您可以测试它是否使用bazel build @syntaxnet//syntaxnet:parser_ops_cc
。
完成后,将cc_library @syntaxnet//syntaxnet:parser_ops_cc
(parser_ops.so是一个cc_binary,不能用作依赖项)添加到mnist_inference's deps:
deps = [
"@syntaxnet//syntaxnet:parser_ops_cc",
"@grpc//:grpc++",
...
请注意,这仍然无法完成:parser_ops_cc
是syntaxnet中的私有目标(因此无法从其包外部依赖)但您可以为其添加属性比如visibility = ["//visibility:public"]
,如果您只是尝试一下:
cc_library(
name = "parser_ops_cc",
srcs = ["ops/parser_ops.cc"],
visibility = ["//visibility:public"]
...
你有一个.so,你可以为你的二进制文件添加一个src文件。将其所在的目录添加为new_local_repository()
,并将其添加到BUILD文件中的srcs
。
WORKSPACE文件:
new_local_repository(
name = "hacky_syntaxnet",
path = "/path/to/syntaxnet/bazel-out/local-opt/bin/syntaxnet",
build_file_content = """
exports_files(glob(["*"])) # Make all of the files available.
""",
)
构建文件:
srcs = [
"mnist_inference.cc",
"@hacky_syntaxnet//:parser_ops.so"
],