使用 tensorflow serve 提供经过训练的对象检测模型

Serving a trained object detection model with tensorflow serve

我很难为张量流模型提供服务,我已经使用张量流的对象检测从预训练模型中训练出来 API。

我已经使用 model_main.py 脚本训练了一个模型 (Resnet101),性能似乎已准备好用于生产。因此,我创建了一个 docker 容器,其中 运行s tensorflow-serve。我已经设法为在培训过程结束时创建的模型提供服务。我想这个功能是很新的,但似乎 model_main.py 脚本在训练结束时创建了一个 servable。 (我在我的 "train_dir" 中发现了一个名为 "export" 的新文件夹,其中包含一个 saved_model.pb 以及 variables variables.data-00000-of-00001variables.index)。但是,我已经设法为这个模型提供服务,tensorflow_model_server 的输出形式如下所示:

2018-08-29 07:47:50.268810: I tensorflow_serving/core/loader_harness.cc:86] Successfully loaded servable version {name: my_model version: 123}
2018-08-29 07:47:50.271480: I tensorflow_serving/model_servers/main.cc:327] Running ModelServer at 0.0.0.0:8500 ...

所以服务似乎有效。

问题是,我很难通过 python 客户端连接到服务器。我已经修改了 tensorflow serve inception 示例附带的客户端文件,如下所示:

from __future__ import print_function

# This is a placeholder for a Google-internal import.

import grpc
import tensorflow as tf

from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc


tf.app.flags.DEFINE_string('server', 'localhost:9000',
                       'PredictionService host:port')
tf.app.flags.DEFINE_string('image', '', 'path to image in JPEG format')
FLAGS = tf.app.flags.FLAGS

def main(_):
  channel = grpc.insecure_channel(FLAGS.server)
  stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
  # Send request
  with open(FLAGS.image, 'rb') as f:
    # See prediction_service.proto for gRPC request/response details.
    data = f.read()
    request = predict_pb2.PredictRequest()
    request.model_spec.name = 'my_model'
    request.model_spec.signature_name = 'serving_default'
    request.inputs['serialized_example'].CopyFrom(
        tf.contrib.util.make_tensor_proto(data, shape=[1]))
    result = stub.Predict(request, 10.0)  # 10 secs timeout
    print(result)


if __name__ == '__main__':
  tf.app.run()

如果我 运行 这个脚本正确设置了端口,我会从模型服务器内部收到错误消息:

2018-08-29 08:32:48.426016: W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1275] OP_REQUIRES failed at example_parsing_ops.cc:240 : Invalid argument: Could not parse example input, value: '����

客户端returns一些随机二进制字符串。但是明明有连接,请求到达服务器

我好像是客户端的请求有问题,但我不知道如何正确设置。我没有找到有关默认签名密钥的任何信息,model_main.py 脚本用于导出经过训练的模型并尝试通过使用训练检查点和修改后的 exporter.py 脚本创建新的可服务对象失败。

有人知道在这种情况下如何正确设置客户端的请求吗?

您好像在调用 gRPC 端口而不是 REST API 端口。 https://www.tensorflow.org/tfx/serving/docker

Port 8500 exposed for gRPC

Port 8501 exposed for the REST API

我 运行 在处理我的代码库时遇到了完全相同的问题。我找到的解决方案是模型以错误的输入类型导出。在 exporter.py 脚本中,输入的不同选项是 ['image_tensor', 'encoded_image_string_tensor', 'tf_example']。当我导出我的模型时,我设置了 INPUT_TYPE=image_tensor。使用 INPUT_TYPE=encoded_image_string_tensor 导出相同模型后,客户端和服务器通信正常。