我想将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)
我很难解压缩和调试predict_pb2.PredictRequest()
正在做的事情,因为它是由Bazel生成的。但我想重新指出一个完全不同的,保存的模型,以及它自己的.pb文件等。
如何引用其他已保存的模型?
答案 0 :(得分:8)
PredictionService,定义为here,是gRPC API服务定义,它声明了服务器将响应的RPC函数。从这个原型开始,bazel / protoc可以生成将在服务器和客户端链接的代码(您提到的predict_pb2)。
服务器扩展自动生成的服务here,并为每个函数提供实现。
Python客户端使用提供的predict_pb2并使用它来构建请求并使用正确的API发送RPC。
predict_pb2.PredictRequest()
是一个PredictRequest proto定义here,它是Predict()API调用的请求类型(请参阅上面链接的PredictService Proto定义)。代码的那一部分只是构建一个请求,result = stub.Predict(request, 10.0)
是实际发送请求的地方。
为了使用不同的模型,您只需要将ModelSpec的模型名称更改为您的模型。在上面的示例中,服务器加载了名为“inception”的iception模型,因此客户端使用request.model_spec.name = 'inception'
查询它。要改用模型,只需将名称更改为模型名称即可。请注意,您可能还需要将signature_name更改为自定义名称,或者将其完全删除以使用默认签名(假设已定义)。