您可以在云端托管经过训练的机器学习模型,并使用 AI Platform Prediction 来推断新数据的目标值。本页面讨论模型托管和预测,并介绍您应该牢记的项目注意事项。
工作原理
AI Platform Prediction 在云端管理计算资源,以运行您的模型。您可以请求使用您的模型进行预测,并获取模型的预测目标值。以下过程展示了如何完成相关设置以在云端进行预测:
将模型导出为工件,该工件可以部署到 AI Platform Prediction。
在 AI Platform Prediction 中创建模型资源,然后根据已保存的模型创建模型版本。
如果您要部署自定义预测例程,还需要提供在预测时运行的代码。
您设置好要用于预测的输入数据的格式,然后请求在线预测或批量预测。
使用在线预测时,服务会运行已保存的模型,并将请求的预测作为调用的响应消息返回。
- 模型版本部署在您创建模型时指定的区域中。
- 您定期使用的模型版本通常可以随时运行,但不保证一定能运行。
当您使用仅 TensorFlow 模型支持的批量预测时,该过程有点复杂:
预测服务分配资源以运行作业。这包含一个或多个预测节点。
服务在每个分配的节点上恢复 TensorFlow 图。
预测服务将输入数据分发到各个分配的节点。
每个节点都运行您的图,并将预测保存到您指定的 Cloud Storage 位置。
当所有输入数据都处理完后,服务会关停作业,并释放为该作业分配的资源。
模型部署
AI Platform Prediction 可以托管您的模型,以便您在云端通过模型获得预测。托管已保存模型的过程被称为部署。预测服务管理大规模运行模型所需的基础架构,供在线预测和批量预测请求使用。本部分介绍模型部署。
关于模型和版本
AI Platform Prediction 使用名为模型和版本的资源来组织经过训练的模型。模型是一个机器学习解决方案。举例来说,您可以创建一个名为 census
的模型,以包含美国人口普查机器学习模型上您的所有工作。您创建的实体名为 census
,是一个容纳机器学习模型的实际实现的容器,我们称之为版本。
开发机器学习模型是一个迭代过程。因此,在设置 AI Platform Prediction 的资源范例时,设计者假设您将为每个机器学习模型生成多个版本。该术语可能有些令人费解,因为 AI Platform Prediction 模型资源本身实际上不是机器学习模型。在 AI Platform Prediction 中,模型是机器学习模型版本的容器。
版本中包含什么?
作为模型版本部署到 AI Platform Prediction 中的“模型”包含使用托管的框架、TensorFlow、scikit-learn 或 XGBoost 训练生成的一个或多个工件。无论是使用 AI Platform Training 在云端还是在其他位置训练模型,都无关紧要。
您还可以部署自定义预测例程(测试版),在这种情况下,您可以为模型版本提供额外的训练工件和用于处理预测请求的代码。
版本之间的差异
您为任何给定模型资源创建的版本是任意的;即使您在不同版本之间完全更改机器学习模型,也可以使用相同的模型资源。模型是一种只要您认为情况合适,就可以使用的组织工具。
常见的做法是在不同模型版本之间保持输入和输出相同,尤其是您在生产环境中拥有一个版本后。这样一来,您便可以切换版本,而无需更改您围绕模型构建的其他应用结构。您还可以轻松使用现有数据对新版本进行测试。
默认版本
每个有一个以上版本的模型都具有一个默认版本;当您创建第一个版本时,系统会设置默认版本。如果您请求预测,但仅指定了模型名称,则 AI Platform Prediction 将使用该模型的默认版本。
请注意,只有在您创建第一个版本时,服务才会自动设置默认版本。您可以通过调用 projects.models.versions.setDefault(也作为 gcloud ai-platform versions set-default
公开,并在 Google Cloud 控制台中的“模型详细信息”页面的“版本”列表中作为选项提供)来手动将任何后续版本设为默认版本(如需前往“模型详细信息”页面,请点击“模型”页面上的模型列表中的模型)。这赋予您某些实用的功能,比方说,使用稳定的默认版本来处理生产环境中的预测,同时测试较新的版本,而无需为测试创建专用的模型资源。
为模型和版本命名
模型和版本名称必须符合下列要求:
- 只能包含(区分大小写)大小写混合字母、数字和下划线。
- 以字母开头。
- 最多只能包含 128 个字符。
- 在给定项目(针对模型)或模型(针对版本)中是唯一的。
除了上述技术要求之外,名称不受任何其他规则限制,但应遵循以下最佳做法:
- 模型名称应该具有描述性和独特性 - 您可能需要在日志或报告内包含多个名称的列表中选择模型名称。
- 版本名称最好简短。例如,在资源列表中,“v1”比“2017_01_29T13_54_58”更容易识别。
模型和版本限制
如需了解您可以在一个 Google Cloud 项目中创建多少个模型和版本,请参阅资源配额。
模型部署参数
AI Platform Prediction 需要一些信息才能创建模型版本。
您还可以配置一些选项。本部分介绍这两种类型的参数。这些参数已在 Version
对象中进行定义,或已为了方便起见添加至 gcloud ai-platform versions create
命令中。
- 版本名称
- 新版本的名称,在模型的所有版本中具有唯一性。
- 说明
- 您可以提供版本说明。目前,只有当您通过 API 获取版本信息时才会提供该说明;Google Cloud CLI 和 Google Cloud 控制台均不会显示该说明。
- 部署 URI
- 您必须提供存储 SavedModel 的 Cloud Storage 位置的 URI。AI Platform Prediction 从此位置拉取模型并进行部署。此参数在
gcloud ai-platform versions create
命令中称为--origin
。如果您要部署自定义预测例程(测试版),则可以提供相关 Cloud Storage 目录的 URI,该目录应包含您的模型版本用来预测的任何工件,而不仅仅是 SavedModel。 - 运行时版本
- 如果您没有指定其他受支持的版本,AI Platform Prediction 将使用最新的稳定版运行时版本部署您的模型版本。运行时版本主要决定了预测服务用于运行模型的 TensorFlow 版本。运行批量预测作业时,您可以选择替换已分配的运行时版本。在线预测始终使用部署模型版本时设置的运行时版本。
- 手动扩缩
您可为模型版本指定要保持运行的预测节点数。如需了解详情,请参阅有关扩缩的部分。
- 暂存存储分区
如果您使用 Google Cloud CLI 部署模型,则可以在本地计算机上使用 SavedModel。在将其部署到 AI Platform Prediction 之前,该工具会将它暂存到您指定的 Cloud Storage 位置。
更改图以进行预测
在主要用于训练上下文的计算图中,您可能已添加 TensorFlow 操作。训练完模型后,您可以从图中移除这些操作,然后再导出最终版本。
训练应用开发页面旨在提升预测体验。在某些情况下,完成大量训练工作并准备开始部署版本时,您需要对您的模型进行这些更改。
获取预测结果
您可以将新数据发送到已部署的模型版本,以获取预测结果。以下各部分介绍了重要的预测注意事项。
在线预测与批量预测
了解预测节点和资源分配
AI Platform Prediction 将按节点时数计量您进行预测所用的处理量。本部分介绍这些节点以及如何为不同类型的预测分配节点。
将节点视为虚拟机 (VM) 最为简单,尽管节点的实现机制与传统虚拟机不同。每个节点预配了一定数量的处理能力和内存。它还具备运行模型以获取预测结果所需的操作系统映像和一组软件配置。
在线预测和批量预测均通过分布式处理运行节点,因此给定请求或作业可以同时使用多个节点。您需要按分钟数为总节点使用量付费(采用小时费率)。例如,两个节点运行十分钟的费用与一个节点运行二十分钟的费用相同。在线预测和批量预测以不同方式分配节点,这可能对您将要支付的费用有重大影响。
批量预测的节点分配
批量预测服务可调节其使用的节点数,以最大限度地减少作业所用的时间。为此,该服务会执行以下操作:
在您启动作业时分配一些节点以处理作业。
在作业运行期间调节节点数,以尝试优化效率。每个节点的启动都需要时间,因此服务会尝试分配足够的节点,以便通过缩短所用时间来抵消启动时间。
在作业完成后立即将节点关停。
通过指定使用的节点数上限,您可以影响批量预测作业的规模。通常,您希望有足够多的节点满足服务的需要,但是具体的节点用量还受到 AI Platform Prediction 配额政策的限制。您可能希望限制向给定作业分配的节点数,尤其是在您与其他人共享项目并且可能会同时运行作业(训练和预测)的情况下。
在线预测的节点分配
在线预测服务可调节其使用的节点数,从而最大限度增加它可处理的请求数量,而不造成延迟时间太长。为此,该服务会执行以下操作:
在请求经过长时间暂停后,您第一次请求预测时,分配一些节点。
根据请求流量调节节点数,在流量增加时增加节点,并在请求减少时移除节点。
让至少一个节点在几分钟内保持就绪状态以处理请求,即使没有要处理的请求也是如此。就绪状态确保服务可以立即处理每个预测。
如果模型版本持续几分钟没有收到预测请求,则缩减至零。
服务缩减至零后,或者当流量突然激增时,初始化节点以处理请求可能需要一些时间(数秒至数分钟)。初始化时间取决于模型版本大小,因此客户端超时可能会导致丢弃请求,直到新节点完成初始化,和/或此时间段内的延迟时间增加。
如需确保终及时提供服务,您可以对模型版本设置 minNodes
选项,以指定服务应至少让几个节点保持就绪状态。此设置可能会增加费用,因为即使在没有运行预测作业时,您也必须支付这些节点的费用。
自动扩缩的限制
用于在线预测的 AI Platform Prediction 自动扩缩功能可帮助您处理费率不同的预测请求,同时最大限度地降低费用。但是,此功能并不适合所有情况,因为此服务可能无法足够快地让节点上线,以应对请求流量高峰。如果您的流量经常急剧增加,并且可靠的低延迟时间对您的应用十分重要,您可能应该考虑使用手动调节。
使用手动扩缩
通过指定要保持运行的节点数(而不考虑流量),您可以影响模型版本的在线预测调节方式。手动设置节点数实际上中止了服务扩缩,意味着您指定的节点数量将始终处于就绪状态,系统会持续向您收取这些节点的费用。除非模型收到的请求数量波动的速度总是超出自动扩缩的应对能力,否则您应避免手动扩缩。可通过在传递给 projects.models.versions.create 方法的 Version 对象中设置 manualScaling
字段,设置要使用的节点数。
多区域扩缩
如果您的版本使用 Compute Engine (N1) 机器类型,并且您将 autoScaling.minNodes
或 manualScaling.nodes
设置为 2 或更大的值(具体取决于您使用的是自动扩缩还是手动扩缩),那么您的预测节点将在同一地区的多个区域中运行。这可确保当其中一个区域发生中断时,服务持续可用。
预测输入数据
用于获取预测结果的数据是新数据,这些数据的格式与用于训练的数据相同。在线预测和批量预测均使用相同的数据(模型的特征),但它们需要不同格式,具体取决于您使用的预测类型和界面。下表汇总了这些格式,而且以下部分也对此进行了详细介绍:
预测类型和界面 | 支持的输入格式 |
---|---|
通过 API 调用进行批量预测 | 包含 JSON 实例字符串的文本文件,或 TFRecords 文件(可压缩) |
通过 gcloud CLI 进行批量预测 | 包含 JSON 实例字符串的文本文件,或 TFRecords 文件(可压缩) |
通过 API 调用进行在线预测 | JSON 请求消息 |
通过 gcloud CLI 进行在线预测 | 含有 JSON 实例字符串的文本文件,或 CSV 文件 |
实例 JSON 字符串
在线预测和批量预测的基本格式是实例数据张量列表。这些列表可以是普通的值列表,也可以是 JSON 对象的成员,取决于您在训练应用中配置输入的方式:
以下示例显示了输入张量和实例键:
{"values": [1, 2, 3, 4], "key": 1}
只要遵循以下规则,JSON 字符串的构成可能会很复杂:
顶级实例数据必须是 JSON 对象,即键/值对的字典。
实例对象中的各个值可以是字符串、数字或列表。 您无法嵌入 JSON 对象。
列表必须仅包含相同类型的内容(包括其他列表)。您不能混合使用字符串和数值。
以下字符串(已设置格式,便于阅读)显示了一个包含标签和图片的对象,其中图片是 8 位整数的三维数组:
{
"tag": "beach",
"image": [
[
[138, 30, 66],
[130, 20, 56],
...
],
[
[126, 38, 61],
[122, 24, 57],
...
],
...
]
}
如果您的模型只接受一个输入,则无需将其封装在 JSON 对象中。例如,如果您发送带有四个值的单一张量(在本例中为矢量),则无需将其格式设置为以下形式:
{"values": [1, 2, 3, 4]}
只需将每个实例格式化为列表即可:
[1, 2, 3, 4]
预测输入中的二进制数据
二进制数据不能格式化为 JSON 支持的 UTF-8 编码字符串。如果输入中包含二进制数据,则必须使用 base64 编码表示。此时需要用到以下特殊格式:
编码的字符串必须设置为 JSON 对象格式,并包含名为
b64
的单个键。以下 Python 示例展示了如何使用 base64 库对原始 JPEG 数据的缓冲区进行编码以生成实例:{"image_bytes":{"b64": base64.b64encode(jpeg_data)}}
在 TensorFlow 模型代码中,您必须为输入和输出张量提供别名,使这些名称以“_bytes”结尾。
在线预测输入数据
您可以将在线预测的输入实例作为预测请求的消息正文传递。如需了解如何设置请求和响应正文的格式,请参阅预测请求的详细信息。
简而言之:使每个实例成为列表中的一项,并将列表成员命名为 instances
。因此,上方提供的简单数据实例 JSON 示例变为:
{"instances": [{"values": [1, 2, 3, 4], "key": 1}]}
当您使用 gcloud ai-platform projects predict
请求在线预测时,文件会以批量预测所用的格式进行传递。
批量预测输入数据
如上所述,您在包含多行 JSON 实例数据的一个或多个文本文件中提供批量预测的输入数据。输入文件中不包含列标题,也不包含除简单 JSON 语法以外的其他格式。
{"image": [0.0, 0.0, ... ], "key": 0}
{"image": [0.0, 0.0, ... ], "key": 1}
{"image": [0.0, 0.0, ... ], "key": 2}
实例键
AI Platform Prediction 使用分布式处理来运行批量预测作业。这意味着,您的数据分布在任意虚拟机集群中,并以不可预测的顺序进行处理。您必须定义实例键,才能使返回的预测结果与您的输入实例匹配。实例键是每个实例都具有的一个值,此值在一组数据的实例中是唯一的。最简单的键是索引编号。
您应该在训练应用中按原样通过图传递键。如果您的数据还没有实例键,您可以在进行数据预处理的过程中添加实例键。
运行时版本
新版本 AI Platform Prediction 发布后,根据旧版本开发的模型可能会过时。如果您期望获得长期保持不变的有效模型版本,请尤其注意这一点。您应查看 AI Platform Prediction 版本控制政策,确保了解要用来训练模型版本的 AI Platform Prediction 运行时版本。
运行时版本和预测结果
您必须在创建模型版本时指定支持的 AI Platform Prediction 运行时版本。此操作将建立模型版本的默认设置。
您可以在启动批量预测作业时指定要使用的运行时版本。这是为了能够使用未部署到 AI Platform Prediction 中的模型来进行预测。对于已部署的模型,请在作业请求中使用模型的默认运行时版本。使用其他运行时版本可能会导致意外错误。
您不能使用 AI Platform Prediction 以外的模型请求在线预测,因此无法替换请求中的默认运行时版本。
为模型版本设置的默认运行时版本无法更改。如需为模型版本指定其他运行时版本,请通过您最初使用的训练工件部署新版本。
区域和预测
Google Cloud 使用区域(可细分为地区)来定义物理计算资源的地理位置。使用 AI Platform Prediction 部署预测模型时,您可以指定要在其中运行预测的默认区域。
启动批量预测作业时,您可以指定要在其中运行作业的区域,以替换默认区域。在线预测始终在为模型指定的默认区域中运行。
如需查看 AI Platform Prediction 服务(包括模型训练和在线/批量预测)的可用区域,请阅读区域指南。
预测日志记录
批量预测生成的作业日志可在 Cloud Logging 上查看。如果您在创建模型时进行配置,使其可以生成在线预测请求的日志,则也可以获取这些日志。请注意,在 AI Platform Prediction 中创建模型资源时,您必须指定此选项;模型的所有版本要么都生成在线预测的日志,要么都不生成。
如要为模型设置在线预测日志记录,您可以在调用 projects.models.create 创建模型时,在所使用的模型资源中将 onlinePredictionLogging
设置为 true(在 Python 中,则设为 True
)。如果您使用 Google Cloud CLI 创建模型,请在运行 gcloud ai-platform models create
时包含 --enable-logging
标志。
使用未部署的模型进行预测
您可以请求使用尚未部署到 AI Platform Prediction 服务的模型进行批量预测。您可以使用存储要运行模型的 Cloud Storage 位置的 URI,而非指定模型或版本名称。
由于未部署的模型没有已建立的默认运行时版本,因此您必须在作业请求中明确设置版本。
在其他所有方面,使用未部署模型的批量预测作业行为与任何其他批量作业相同。
模型测试
您可以使用 AI Platform Prediction 预测服务来托管生产环境中的模型,也可使用该服务来测试模型。传统上,在准备部署机器学习解决方案之前要执行模型测试步骤。在尽可能接近实际运用情况的环境中对您的模型进行测试,是测试通过的目的所在。
请记住,您可以在该服务上同时部署一个模型的多个版本。这意味着,您可以根据需要同时测试模型的多项修订。您还可以在测试下一项修订时轻松部署模型的生产版本。与开发机器学习应用类似,最新数据的可用性通常是一个限制因素。您应该拟定策略来拆分已有的数据,并收集新数据以用于测试。