如何使用tensorflow服务注册“自定义”Op(实际上,来自syntaxnet)?

时间:2016-06-13 21:38:18

标签: tensorflow bazel syntaxnet tensorflow-serving

我正在尝试提供从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中定义的,我只是不知道如何加载它。

1 个答案:

答案 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"
],