针对自定义模型的TensorFlow Serving

4
我想使用TensorFlow Serving为自定义模型提供服务(没有预训练的起点)。
我已经通过Docker完成了TensorFlow Serving教程中Inception的预-Kubernetes部分:http://tensorflow.github.io/serving/serving_inception 我大致理解Bazel编译是所有工作的核心。但是我试图理解来自tensorflow_serving.apis的生成的predict_pb2是如何工作的,以便我可以换入自己的自定义模型。
明确一下,这是inception_client.py中的main目前的样子:
def main(_):
  host, port = FLAGS.server.split(':')
  channel = implementations.insecure_channel(host, int(port))
  stub = prediction_service_pb2.beta_create_PredictionService_stub(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 = 'inception'
    request.model_spec.signature_name = 'predict_images'
    request.inputs['images'].CopyFrom(
        tf.contrib.util.make_tensor_proto(data, shape=[1]))
    result = stub.Predict(request, 10.0)  # 10 secs timeout
    print(result)

这段代码中的predict_pb2.PredictRequest()是由Bazel生成的,对我来说很难解包并进行调试。但是我想将其重新指向一个完全不同的已保存模型,该模型有自己的.pb文件等。

我应该如何引用一个不同的已保存模型呢?

https://github.com/tensorflow/serving/blob/65f50621a192004ab5ae68e75818e94930a6778b/tensorflow_serving/example/inception_client.py#L38-L52

1个回答

9
PredictionService是一个gRPC API服务定义,它在这里定义了服务器将响应的RPC函数。根据这个proto,bazel/protoc可以生成代码,该代码将链接到服务器和客户端(您提到的predict_pb2)。
服务器扩展了自动生成的服务,在这里提供每个函数的实现。
Python客户端使用提供的predict_pb2构建请求并使用正确的API发送RPC。 predict_pb2.PredictRequest()是在这里定义的PredictRequest proto,它是Predict() API调用的请求类型(请参阅上面链接的PredictService Proto定义)。这部分代码只需构建请求,而result = stub.Predict(request, 10.0)则是实际发送请求的地方。
要使用不同的模型,只需更改ModelSpec的模型名称为您的模型即可。在上面的示例中,服务器加载了名为“inception”的iception模型,因此客户端使用request.model_spec.name = 'inception'查询它。要使用您的模型,只需将名称更改为您的模型名称。请注意,您可能还需要更改signature_name以使用您的自定义名称或完全删除它,以使用默认签名(假设已定义)。

谢谢您回答这个问题,但我仍然有一些关于在服务代码中定义model_spec.name的问题。您能否再解释一下? - BeeNoisy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接