如需将经过训练的模型部署到 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 协议缓冲区中
- 外部文件,称为资产
- 变量,保存为检查点文件
将 SavedModel 部署到 AI Platform Prediction 时,必须包含整个 SavedModel 目录,而不仅仅是包含训练图及其元数据的 SavedModel 协议缓冲区文件。此文件的扩展名通常为 .pb
或 .pbtxt
。
SavedModel 允许您保存一个图的多个版本,这些版本共用同一些资产和变量(或检查点)。例如,您可能希望开发同一图的两个版本:一个版本在 CPU 上运行,另一个版本在 GPU 上运行。
详细了解 SavedModel 目录结构。
从各种 TensorFlow API 中导出
您可以通过多种方法从 TensorFlow 训练代码中导出 SavedModel。 以下列表介绍了适用于各种 TensorFlow API 的多种不同方式:
- 如果您已使用 Keras 进行训练,请使用
tf.keras.Model.save
导出 SavedModel - 如果您使用 Estimator 进行训练,请使用
tf.estimator.Estimator.export_saved_model
导出 SavedModel。 - 否则,请使用
tf.saved_model.save
或使用tf.saved_model.SavedModelBuilder
(在 TensorFlow 2 中使用tf.compat.v1.saved_model.Builder
)。
与 AI Explanations 的兼容性
如果您想将 AI Explanations 用于您的模型,请了解 SavedModel 的其他要求。
检查并调整模型大小
SavedModel 大小不得超过 500 MB 才能部署到使用旧版 (MLS1) 机器类型的模型版本中。如果您使用 Compute Engine (N1) 机器类型,则 SavedModel 大小最多为 10 GB。详细了解用于在线预测的机器类型。
此大小限制包括 SavedModel 目录中的所有资产和变量,而不仅仅是 SavedModel 协议缓冲文件本身(即 saved_model.pb
或 saved_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 的应用输入函数。
在训练期间创建应用图
这通常发生在训练过程结束时,但仍然与训练相关。
定义传送输入函数。在您的函数中,确保特征的最外层维度为
None
。这与您的批次大小相对应,下面在使用tf.placeholder
定义特征字典中的项值时加以说明。以下示例代码来自我们的人口普查示例:使用
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
如上一部分所述。
在 Python 脚本中定应用输入函数,方法类似于在训练中定义该函数的方式:
创建
Estimator
时,确保将model_dir
参数设置为与训练中所用参数相同的值。这样一来,先前保存的模型中的检查点即可用于Estimator
。最后,使用
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
中,添加
tag_constants.SERVING
添加到您的tags
列表。
如需了解如何使用标记和签名的正确常量构建预测图,请参阅示例。
后续步骤
- 了解如何将导出的模型部署到 AI Platform Prediction 以执行预测。