我对 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()
并将其添加到srcs
BUILD 文件中。
工作区文件:
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"
],