Docker 如何在tensorflow服务器上使用自定义操作

Docker 如何在tensorflow服务器上使用自定义操作,docker,tensorflow,tensorflow-serving,custom-operator,Docker,Tensorflow,Tensorflow Serving,Custom Operator,让tensorflow模型服务器识别我的自定义操作的理想方法是什么 我有一个按照本指南编写的自定义操作: 我可以通过调用tf.load\u op\u library使用opp,但当我尝试运行tensorflow\u model\u服务器时 tensorflow_model_server --port=9000 \ --model_name=mymodel \ --model_base_path=/s

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

我有一个按照本指南编写的自定义操作:

我可以通过调用
tf.load\u op\u library
使用opp,但当我尝试运行
tensorflow\u model\u服务器时

tensorflow_model_server --port=9000 \
                        --model_name=mymodel \
                        --model_base_path=/serving/mymodel
由于找不到我的opp,我出现以下错误

tensorflow_serving/util/retrier.cc:37]正在加载可服务:{name: mymodel版本:1}失败:找不到:Op类型未注册“MyApp” 在c37a4ef2d4b4上运行的二进制文件


您是否将op lib添加到要调用它的构建文件中?

以下是我希望对op执行的操作: -生成python包装器 -在pip包中添加op-too -将我的操作链接到tensorflow,以便tensorflow服务可以执行该操作

我把我的op放在tensorflow/contrib/foo中。下面是源代码树的样子

.
├── BUILD
├── LICENSE
├── __init__.py
├── foo_op.cc
├── foo_op_gpu.cu.cc
└── foo_op.h
我的
\uuuu init\uuuuuu.py
文件已导入生成的包装器

from tensorflow.contrib.sampling.ops.gen_foo import *
我在
tensorflow/contrib/\uuuu init\uuuuu.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_内核
      添加到
      contrib_内核
      deps
    • foo_op_lib
      添加到
      contrib_op_lib
      deps
    • foo
      添加到
      contrib_py
      deps
  • tensorflow/tools/pip_包/构建
    • 将我的python目标添加到
      COMMON\u PIP\u DEPS
  • tensorflow/core/BUILD
    • 将我的内核添加到
      所有静态链接的内核中
      。我可能有点过火了,但它奏效了
以下是tensorflow服务bazel文件:

  • WORKSPACE
    • org\u tensorflow
      更改为指向我的tensorflow的
      local\u存储库,而不是谷歌的
      tensorflow\u http\u存档

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

您也可以将tensorflow用作子模块或本地存储库,以便在repo中为您的操作使用自定义宏。

下面是一个描述如何做到这一点的文档:

底线是,您需要重建tensorflow_model_服务器,并将op链接到中。 tensorflow_服务/模型_服务器/构建:

SUPPORTED_TENSORFLOW_OPS = [
    ...
    "//tensorflow_serving/.../...your_op"
]

作为旁白,我在tensorflow的定制op回购上问了一个类似的问题,谢谢你们的建议让我开始了。我必须再做一些bazel的事情才能让一切正常工作。yifeif,你能提供一个这样的例子吗?我也想看一个这样的例子:)听起来更干净/更容易。你对这些步骤有详细的解释吗?一个完整的例子可能更好?谢谢