Как мне зарегистрировать "пользовательский" Op (на самом деле, из синтаксиса) с обслуживанием tenorflow?
Я пытаюсь обслуживать модель, экспортированную из синтаксиса, но 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, я просто не знаю, как его загрузить.
1 ответ
Я не слишком знаком с TF (я работаю над Bazel), но похоже, что вам нужно добавить parser_ops как зависимость mnist_inference.
Есть правильный способ сделать это и неправильный (более легкий) способ.
Правильный путь
По сути, вы добавляете синтаксис как зависимость от создаваемого вами примера. К сожалению, проект с синтаксической сетью и проект, обслуживающий тензорный поток, импортируют сам тензорный поток под разными именами, поэтому вам нужно немного поработать над обслуживающим файлом WORKSPACE, чтобы это работало.
Добавьте следующее в файл WORKSPACE tenorflow_serving:
local_repository(
name = "syntaxnet",
path = "/path/to/your/checkout/of/models/syntaxnet",
)
Это позволяет вам ссылаться на цели в синтаксисе из проекта tenorflow (с помощью префикса "@syntaxnet"). К сожалению, как упоминалось выше, вы также должны получить все внешние зависимости синтаксиса в файле WORKSPACE, что раздражает. Вы можете проверить, работает ли он с bazel build @syntaxnet//syntaxnet:parser_ops_cc
,
Как только вы это сделаете, добавьте cc_library @syntaxnet//syntaxnet:parser_ops_cc
(parser_ops.so - это cc_binary, который не может быть использован как зависимость) для deps mnist_inference:
deps = [
"@syntaxnet//syntaxnet:parser_ops_cc",
"@grpc//:grpc++",
...
Обратите внимание, что это все еще не совсем работает: parser_ops_cc
является частной целью в синтаксисе (поэтому на нее нельзя полагаться извне пакета), но вы можете добавить к ней атрибут, например visibility = ["//visibility:public"]
если вы просто пытаетесь
cc_library(
name = "parser_ops_cc",
srcs = ["ops/parser_ops.cc"],
visibility = ["//visibility:public"]
...
Неправильный путь
У вас есть.so, который вы можете добавить файл src для вашего двоичного файла. Добавьте каталог, в котором он находится new_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.
""",
)
Файл BUILD:
srcs = [
"mnist_inference.cc",
"@hacky_syntaxnet//:parser_ops.so"
],