用于自定义模型的 TensorFlow Serving
TensorFlow Serving for a custom model
我想将 TensorFlow Serving 用于自定义模型(没有预训练起点)。
我已经完成了 Inception 的 TensorFlow Serving 教程的 Kubernetes 之前的部分,使用 Docker: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 文件等。
如何引用不同的已保存模型?
PredictionService,定义 here,是 gRPC API 服务定义,它声明服务器将响应哪些 RPC 函数。从这个原型中,bazel/protoc 可以生成将在服务器和客户端(您提到的 predict_pb2)中链接的代码。
服务器扩展了自动生成的服务here并为每个功能提供了实现。
Python 客户端使用提供的 predict_pb2 并使用它来构建请求并使用正确的 API.
发送 RPC
predict_pb2.PredictRequest()
是一个定义为 here 的 PredictRequest 原型,它是 Predict() API 调用的请求类型(参见上面链接的 PredictService 原型定义)。这部分代码只是构建一个请求,result = stub.Predict(request, 10.0)
是实际发送请求的地方。
要使用不同的模型,您只需将 ModelSpec 的模型名称更改为您的模型。在上面的示例中,服务器加载了名为 "inception" 的 Iception 模型,因此客户端使用 request.model_spec.name = 'inception'
查询它。要改为使用您的模型,您只需将名称更改为您的模型名称。请注意,您可能还需要将 signature_name 更改为您的自定义名称或将其完全删除以使用默认签名(假设已定义)。
我想将 TensorFlow Serving 用于自定义模型(没有预训练起点)。
我已经完成了 Inception 的 TensorFlow Serving 教程的 Kubernetes 之前的部分,使用 Docker: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 文件等。
如何引用不同的已保存模型?
PredictionService,定义 here,是 gRPC API 服务定义,它声明服务器将响应哪些 RPC 函数。从这个原型中,bazel/protoc 可以生成将在服务器和客户端(您提到的 predict_pb2)中链接的代码。
服务器扩展了自动生成的服务here并为每个功能提供了实现。
Python 客户端使用提供的 predict_pb2 并使用它来构建请求并使用正确的 API.
发送 RPCpredict_pb2.PredictRequest()
是一个定义为 here 的 PredictRequest 原型,它是 Predict() API 调用的请求类型(参见上面链接的 PredictService 原型定义)。这部分代码只是构建一个请求,result = stub.Predict(request, 10.0)
是实际发送请求的地方。
要使用不同的模型,您只需将 ModelSpec 的模型名称更改为您的模型。在上面的示例中,服务器加载了名为 "inception" 的 Iception 模型,因此客户端使用 request.model_spec.name = 'inception'
查询它。要改为使用您的模型,您只需将名称更改为您的模型名称。请注意,您可能还需要将 signature_name 更改为您的自定义名称或将其完全删除以使用默认签名(假设已定义)。