Optimizaciones de gráficos en un servicio de tensor de flujo creado con tf.Estimator

Contexto :

Tengo un clasificador simple basado en tf.estimator.DNNClassifier que toma el texto y las probabilidades de salida sobre las tags de intención. Soy capaz de entrenar y exportar el modelo a un servicio, así como servir el servicio mediante el servicio de tensorflow . El problema es que este servicio es demasiado grande (alrededor de 1 GB), por lo que quería probar algunas transformaciones del gráfico de tensorflow para intentar reducir el tamaño de los archivos que se sirven.

Problema

Entiendo cómo tomar el saved_model.pb y usar freeze_model.py para crear un nuevo archivo .pb que se pueda usar para llamar a las transformaciones. El resultado de estas transformaciones (un archivo .pb también) no es servible y no se puede usar con el servicio tensorflow.

¿Cómo puede un desarrollador ir desde:

 saved model -> graph transforms -> back to a servable 

Hay documentación que sugiere que esto es ciertamente posible, pero no es en absoluto intuitivo de los documentos sobre cómo hacer esto.

Lo que he intentado :

 import tensorflow as tf from tensorflow.saved_model import simple_save from tensorflow.saved_model import signature_constants from tensorflow.saved_model import tag_constants from tensorflow.tools.graph_transforms import TransformGraph with tf.Session(graph=tf.Graph()) as sess_meta: meta_graph_def = tf.saved_model.loader.load( sess_meta, [tag_constants.SERVING], "/model/path") graph_def = meta_graph_def.graph_def other_graph_def = TransformGraph( graph_def, ["Placeholder"], ["dnn/head/predictions/probabilities"], ["quantize_weights"]) with tf.Graph().as_default(): graph = tf.get_default_graph() tf.import_graph_def(other_graph_def) in_tensor = graph.get_tensor_by_name( "import/Placeholder:0") out_tensor = graph.get_tensor_by_name( "import/dnn/head/predictions/probabilities:0") inputs = {"inputs": in_tensor} outputs = {"outputs": out_tensor} simple_save(sess_meta, "./new", inputs, outputs) 

Mi idea fue cargar el servidor, extraer el graph_def del meta_graph_def, transformar el graph_def y luego intentar recrear el servidor. Este parece ser el enfoque incorrecto.

¿Hay una manera de realizar con éxito transformaciones (para reducir el tamaño del archivo en la inferencia) en un gráfico de un servicio exportado, y luego recrear un servicio con el gráfico transformado?

Gracias.

Actualización (2018-08-28) :

Se encontró contrib.meta_graph_transform () que parece prometedor.

Actualización (2018-12-03) :

Un problema relacionado con github que abrí y que parece resolverse en una publicación detallada del blog que se encuentra al final del ticket.