导出 SavedModel 以执行预测

如需将经过训练的模型部署到 AI Platform Prediction 并使用它们来执行预测,您必须先以 TensorFlow SavedModel 格式导出这些模型。

本页面概述了在创建 SavedModel 时需要考虑的一些重要事项。如需详细了解如何导出到 SavedModel,请参阅有关 SavedModel 的 TensorFlow 指南有关保存 Keras 模型的 TensorFlow 指南。如需详细了解如何将 SavedModel 部署到 AI Platform Prediction 以执行预测,请参阅模型部署指南。如需了解有关预测过程的一般背景信息,请参阅预测概览页面

自定义预测例程

您还可以创建和部署自定义预测例程来替代部署 SavedModel。自定义预测例程可以将 SavedModel(或采用不同保存方式的经过训练的模型)与您提供的其他训练工件和 Python 代码相结合,以自定义 AI Platform Prediction 处理预测请求的方式。例如,您可以利用这样的灵活性,在您的模型执行预测之前预处理预测输入。

如需了解详情,请参阅自定义预测例程指南

了解训练图和应用图

如果您已经训练了模型并已将其导出为 SavedModel,则必须首先采取一些重要步骤,之后才能准备好执行预测。

训练图与应用图之间存在一些关键差异。训练图表包含一些不适合传送的功能,例如:

  • 文件阅读器
  • 输入队列
  • 漏失层
  • 损失函数
  • 优化器

由于传送预测的过程与训练过程的需求不同,因此最佳做法是导出单独的图表,专门用于传送预测。

了解 SavedModel

SavedModel 是 TensorFlow 推荐的模型保存格式,它是在 AI Platform Prediction 上部署经过训练的 TensorFlow 模型时所需的格式。将经过训练的模型导出为 SavedModel 时,系统会将您的训练图及其资产、变量和元数据以 AI Platform Prediction 可以为预测使用和恢复的格式加以保存。

导出 SavedModel 后,您会获得一个 SavedModel 目录,其中包含以下内容:

将 SavedModel 部署到 AI Platform Prediction 时,必须包含整个 SavedModel 目录,而不仅仅是包含训练图及其元数据的 SavedModel 协议缓冲区文件。此文件的扩展名通常为 .pb.pbtxt

SavedModel 允许您保存一个图的多个版本,这些版本共用同一些资产和变量(或检查点)。例如,您可能希望开发同一图的两个版本:一个版本在 CPU 上运行,另一个版本在 GPU 上运行。

详细了解 SavedModel 目录结构

从各种 TensorFlow API 中导出

您可以通过多种方法从 TensorFlow 训练代码中导出 SavedModel。 以下列表介绍了适用于各种 TensorFlow API 的多种不同方式:

与 AI Explanations 的兼容性

如果您要在模型中使用 AI Explanations,则您在导出 SavedModel 时必须考虑某些限制。具体来说,您不能使用 TensorFlow 2,而且必须使用 Estimator API 导出 SavedModel。(如果您不使用 Estimator 训练模型,则可以在导出前将其转换为 Estimator。)

检查并调整模型大小

SavedModel 大小不得超过 500 MB 才能部署到使用旧版 (MLS1) 机器类型的模型版本中。如果您使用 Compute Engine (N1) 机器类型,则 SavedModel 大小最多为 10 GB。详细了解用于在线预测的机器类型

此大小限制包括 SavedModel 目录中的所有资产和变量,而不仅仅是 SavedModel 协议缓冲文件本身(即 saved_model.pbsaved_model.pbtxt)。

要在开发期间检查模型大小,请导出 SavedModel 并检查目录的文件大小。

如果您的 SavedModel 大小超过 500 MB,可以采取以下措施:

按照这些步骤执行,即可让 SavedModel 缩小到 500 MB 以下,并减少预测的延迟时间。好处包括更高的性能,而且不必申请并等待配额增加。

如果您仍需要额外的配额,请参阅如何申请增加配额

构建最优预测图

训练会产生多个检查点,而这些检查点不会用于传送预测。确保上传一个没有这些工件、仅包含要部署的模型的目录。

例如,如果您在 TensorBoard 的可视化训练过程中导出摘要,则需要确保它们未包含在 SavedModel 中。预测图不需要这些 TensorBoard 摘要。

通过降低精度缩小文件

降低变量和输入数据的精度是一种权衡之举,可以显著缩小模型的大小,但会有损预测精度。与低精度数据相比,高精度数据的存储效率较低。虽然低精度数据会造成噪声,但神经网络有可能“忽视”这种噪声,因而仍能产生相对准确的预测。

如果使用这些方法导致用例的预测准确率大幅降低,请尝试申请增加配额

  • 通过减小权重的大小来缩小文件,权重默认为难以高效存储的浮点数字。这些低效存储的权重对于模型整体文件大小影响最大。

  • 对连续数据进行数字转换,可以在不会大幅度降低精度的前提下,将模型的大小缩小多达 75%。

  • 使用精度较低的变量。例如,将数据类型 (dtype) 从 int64 更改为 int32

  • 减小 SavedModel 目录的 assets 文件夹中其他输入特征的大小。例如,为文本数据使用较小的词汇量。

  • 详细了解有关优化 TensorFlow 模型以执行预测的技术,并浏览应用这些技术的示例。 仅当您使用 TensorFlow 1 时才能使用这些关联技术。

检查 SavedModel 和图的工具

TensorFlow 提供了一个命令行界面,可用于对 SavedModel 的某些方面(例如输入格式和 SignatureDefs)进行健全性检查。详细了解 SavedModel CLI

TensorFlow 中的图转换工具可用于优化模型以进行部署。虽然此工具的用法是在移动部署环境中介绍的,但它也可用于优化非移动部署的模型。

创建应用输入函数

如果您使用 tf.keras.Model.save 导出 SavedModel,则无需指定应用输入函数。

否则,请在导出 SavedModel 时定义应用输入函数。您可以在整体训练过程中的以下几个时间点执行此操作:

  • 在训练过程结束时。
  • 在训练结束后将其作为一个单独的过程执行。

以下示例展示了如何为经过训练的 Estimator 执行此操作。如需详细了解,请参阅 Estimator 的应用输入函数

在训练期间创建应用图

这通常发生在训练过程结束时,但仍然与训练相关。

  1. 定义传送输入函数。在您的函数中,确保特征的最外层维度为 None。这与您的批次大小相对应,下面在使用 tf.placeholder 定义特征字典中的项值时加以说明。以下示例代码来自我们的人口普查示例

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. 使用 tf.estimator.Estimator.export_saved_model 从您的 Estimator 中导出 SavedModel,并将模型路径和应用输入函数名称分别作为 export_dir_base 参数和 serving_input_fn 参数传入。在人口普查示例中,使用的 Estimator 类型是 tf.estimator.DNNLinearCombinedClassifier

独立于训练创建应用图

如果您已经训练过模型,则可以在不重新训练的情况下获得预测。此过程与在训练期间创建传送图表的过程非常相似。主要区别在于,您是在训练结束后运行单独的 Python 脚本来创建应用图。基本思路是使用训练中所用的同一 model_dir 构建 Estimator,然后按照上一部分中所述调用 tf.estimator.Estimator.export_saved_model

  1. 在 Python 脚本中定应用输入函数,方法类似于在训练中定义该函数的方式:

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. 创建 Estimator 时,确保将 model_dir 参数设置为与训练中所用参数相同的值。这样一来,先前保存的模型中的检查点即可用于 Estimator

  3. 最后,使用 Estimator 来调用 tf.estimator.Estimator.export_saved_model,并将模型路径和应用输入函数名称分别作为 export_dir_base 参数和 serving_input_fn 参数传入。

TensorFlow 标记和签名

如果您tf.keras从 TensorFlow Estimator 导出 SavedModel,则导出的图默认可以直接应用。

在其他情况下,构建 TensorFlow 预测图时,必须为图的标记和签名指定正确的值。TensorFlow 为这些标记和签名值提供常量,用于以下用途:

  • 在 SavedModel 中选择图表以传送预测
  • 指明您正在为预测图表构建预测签名

签名定义图的输入和输出。为预测图构建签名时,必须指定有效的签名常量作为 build_signature_def 中的 method_name 参数。对于预测,最好的选择通常是 PREDICT_METHOD_NAME

您必须使用标记来指定 SavedModel 中的哪个图表用于提供预测结果。在 add_meta_graph_and_variables 中,在您的 tags 列表中添加 tag_constants.SERVING

如需了解如何使用标记和签名的正确常量构建预测图,请参阅示例

后续步骤