作者:爵士KI | 来源:互联网 | 2022-12-06 20:59
背景:
我有一个基于tf.estimator.DNNClassifier的简单分类器,它通过intent标签获取文本和输出概率.我能够训练将模型输出到可服务的以及使用tensorflow服务服务于服务.问题是这个可服务性太大(大约1GB),因此我想尝试一些张量流图变换来尝试减少所服务文件的大小.
问题:
我理解如何saved_model.pb
使用和使用freeze_model.py来创建一个.pb
可用于调用转换的新文件.这些转换的结果(.pb
文件也是如此)不可用,不能与tensorflow服务一起使用.
开发者如何来自:
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)
我的想法是加载servable,从meta_graph_def中提取graph_def,转换graph_def,然后尝试重新创建servable.这似乎是不正确的方法.
有没有办法从导出的servable成功执行图形转换(减少推理时的文件大小),然后用转换后的图形重新创建一个servable?
谢谢.
更新(2018-08-28):
发现contrib.meta_graph_transform()看起来很有希望.
更新(2018-12-03):
我打开的一个相关的github问题似乎是在一个详细的博客文章中解决的,该帖子列在故障单的末尾.