TensorFlow服务于自定义模型

Nie*_*uin 4 protocol-buffers docker grpc tensorflow tensorflow-serving

我想将TensorFlow服务用于自定义模型(没有预先训练的起点).

我使用Docker通过TensorFlow服务教程的前Kubernetes部分,使用Docker:http://tensorflow.github.io/serving/serving_inception

我(大致)理解Bazel编译是一切工作的核心.但我试图了解生成predict_pb2的tensorflow_serving.apis工作方式,以便我可以交换自己的自定义模型.

需要明确的是,这是什么main在inception_client.py目前的样子:

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)
Run Code Online (Sandbox Code Playgroud)

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

predict_pb2.PredictRequest()由于它是Bazel生成的,我很难解压缩和调试正在做的事情.但是我想重新指出一个完全不同的,已保存的模型,它有自己的.pb文件等.

我如何参考其他保存的模型?

小智 8

这里定义的PredictionService 是gRPC API服务定义,它声明了服务器将响应的RPC函数.从这个原型开始,bazel/protoc可以生成将在服务器和客户端链接的代码(您提到的predict_pb2).

服务器在此处扩展自动生成的服务,并为每个功能提供实现.

Python客户端使用提供的predict_pb2并使用它来构建请求并使用正确的API发送RPC.

predict_pb2.PredictRequest()是这里定义的PredictRequest原型,它是Predict()API调用的请求类型(请参阅上面链接的PredictService Proto定义).代码的这一部分只是构建一个请求,并且result = stub.Predict(request, 10.0)是实际发送请求的地方.

为了使用不同的模型,您只需要将ModelSpec的模型名称更改为您的模型.在上面的示例中,服务器加载了名为"inception"的iception模型,因此客户端使用它进行查询request.model_spec.name = 'inception'.要改用模型,只需将名称更改为模型名称即可.请注意,您可能还需要将signature_name更改为自定义名称,或者将其完全删除以使用默认签名(假设已定义).