Контекст:
У меня есть простой классификатор на основе tf.estimator.DNNClassifier, который принимает текст и вероятность вывода по тегам намерения. Я могу обучить экспортировать модель в обслуживаемый объект, а также обслуживать его, используя обслуживание тензорного потока . Проблема в том, что этот обслуживаемый файл слишком велик (около 1 ГБ), поэтому я хотел попробовать преобразовывает график тензорного потока, чтобы попытаться уменьшить размер обслуживаемых файлов.
Проблема:
Я понимаю, как взять saved_model.pb
и использовать freeze_model.py для создания нового .pb
файла, который можно использовать для вызова преобразований. Результат этих преобразований (также файл .pb
) не обслуживается и не может использоваться с обслуживанием тензорного потока.
Как разработчику перейти от:
saved model -> graph transforms -> back to a servable
Есть документация, которая предполагает, что это, безусловно, возможно, но не все интуитивно понятно из документации относительно того, как это сделать.
Что я пробовал:
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)
Моя идея заключалась в том, чтобы загрузить обслуживаемый объект, извлечь graph_def из meta_graph_def, преобразовать graph_def и затем попытаться воссоздать обслуживаемый объект. Это кажется неправильным подходом.
Есть ли способ успешно выполнить преобразования (чтобы уменьшить размер файла при выводе) на графе из экспортированного обслуживаемого объекта, а затем воссоздать обслуживаемый объект с преобразованным графом?
Спасибо.
Обновление (28 августа 2018 г.):
Найден contrib.meta_graph_transform (), который выглядит многообещающе.
Обновление (03.12.2018):
Связанная с этим проблема с github, которую я открыл, кажется, что она решена в подробном блоге пост, который указан в конце билета.