【问题标题】:how to use SavedModelBuilder to export a nlp model如何使用 SavedModelBuilder 导出 nlp 模型
【发布时间】:2018-05-31 07:16:07
【问题描述】:

我训练了一个 nmt 模型,我想导出模型并将其部署到 tensorflow 服务上。但是我有一些问题让我困惑了几天:

  • 经过训练的模型包含 SavedModelBuilder 需要的所有信息,包括元图和变量,那么我们为什么要为构建器创建签名呢?我们可以只指定模型目录,然后构建器完成剩下的工作吗?
  • 如果要导出模型怎么办?我看了导出MNIST模型的教程,但是MNIST演示和我的nmt演示不一样,所以还是不明白怎么创建确切的签名。是否有任何示例说明如何导出 nlp 模型?

【问题讨论】:

  • 很难准确地说出如何在没有更多细节的情况下导出您的 NMT 模型。如果附近有 TensorFlow 模型示例,您可以提交功能请求以获取 saved_model 导出示例。或者,如果您有特定的 API 问题,可以在此处提出。
  • 感谢您的重播。我尝试使用此代码export nmt trained model 导出我的模型,但它不起作用。你能找出哪一步错了吗?

标签: tensorflow nlp tensorflow-serving


【解决方案1】:

2018 年 5 月 30 日更新

这个答案是错误的! 我找到了导出模型的正确方法,并且与 tf serving 配合得很好。 在tensorflow/nmt 访问我的tensorflow/nmt 的分支,或转到拉取请求:pull request#344

错误答案

我找到了导出模型的方法!
这是我的代码:

    if not self.model_dir:
        raise ValueError("Please specified a model dir.")
    export_path = os.path.join(
        tf.compat.as_bytes(self.export_base_path),
        tf.compat.as_bytes(str(self.version_number))
    )

    config = tf.ConfigProto(allow_soft_placement=True)
    sess = tf.Session(config=config)
    saver = tf.train.import_meta_graph(os.path.join(self.model_dir, "translate.ckpt-21000.meta"))
    latest_ckpt = tf.train.latest_checkpoint(self.model_dir)
    saver.restore(sess, latest_ckpt)

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

    feature_configs = {
        'x': tf.FixedLenFeature(shape=[], dtype=tf.string),
        'y': tf.FixedLenFeature(shape=[], dtype=tf.string)
    }
    serialized_example = tf.placeholder(tf.string, name="tf_example")
    tf_example = tf.parse_example(serialized_example, feature_configs)
    x = tf.identity(tf_example['x'], name='x')
    y = tf.identity(tf_example['y'], name='y')
    # predict_input = tf.saved_model.utils.build_tensor_info(x)
    # predict_output = tf.saved_model.utils.build_tensor_info(y)
    predict_input = x
    predict_output = y
    predict_signature_def_map = tf.saved_model.signature_def_utils.predict_signature_def(
        inputs={
            tf.saved_model.signature_constants.PREDICT_INPUTS: predict_input
        },
        outputs={
            tf.saved_model.signature_constants.PREDICT_OUTPUTS: predict_output
        }
    )

    legacy_init_op = tf.group(tf.tables_initializer(), name="legacy_init_op")
    builder.add_meta_graph_and_variables(
        sess=sess,
        tags=[tf.saved_model.tag_constants.SERVING],
        signature_def_map={
            "predict_signature_map": predict_signature_def_map
        },
        legacy_init_op=legacy_init_op,
        assets_collection=None
    )
    builder.save()

我的导出模型目录如下:

|----1
    |----saved_model.pb
    |----variables
        |----variables.data-00000-of-00002
        |----variables.data-00001-of-00002
        |----varaibles.index

【讨论】:

  • 嗨,我可以使用您发布的代码很好地导出模型。非常感谢。你也有任何客户端代码吗?我尝试调整 Inception/MNIST 示例,但收到错误“输入大小与签名不匹配”,不确定大小应该是多少。谢谢。
【解决方案2】:

为什么要签名:否则图表不会指示什么是输入和什么是输出,并且服务需要此信息(当您在 Python 程序中加载图表并对其执行某些操作时,它会隐式提供;用于服务它需要明确)。

我会看看 simple_save 以获得更好的 API 来创建保存的模型,尽管我认为它还没有进入 TensorFlow 版本(现在你可以复制这几行作为样板)。

【讨论】:

    【解决方案3】:

    好消息!我成功了!我成功导出模型,并通过 tf serving 提供服务,效果很好!

    创建了一个模块exporter.py 来导出预训练模型,并在nmt.py 模块中添加了一些导出所需的额外参数。 为了测试导出器,我使用nmt/testdata/ 文件夹中的测试数据训练了一个简单的模型,并将模型保存在nmt/testdata/models 中。之后运行exporter的测试,会在nmt/testdata/models中生成一个名为export的新文件夹,这是我们预期的,可以被tf serving服务。

    您可以访问拉取请求pull request#344 或者直接去我的forktensorflow/nmt

    【讨论】:

    • 推荐你至少把代码的解决方案总结一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2017-10-02
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多