使用 tf 创建的 tensorflow serveable 上的图形优化。估计

Graph optimizations on a tensorflow serveable created using tf.Estimator

提问人:o-90 提问时间:8/23/2018 最后编辑:o-90 更新时间:3/22/2023 访问量:2028

问:

语境

我有一个简单的基于 tf.estimator.DNNClassifier 的分类器,它通过意图标签获取文本和输出概率。我能够训练将模型导出为可服务对象,以及使用 tensorflow serving 为可服务对象提供服务。问题是这个可服务对象太大(大约 1GB),所以我想尝试一些 tensorflow 图形转换来尝试减小所服务文件的大小。

问题

我了解如何获取并使用freeze_model.py创建一个可用于调用转换的新文件。这些转换的结果(也是一个文件)不是可服务的,不能与 tensorflow serving 一起使用。saved_model.pb.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)

我的想法是加载可服务对象,从meta_graph_def中提取graph_def,转换graph_def,然后尝试重新创建可服务对象。这似乎是不正确的方法。

有没有办法从导出的可服务对象成功对图形执行转换(以减小推理时的文件大小),然后使用转换后的图形重新创建可服务对象?

谢谢。

更新 (2018-08-28):

找到了看起来很有前途的contrib.meta_graph_transform()。

更新 (2018-12-03):

我打开了一个相关的 github 问题,该问题似乎在票证末尾列出的详细博客文章中得到了解决。

Python TensorFlow TensorFlow-Serving tensorFlow-estimator

评论

0赞 Dammi 8/31/2018
实际上,我以前也做过类似的事情。我总是转换为saved_model而不是冻结模型,然后我想尝试一些优化。经过几个小时的搜索,我制作了一个脚本,可以转换saved_model2frozen_model和frozen_model2saved_model。

答:

0赞 Im Okay At life 3/22/2023 #1

运行 tensorflow 图转换后,从 SavedModel 到 servable 的方法是使用 SavedModel Builder API。

首先,您需要创建一个 SavedModel Builder 对象,然后使用 SavedModel Builder API 重新构建刚刚转换的图形。

接下来,您需要将资产、签名和其他元数据添加回模型中。最后,您需要调用 SavedModel Builder API 的 save() 方法,该方法会将模型另存为可服务对象。

然后,可以将此 servable 与 tensorflow serving 一起使用。