如何使用SavedModelBuilder导出nlp模型

时间:2017-12-28 08:27:37

标签: tensorflow nlp tensorflow-serving

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

  • 训练有素的模型包含 SavedModelBuilder 所需的所有信息,包括元图和变量,那么我们为什么要为构建器创建签名?我们可以只指定模型目录,并且构建器完成其余的工作吗?
  • 如果要导出模型,该怎么办?我阅读了导出 MNIST 模型的教程,但 MNIST 演示与我的 nmt 演示不同,所以我仍然不明白如何创建签名完全正确。是否有任何示例显示如何导出nlp模型?

3 个答案:

答案 0 :(得分:1)

更新2018-05-30

这个答案错了​​! 我找到了输出模型的正确方法,并且与tf服务配合得很好。 在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

答案 1 :(得分:0)

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

我会看一下simple_save更好的API来创建已保存的模型,虽然我认为它还没有成为TensorFlow版本(现在你可以将这几行复制为样板文件)。

答案 2 :(得分:0)

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

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

您可以访问提取请求pull request#344  或直接前往我的前叉tensorflow/nmt