如何使用 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"
],
我正在尝试提供从 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"
],