2

让 tensorflow 模型服务器识别我的自定义操作的理想方法是什么?

我按照本指南编写了一个自定义操作: 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

我收到以下关于无法找到我的 opp 的错误。

tensorflow_serving/util/retrier.cc:37] 加载可服务:{名称:mymodel 版本:1} 失败:未找到:操作类型未在 c37a4ef2d4b4 上运行的二进制文件中注册“MyOpp”。

4

4 回答 4

4

以下是我想用我的操作做的事情: - 生成 python 包装器 - 也将操作添加到 pip 包 - 将我的操作链接到 tensorflow,以便 tensorflow-serving 可以执行操作

我将我的操作放在 tensorflow/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 bazel 文件。

  • tensorflow/contrib/BUILD
    • 添加foo_op_kernelscontrib_kernels部门
    • 添加foo_op_libcontrib_ops_op_lib部门
    • 添加foocontrib_py部门
  • tensorflow/tools/pip_package/BUILD
    • 将我的 python 目标添加到COMMON_PIP_DEPS
  • tensorflow/core/BUILD
    • 将我的内核添加到all_kernels_statically_linked. 我可能在这个方面做得过火了,但它奏效了。

以下是 tensorflow 服务 bazel 文件:

  • WORKSPACE
    • 更改org_tensorflowlocal_repository指向我的张量流而不是谷歌的tensorflow_http_archive

然后我修改:tensorflow_serving/tools/docker/Dockerfile.devel-gpu克隆我的 tensorflow 和 tensorflow-serving 版本。

于 2018-12-14T02:29:26.107 回答
1

这是一个描述如何做到这一点的文档:https ://www.tensorflow.org/tfx/serving/custom_op

底线是你需要重建 tensorflow_model_server 并链接你的操作。tensorflow_serving/model_servers/BUILD:

SUPPORTED_TENSORFLOW_OPS = [
    ...
    "//tensorflow_serving/.../...your_op"
]
于 2020-07-14T19:27:44.737 回答
0

您是否在要调用它的 BUILD 文件中添加了您的操作库?

于 2018-11-19T08:13:16.733 回答
0

您还可以使用 tensorflow 作为子模块或 local_repository 来为您的操作使用 repo 中的自定义宏。

于 2019-01-28T21:15:18.293 回答