导出 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 的其他要求

检查并调整模型大小

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

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

后续步骤