【发布时间】:2019-01-28 23:06:03
【问题描述】:
上下文:
我有一个基于tf.estimator.DNNClassifier 的简单分类器,它通过意图标签获取文本和输出概率。我能够将模型导出到可服务对象,并使用tensorflow serving 为可服务对象提供服务。问题是这个 servable 太大(大约 1GB),所以我想尝试一些 tensorflow graph transforms 来尝试减小所服务文件的大小。
问题:
我了解如何获取saved_model.pb 并使用freeze_model.py 创建一个新的.pb 文件,该文件可用于调用转换。这些转换的结果(也是一个.pb 文件)不是可服务的,不能与 tensorflow 服务一起使用。
开发者如何去:
saved model -> graph transforms -> back to a servable
documentation 表明这当然是可能的,但从文档中看如何做到这一点并不直观。
我的尝试:
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)
我的想法是加载 servable,从 meta_graph_def 中提取 graph_def,转换 graph_def,然后尝试重新创建 servable。这似乎是不正确的方法。
有没有办法从导出的 servable 对图成功执行转换(以减少推理时的文件大小),然后使用转换后的图重新创建 servable?
谢谢。
更新(2018-08-28):
找到了contrib.meta_graph_transform(),看起来很有希望。
更新(2018-12-03):
我打开的一个相关github issue 似乎已在工单末尾列出的详细博客文章中解决。
【问题讨论】:
-
其实我之前也做过类似的事情。我总是转换为 saved_model 而不是冻结模型,然后我想尝试一些优化。经过数小时的搜索,我制作了一个脚本来转换 save_model2frozen_model 和 freeze_model2saved_model。
标签: python tensorflow tensorflow-serving tensorflow-estimator