Как использовать пользовательские операции с тензорным сервером
Каков идеальный способ, чтобы сервер модели tenorflow распознал мою пользовательскую операцию?
У меня есть пользовательская операция, написанная после этого руководства: https://www.tensorflow.org/guide/extend/op
Я могу использовать OPP, позвонив tf.load_op_library
, но когда я пытаюсь бежать tensorflow_model_server
tensorflow_model_server --port=9000 \
--model_name=mymodel \
--model_base_path=/serving/mymodel
Я получаю следующую ошибку из-за невозможности найти мой опп.
tenorflow_serving/util/retrier.cc:37] Загрузка, обслуживаемая: {name: mymodel version: 1} завершилась неудачно: не найдено: тип операции не зарегистрирован "MyOpp" в двоичном файле, работающем на c37a4ef2d4b4.
1 ответ
Вот то, что я хотел сделать с моей операцией: - генерировать оболочки Python - также добавить операцию в пакет pip - связать мою операцию с tenorflow, чтобы обслуживание тензорного потока могло выполнить операцию
Я поместил свою операционную систему в tenorflow/contrib/foo. Вот как выглядит исходное дерево
.
├── BUILD
├── LICENSE
├── __init__.py
├── foo_op.cc
├── foo_op_gpu.cu.cc
└── foo_op.h
мой __init__.py
файл имел импорт для сгенерированных оболочек
from tensorflow.contrib.sampling.ops.gen_foo import *
Я добавил импорт в tensorflow/contrib/__init__.py
from tensorflow.contrib import foo
Вот мой tensorflow/contrib/foo/BUILD
файл:
licenses(["notice"]) # Apache 2.0
exports_files(["LICENSE"])
package(default_visibility = ["//visibility:public"])
load("//tensorflow:tensorflow.bzl", "tf_custom_op_py_library")
load("//tensorflow:tensorflow.bzl", "tf_gen_op_libs")
load("//tensorflow:tensorflow.bzl", "tf_gen_op_wrapper_py")
load("//tensorflow:tensorflow.bzl", "tf_kernel_library")
tf_kernel_library(
name = "foo_op_kernels",
prefix = "foo",
alwayslink = 1,
)
tf_gen_op_libs(
op_lib_names = ["foo"],
)
tf_gen_op_wrapper_py(
name = "foo",
visibility = ["//visibility:public"],
deps = [
":foo_op_kernels",
],
)
tf_custom_op_py_library(
name = "foo_py",
srcs = [
"__init__.py",
],
kernels = [
":foo_op_kernels",
],
srcs_version = "PY2AND3",
deps = [
":foo",
"//tensorflow/contrib/util:util_py",
"//tensorflow/python:common_shapes",
"//tensorflow/python:framework_for_generated_wrappers",
"//tensorflow/python:platform",
"//tensorflow/python:util",
],
)
Вот файлы базы тензорного потока, к которым я должен был прикоснуться, чтобы заставить его работать.
tensorflow/contrib/BUILD
- добавлять
foo_op_kernels
вcontrib_kernels
Deps - добавлять
foo_op_lib
вcontrib_ops_op_lib
Deps - добавлять
foo
вcontrib_py
Deps
- добавлять
tensorflow/tools/pip_package/BUILD
- Добавил мою цель Python в
COMMON_PIP_DEPS
- Добавил мою цель Python в
tensorflow/core/BUILD
- Добавил мои ядра в
all_kernels_statically_linked
, Я мог бы переборщить с этим, но это сработало.
- Добавил мои ядра в
Вот тензорный поток, обслуживающий файлы Bazel:
WORKSPACE
- + Изменить
org_tensorflow
бытьlocal_repository
указывая на мой тензор потока, а не в Googletensorflow_http_archive
- + Изменить
Затем я изменил: tensorflow_serving/tools/docker/Dockerfile.devel-gpu
клонировать мои версии тензорного потока и тензорного потока.
Вот документ, описывающий, как это сделать: https://www.tensorflow.org/tfx/serving/custom_op
Суть в том, что вам нужно перестроить tensorflow_model_server с вашей операцией, связанной в. Tensorflow_serving/model_servers/BUILD:
SUPPORTED_TENSORFLOW_OPS = [
...
"//tensorflow_serving/.../...your_op"
]
Вы добавили свою операционную библиотеку в файл BUILD, где хотите ее вызвать?
Вы также можете использовать tenorflow в качестве подмодуля или local_repository для использования пользовательских макросов в репозитории для ваших операций.