3

我正在尝试提供从 syntaxnet 导出的模型,但 parser_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中定义的,只是不知道怎么加载。

4

1 回答 1

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 的 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 文件。将它所在的目录添加为 anew_local_repository()并将其添加到srcsBUILD 文件中。

工作区文件:

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"
],
于 2016-06-13T22:23:36.013 回答