如何在不使用估计器的情况下编写张量流模型的服务输入函数?

2024-09-25 00:24:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型在一台机器上训练,不使用估计器,我希望在Google云AI平台(ML引擎)上为最终的训练模型服务。我使用SavedModelBuilder将冻结的图形导出为一个SavedModel,并将其部署到AI平台上。它对小输入图像很好,但是为了能够接受用于在线预测的大输入图像,我需要将它更改为接受b64编码字符串(^{cd1>}),如果使用估计器,则需要将其转换为所需的张量。

如果我不使用估计器,我有什么选择?如果我有一个冻结的图形或SavedModel是从SavedModelBuilder创建的,那么在导出/保存时,是否有类似于估计器的^{cd2>}的方法?

以下是我用于导出的代码:

from tensorflow.python.saved_model import signature_constants
from tensorflow.python.saved_model import tag_constants

export_dir = 'serving_model/'
graph_pb = 'model.pb'

builder = tf.saved_model.builder.SavedModelBuilder(export_dir)

with tf.gfile.GFile(graph_pb, "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())

sigs = {}

with tf.Session(graph=tf.Graph()) as sess:
    # name="" is important to ensure we don't get spurious prefixing
    tf.import_graph_def(graph_def, name="")
    g = tf.get_default_graph()

    inp = g.get_tensor_by_name("image_bytes:0")
    out_f1 = g.get_tensor_by_name("feature_1:0")
    out_f2 = g.get_tensor_by_name("feature_2:0")

    sigs[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY] = \
        tf.saved_model.signature_def_utils.predict_signature_def(
            {"image_bytes": inp}, {"f1": out_f1, "f2": out_f2})

    builder.add_meta_graph_and_variables(sess,
                                         [tag_constants.SERVING],
                                         strip_default_attrs=True,
                                         signature_def_map=sigs)

builder.save()

Tags: nameimportgetmodeltfdefbuilderout
1条回答
网友
1楼 · 发布于 2024-09-25 00:24:25

使用@tf.功能指定服务签名。下面是一个称为Keras的示例:

class ExportModel(tf.keras.Model):
    def __init__(self, model):
        super().__init__(self)
        self.model = model

    @tf.function(input_signature=[
        tf.TensorSpec([None,], dtype='int32', name='a'),
        tf.TensorSpec([None,], dtype='int32', name='b')
    ])
    def serving_fn(self, a, b):
        return {
            'pred' : self.model({'a': a, 'b': b}) #, steps=1)
        }

    def save(self, export_path):
        sigs = {
            'serving_default' : self.serving_fn
        }
        tf.keras.backend.set_learning_phase(0) # inference only
        tf.saved_model.save(self, export_path, signatures=sigs)

sm = ExportModel(model)
sm.save(EXPORT_PATH)

相关问题 更多 >