滚动部署 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

滚动部署

您在更新端点时,可以指定滚动部署方式,从而逐步将流量从旧实例集转移到新实例集。您可以控制流量转移步骤的大小,还可以指定一个评估期,以便在终止旧实例集内的实例之前,监控新实例以确保没有问题。通过滚动部署,每次流量转移到新实例集后,都会清理旧实例集上的实例,从而减少更新端点所需的额外实例数量。这对于需要量大的加速实例尤其有用。

滚动部署按照可配置的批量大小来更新端点,从而逐步将之前部署的模型版本替换为新版本。滚动部署的流量转移行为类似于蓝绿部署中的线性流量转移模式,但是与蓝绿部署相比,滚动部署的好处是能够降低容量需求。通过滚动部署,您能够减少同时处于活动状态的实例数量,从而更精细地控制要在新实例集内更新的实例数量。如果您有大型模型或具有许多实例的大型端点,则应考虑使用滚动部署而不是蓝绿部署。

以下列表介绍了 Amazon SageMaker 中蓝绿部署的主要功能:

  • 烘焙期。烘焙期是设定用于监控新实例集的一段时间,在该期间完成后再进入下一个部署阶段。如果在任意烘焙期内触发了任何预先指定的警报,则所有端点流量都会回滚到旧实例集。烘焙期可以在最终完成流量的彻底转移之前,协助您确信更新没有问题。

  • 滚动批次大小。您可以精细控制流量转移中的每个批次的大小,或每个批次中要更新的实例数量。这个数字的范围在您的实例集大小的 5-50% 之间。您可以将批次大小指定为实例数量或实例集的整体百分比。

  • 自动回滚。您可以指定 SageMaker 用于监控新实例集的 Amazon CloudWatch 警报。如果更新代码的问题触发了任何警报,SageMaker 会启动向旧实例集的自动回滚以保持可用性,从而尽可能降低风险。

注意

如果您的端点使用排除项页面中列出的任何功能,则您无法使用滚动部署。

工作方式

在滚动部署期间,SageMaker 提供基础设施以将流量从旧实例集转移到新实例集,而无需同时预置所有的新实例。SageMaker 使用以下步骤来转移流量:

  1. SageMaker 在新实例集内预置了第一批实例。

  2. 一部分流量从旧实例转移到第一批新实例。

  3. 在烘焙期结束后,如果没有触发任何 Amazon CloudWatch 警报,SageMaker 就会清理一批旧实例。

  4. SageMaker 会继续分批预置、转移和清理实例,直到部署完成。

如果在某个烘焙期内触发了警报,则流量将按您指定的大小分批回滚到旧实例集。或者,您可以指定在触发警报时,滚动部署将全部流量转移回旧实例集。

下图显示了成功滚动部署的进度,如前面的步骤所述。


                图中显示滚动部署的流量成功从旧实例集转移到新实例集的步骤。

要创建滚动部署,您只需指定所需的部署配置。然后,SageMaker 为您处理新实例预置、旧实例终止和流量转移。您可以通过现有的 UpdateEndpointCreateEndpoint SageMaker API 以及 Amazon Command Line Interface 命令创建和管理部署。

先决条件

在设置滚动部署之前,您必须创建 Amazon CloudWatch 警报以监视端点中的指标。如果在烘焙期间触发了任何警报,则流量将开始回滚到您的旧实例集。要了解如何在端点上设置 CloudWatch 警报,请参阅先决条件页面自动回滚配置和监控。有关 CloudWatch 警报的更多信息,请参阅《Amazon CloudWatch 用户指南》中的使用 Amazon CloudWatch 警报

此外,请查看排除项页面,确保您的端点满足滚动部署的要求。

确定滚动批次大小

在更新端点之前,请确定用于将流量逐步转移到新实例集的批次大小。

对于滚动部署,您可以将批次大小指定为实例集容量的 5-50% 之间。如果您选择大批次大小,则部署完成的速度会更快。但请记住,这种情况下端点在更新时需要更多容量,开销大致相当于批次的大小。如果您选择较小的批次大小,则部署所需的时间会更长,但在部署期间使用的容量会较少。

配置滚动部署

在您准备好部署并为端点设置了 CloudWatch 警报后,即可使用 SageMaker UpdateEndpoint API 或 Amazon Command Line Interface 中的 update-endpoint 命令来启动部署。

如何更新端点

以下示例显示了如何使用 Boto3 SageMaker 客户端的 update_endpoint 方法通过滚动部署更新端点。

要配置滚动部署,请使用以下示例和字段:

  • 对于 EndpointName,请使用要更新的现有端点的名称。

  • 对于 EndpointConfigName,请使用要使用的端点配置的名称。

  • AutoRollbackConfiguration 对象的 Alarms 字段中,您可以通过名称来添加 CloudWatch 警报。为要使用的每个警报创建一个 AlarmName: <your-cw-alarm> 条目。

  • DeploymentConfig 下,对于 RollingUpdatePolicy 对象,请指定以下字段:

    • MaximumExecutionTimeoutInSeconds – 整体部署的时间限制。超过此限制会导致超时。您可以为此字段指定的最大值为 28800 秒,即 8 小时。

    • WaitIntervalInSeconds – 烘焙期的长度,在此期间,SageMaker 会监控新实例集内每个批次是否会出现警报。

    • MaximumBatchSize – 指定要使用的批次 Type(实例数或实例集的总体百分比)以及 Value,也就是每个批次的大小。

    • RollbackMaximumBatchSize – 使用此对象指定触发警报时的回滚策略。指定要使用的批次 Type(实例数或实例集的总体百分比)以及 Value,也就是每个批次的大小。如果您未指定这些字段,或者如果您将该值设置为端点的 100%,则 SageMaker 会使用蓝绿回滚策略,并在触发警报时将所有流量回滚到旧实例集。

import boto3 client = boto3.client("sagemaker") response = client.update_endpoint( EndpointName="<your-endpoint-name>", EndpointConfigName="<your-config-name>", DeploymentConfig={ "AutoRollbackConfiguration": { "Alarms": [ { "AlarmName": "<your-cw-alarm>" }, ] }, "RollingUpdatePolicy": { "MaximumExecutionTimeoutInSeconds": number, "WaitIntervalInSeconds": number, "MaximumBatchSize": { "Type": "INSTANCE_COUNT" | "CAPACITY_PERCENTAGE" (default), "Value": number }, "RollbackMaximumBatchSize": { "Type": "INSTANCE_COUNT" | "CAPACITY_PERCENTAGE" (default), "Value": number }, } } )

更新端点后,您需要检查滚动部署的状态并检查端点的运行状况。您可以在 SageMaker 控制台中查看端点的状态,也可以使用 DescribeEndpoint API 查看端点的状态。

DescribeEndpoint API 返回的 VariantStatus 对象中,Status 字段告诉您端点的当前部署或运行状态。有关可能的状态及其含义的更多信息,请参阅 ProductionVariantStatus

如果您尝试进行滚动部署,并且端点的状态为 UpdateRollbackFailed,请参阅以下部分以获取故障排除帮助。

故障处理

如果您的滚动部署失败并且自动回滚也失败,则端点的状态可能会保持为 UpdateRollbackFailed。此状态意味着不同的端点配置部署到了端点后的实例上,并且您的端点正在混合使用新旧端点配置来提供服务。

您可以再次调用 UpdateEndpoint API,将您的端点恢复到正常状态。指定所需的端点配置和部署配置(滚动部署、蓝绿部署或两者混用)以更新您的端点。

您可以调用 DescribeEndpoint API 来再次检查端点的运行状况,这会返回 VariantStatus 对象作为 Status 字段。如果更新成功,您的端点的 Status 将返回到 InService