Как мне зарегистрировать "пользовательский" 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"
],
Другие вопросы по тегам