Quiero usar TensorFlow Serving para un modelo personalizado (sin punto de partida preentrenado).
Superé la parte previa a Kubernetes del tutorial de TensorFlow Serving para Inception, usando Docker: http://tensorflow.github.io/serving/serving_inception
Entiendo (más o menos) que la compilación de Bazel es fundamental para el funcionamiento de todo. Pero estoy tratando de entender cómo funciona el predict_pb2
generado de tensorflow_serving.apis
, para poder intercambiar mi propio modelo personalizado.
Para ser claros, así es como se ve actualmente la main
en 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)
Es difícil para mí desempaquetar y depurar lo que predict_pb2.PredictRequest()
ya que es generado por Bazel. Pero me gustaría volver a señalar esto a un modelo guardado totalmente diferente, con su propio archivo .pb, etc.
¿Cómo puedo hacer referencia a un modelo guardado diferente?
PredictionService, definido aquí , es la definición de servicio de la API de gRPC que declara a qué funciones de RPC responderá el servidor. A partir de este proto, bazel/protoc puede generar código que se vinculará en el servidor y en el cliente (predict_pb2 que mencionaste).
El servidor extiende aquí el servicio generado automáticamente y proporciona una implementación para cada función.
Los clientes de Python usan el predict_pb2 provisto y lo usan para crear una solicitud y enviar un RPC usando la API correcta.
predict_pb2.PredictRequest()
es un prototipo de PredictRequest definido aquí, que es el tipo de solicitud para la llamada a la API de Predict() (consulte la definición de Proto de PredictService vinculada anteriormente). Esa parte del código simplemente genera una solicitud y result = stub.Predict(request, 10.0)
es donde se envía realmente la solicitud.
Para usar un modelo diferente, solo necesita cambiar el nombre del modelo de ModelSpec a su modelo. En el ejemplo anterior, el servidor cargó el modelo iception con el nombre "inception", por lo que el cliente lo consulta con request.model_spec.name = 'inception'
. Para usar su modelo en su lugar, solo necesita cambiar el nombre a su nombre de modelo. Tenga en cuenta que probablemente también deba cambiar el nombre de la firma a su nombre personalizado o eliminarlo por completo para usar la firma predeterminada (suponiendo que esté definida).