如何使用 tensorflow 服务注册 "custom" Op(实际上,来自 syntaxnet)?

How do I register "custom" Op (actually, from syntaxnet) with tensorflow serving?

我正在尝试提供从 syntaxnet 导出的模型,但 parser_ops 不可用。带有 ops 的库文件位于(树外):

../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里面定义的,就是不知道怎么加载。

我不太熟悉 TF(我在 Bazel 上工作)但看起来你需要添加 parser_ops 作为 mnist_inference.

的依赖项

有正确的方法和错误的(更简单的)方法。

正确的方法

基本上,您将 syntaxnet 添加为您正在构建的示例的依赖项。不幸的是,语法 net 项目和 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

工作区文件:

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