通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

使用 Amazon SageMaker 影子测试最大限度地减少 ML 模型更新对生产的影响

亚马逊SageMaker 现在允许您使用部署安全实践将模型服务堆栈的新版本与当前部署版本的性能进行比较 阴影测试. 影子测试可以帮助您在影响最终用户之前识别潜在的配置错误和性能问题。 使用 SageMaker,您无需投资构建影子测试基础设施,让您可以专注于模型开发。 SageMaker 负责将新版本与服务于生产请求的当前版本一起部署,将部分请求路由到影子版本。 然后,您可以使用延迟和错误率等指标比较两个版本的性能。 这让您更加确信 SageMaker 推理端点的生产部署不会导致性能下降,并帮助您避免因意外错误配置而导致的中断。

在这篇文章中,我们演示了这种新的 SageMaker 功能。 此 GitHub 中提供了相应的示例笔记本 知识库.

解决方案概述

您的模型服务基础设施由机器学习 (ML) 模型、服务容器或计算实例组成。 让我们考虑以下场景:

  • 您正在考虑将已通过离线验证的新模型推广到生产环境,但希望在做出此决定之前评估操作性能指标,例如延迟、错误率等。
  • 您正在考虑对服务基础设施容器进行更改,例如修补漏洞或升级到更新版本,并希望在升级到生产环境之前评估这些更改的影响。
  • 您正在考虑更改您的 ML 实例,并希望评估新实例如何处理实时推理请求。

下图说明了我们的解决方案体系结构。

对于这些场景中的每一个,选择一个您要测试的生产变体,SageMaker 会自动以影子模式部署新变体,并在同一端点内实时将推理请求的副本路由到它。 只有生产变体的响应会返回到调用应用程序。 您可以选择丢弃或记录影子变体的响应以进行离线比较。 或者,您可以通过内置仪表板监控变体,并并排比较性能指标。 您可以通过 SageMaker 推理更新端点 API 或通过 SageMaker 控制台使用此功能。

影子变体建立在 SageMaker 推理端点中的生产变体功能之上。 重申一下,一个 生产变体 由 ML 模型、服务容器和 ML 实例组成。 因为每个变体都独立于其他变体,所以您可以跨变体使用不同的模型、容器或实例类型。 SageMaker 允许您在每个变体的基础上指定自动扩展策略,以便它们可以根据传入负载独立扩展。 SageMaker 支持每个端点最多 10 个生产变体。 您可以通过设置变体权重将变体配置为接收一部分传入流量,或者在传入请求中指定目标变体。 来自生产变体的响应被转发回调用者。

A 阴影变体(新) 具有与生产变体相同的组件。 用户指定的请求部分,称为 流量采样率, 被转发到影子变体。 您可以选择将影子变体的响应记录在 亚马逊简单存储服务 (亚马逊 S3)或丢弃它。

请注意,SageMaker 最多支持每个终端节点一个影子变体。 对于具有影子变体的端点,最多可以有一个生产变体。

设置生产和影子变体后,您可以监控 调用指标 对于生产和阴影变体 亚马逊CloudWatch 在下面 AWS/SageMaker 命名空间。 SageMaker 端点的所有更新都使用 蓝/绿部署 并在没有任何可用性损失的情况下发生。 当您添加、修改或删除影子变体时,您的端点将继续响应生产请求。

您可以通过以下两种方式之一使用此功能:

  • 使用 SageMaker 控制台进行托管影子测试 – 您可以利用控制台获得引导式体验,以管理影子测试的端到端旅程。 这使您可以在预定义的持续时间内设置影子测试,通过实时仪表板监控进度,完成后清理并根据结果采取行动。
  • 使用 SageMaker 推理 API 的自助影子测试 – 如果您的部署工作流程已经使用创建/更新/删除端点 API,您可以继续使用它们来管理影子变体。

在以下部分中,我们将逐一介绍这些场景。

场景 1 – 使用 SageMaker 控制台进行托管影子测试

如果您希望选择 SageMaker 来管理创建、管理和处理影子测试结果的端到端工作流程,请考虑使用 SageMaker 控制台推理部分中的影子测试功能。 如前所述,这使您能够在预定义的持续时间内设置影子测试,通过实时仪表板监控进度,在完成时显示清理选项,并根据结果采取行动。 要了解更多信息,请访问影子测试 部分 我们的文档以逐步演练此功能。

先决条件

用于生产和影子的模型需要在 SageMaker 上创建。 请参阅 CreateModel API 相关信息.

第 1 步 – 创建影子测试

导航到 推理 SageMaker 控制台左侧导航面板的部分,然后选择影子测试。 这会将您带到一个仪表板,其中包含所有计划的、正在运行的和已完成的影子测试。 点击 '创建影子测试'. 输入测试的名称并选择下一步。

这将带您进入影子测试设置页面。 您可以选择一个现有的 IAM 角色或创建一个具有 AmazonSageMakerFullAccess 附加 IAM 政策。 接下来,选择“创建一个新端点' 并输入名称 (xgb-prod-shadow-1)。 您可以通过单击“添加与此端点关联的一种生产变体和一种影子变体添加' 在变体部分。 您可以选择您在“添加模型' 对话框。 这将创建生产或变体。 或者,您可以更改与每个变体关联的实例类型和计数。

所有流量都流向生产变体,它响应调用请求。 您可以通过更改 Traffic Sampling Percentage.

您可以将测试的持续时间控制在一小时到 30 天之间。 如果未指定,则默认为 7 天。 在此期间之后,测试被标记为完成。 如果您正在现有端点上运行测试,它将在完成后回滚到开始测试之前的状态。

您可以选择使用以下方法捕获 Shadow 变体的请求和响应 Data Capture 选项。 如果未指定,则丢弃影子变体的响应。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

第 2 步 – 监控影子测试

您可以通过导航到 Shadow Tests 推理下的部分。 单击在上一步中创建的影子测试以查看影子测试的详细信息并在它进行时或完成后对其进行监控。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

指标部分提供了关键指标的比较,并提供了生产和影子变体之间的重叠图,以及描述性统计数据。 您可以比较调用指标,例如 ModelLatencyInvocation4xxErrors 以及实例指标,例如 CPUUtilizationDiskUtilization.

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

第 3 步 – 将 Shadow 变体提升为新的生产变体

比较后,您可以选择将影子变体提升为新的生产变体或删除影子变体。 对于这两个选项,选择“标记完成' 在页面顶部。 这为您提供了一个选项来提升或删除影子变体。

如果您选择推广,您将被带到部署页面,您可以在其中确认部署前的变体设置。 在部署之前,我们建议调整影子变体的大小,以便能够处理 100% 的调用流量。 如果您不使用影子测试来评估替代实例类型或大小,您可以使用选择 '保留生产变量设置. 否则,您可以选择“保留阴影变体设置. 如果您选择此选项,请确保您的流量采样设置为 100%。 或者,如果您希望覆盖这些设置,您可以指定实例类型和计数。

一旦您确认部署,SageMaker 将启动对您的端点的更新,以将影子变体提升为新的生产变体。 与 SageMaker 的所有更新一样,您的终端节点在更新期间仍可运行。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

场景 2:使用 SageMaker 推理 API 进行影子测试

本节介绍如何使用现有的 SageMaker 创建/更新/删除端点 API 来部署影子变体。

对于这个例子,我们有两个 XGBoost 模型,代表两个不同版本的预训练模型。 model.tar.gz 是当前部署在生产中的模型。 model2 是较新的模型,我们希望在决定将其用于生产之前根据延迟等操作指标测试其性能。 我们部署 model2 作为阴影变体 model.tar.gz. 两个预训练模型都存储在公共 S3 存储桶中 s3://sagemaker-sample-files. 我们首先下载本地计算实例的模型,然后上传到 S3。

此示例中的模型用于预测移动客户离开其当前移动运营商的可能性。 我们使用的数据集是公开的,并且在书中提到过 发现数据知识 丹尼尔·T·拉罗斯 (Daniel T. Larose) 着。 这些模型是使用 XGB流失预测笔记本 在 SageMaker 中。 您还可以使用自己的预训练模型,在这种情况下您可以跳过从 s3://sagemaker-sample-files 并将您自己的模型直接复制到模型/文件夹。

!aws s3 cp s3://sagemaker-sample-files/models/xgb-churn/xgb-churn-prediction-model.tar.gz model/
!aws s3 cp s3://sagemaker-sample-files/models/xgb-churn/xgb-churn-prediction-model2.tar.gz model/

第 1 步 – 创建模型

我们将模型文件上传到我们自己的 S3 存储桶并创建两个 SageMaker 模型。 请参见以下代码:

model_url = S3Uploader.upload(
    local_path="model/xgb-churn-prediction-model.tar.gz",
    desired_s3_uri=f"s3://{bucket}/{prefix}",
)
model_url2 = S3Uploader.upload(
    local_path="model/xgb-churn-prediction-model2.tar.gz",
    desired_s3_uri=f"s3://{bucket}/{prefix}",
from sagemaker import image_uris
image_uri = image_uris.retrieve("xgboost", boto3.Session().region_name, "0.90-1")
image_uri2 = image_uris.retrieve("xgboost", boto3.Session().region_name, "0.90-2")

model_name = f"DEMO-xgb-churn-pred-{datetime.now():%Y-%m-%d-%H-%M-%S}"
model_name2 = f"DEMO-xgb-churn-pred2-{datetime.now():%Y-%m-%d-%H-%M-%S}"

resp = sm.create_model(
    ModelName=model_name,
    ExecutionRoleArn=role,
    Containers=[{"Image": image_uri, "ModelDataUrl": model_url}],
)

resp = sm.create_model(
    ModelName=model_name2,
    ExecutionRoleArn=role,
    Containers=[{"Image": image_uri2, "ModelDataUrl": model_url2}],
)

第 2 步 – 将两个模型作为生产和影子变体部署到实时推理端点

我们使用生产和影子变体创建端点配置。 这 ProductionVariantsShadowProductionVariants 是特别感兴趣的。 这两个变体都有 ml.m5.xlarge 实例,具有 4 个 vCPU 和 16 GiB 内存,并且初始实例计数设置为 1。请参见以下代码:

ep_config_name = f"Shadow-EpConfig-{datetime.now():%Y-%m-%d-%H-%M-%S}"
production_variant_name = "production"
shadow_variant_name = "shadow"
create_endpoint_config_response = sm.create_endpoint_config(
    EndpointConfigName=ep_config_name,
    ProductionVariants=[
    # Type: Array of ProductionVariant (https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ProductionVariant.html) objects
      { 
         "VariantName": shadow_variant_name,
        {
            "VariantName": production_variant_name,
            "ModelName": model_name,
            "InstanceType": "ml.m5.xlarge",
            "InitialInstanceCount": 2,
            "InitialVariantWeight": 1,
        }
    ],
     # Type: Array of ShadowProductionVariants 
    ShadowProductionVariants = [
         "ModelName": model_name2,
         "InitialInstanceCount": 1,
         "InitialVariantWeight": 0.5,
         "InstanceType": "ml.m5.xlarge" 
      }
   ]
)

最后,我们创建生产和影子变体:

endpoint_name = f"xgb-prod-shadow-{datetime.now():%Y-%m-%d-%H-%M-%S}"
create_endpoint_api_response = sm.create_endpoint(
                                    EndpointName=endpoint_name,
                                    EndpointConfigName=ep_config_name,
                                )

第 3 步 – 调用端点进行测试

成功创建端点后,您可以开始调用它。 我们按顺序发送大约 3,000 个请求:

def invoke_endpoint(endpoint_name, wait_interval_sec=0.01, should_raise_exp=False):
    with open("test_data/test-dataset-input-cols.csv", "r") as f:
        for row in f:
            payload = row.rstrip("n")
            try:
                for i in range(10): #send the same payload 10 times for testing purpose
                    response = sm_runtime.invoke_endpoint(
                        EndpointName=endpoint_name, ContentType="text/csv", Body=payload
                    )
            except Exception as e:
                print("E", end="", flush=True)
                if should_raise_exp:
                    raise e

invoke_endpoint(endpoint_name)

第 4 步 – 比较指标

现在我们已经部署了生产模型和影子模型,让我们比较一下调用指标。 有关可用于比较的调用指标列表,请参阅 使用Amazon CloudWatch监控Amazon SageMaker. 让我们从比较生产变体和影子变体之间的调用开始。

InvocationsPerInstance 指标是指发送到生产变体的调用次数。 在变体权重中指定的这些调用的一部分被发送到影子变体。 每个实例的调用是通过将调用总数除以变体中的实例数来计算的。 如下图所示,我们可以确认生产变体和影子变体都在根据端点配置中指定的权重接收调用请求。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

接下来,让我们比较模型延迟(ModelLatency 公制)在生产和阴影变体之间。 模型延迟是模型从 SageMaker 观察到的响应时间。 我们可以观察影子变体的模型延迟与生产变体相比如何,而无需将最终用户暴露给影子变体。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

我们期望开销延迟(OverheadLatency 公制)在生产和影子变体之间具有可比性。 开销延迟是从 SageMaker 收到请求到它向客户端返回响应的时间减去模型延迟后测量的时间间隔。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。

第 5 步 - 推广您的影子变体

要将影子模型提升到生产环境,请使用当前创建一个新的端点配置 ShadowProductionVariant 作为新的 ProductionVariant 并删除 ShadowProductionVariant. 这将删除当前 ProductionVariant 并提升影子变体成为新的生产变体。 与往常一样,所有 SageMaker 更新都在后台编排为蓝/绿部署,并且在执行更新时不会损失可用性。

或者,您可以利用 部署护栏 如果您想在更新期间使用一次性流量转移和自动回滚。

promote_ep_config_name = f"PromoteShadow-EpConfig-{datetime.now():%Y-%m-%d-%H-%M-%S}"

create_endpoint_config_response = sm.create_endpoint_config(
    EndpointConfigName=promote_ep_config_name,
    ProductionVariants=[
        {
            "VariantName": shadow_variant_name,
            "ModelName": model_name2,
            "InstanceType": "ml.m5.xlarge",
            "InitialInstanceCount": 2,
            "InitialVariantWeight": 1.0,
        }
    ],
)
print(f"Created EndpointConfig: {create_endpoint_config_response['EndpointConfigArn']}")

update_endpoint_api_response = sm.update_endpoint(
    EndpointName=endpoint_name,
    EndpointConfigName=promote_ep_config_name,
)

wait_for_endpoint_in_service(endpoint_name)

sm.describe_endpoint(EndpointName=endpoint_name)

第 6 步 - 清理

如果您不打算进一步使用此端点,则应删除该端点以避免产生额外费用并清理此博客中创建的其他资源。

dsm.delete_endpoint(EndpointName=endpoint_name)
sm.delete_endpoint_config(EndpointConfigName=ep_config_name)
sm.delete_endpoint_config(EndpointConfigName=promote_ep_config_name)
sm.delete_model(ModelName=model_name)
sm.delete_model(ModelName=model_name2)

结论

在本文中,我们介绍了 SageMaker 推理的一项新功能,使用称为影子测试的部署安全实践,在全面生产推出之前,将模型服务堆栈的新版本与当前部署版本的性能进行比较。 我们向您介绍了使用影子变体的优势以及使用 端到端示例. 要了解有关阴影变体的更多信息,请参阅阴影测试 文件.


作者简介

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。拉古·拉梅沙 是 Amazon SageMaker 服务团队的机器学习解决方案架构师。 他专注于帮助客户大规模构建、部署 ML 生产工作负载并将其迁移到 SageMaker。 他专注于机器学习、AI 和计算机视觉领域,并拥有 UT Dallas 的计算机科学硕士学位。 在业余时间,他喜欢旅行和摄影。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。李庆伟 是Amazon Web Services的机器学习专家。 他获得了博士学位。 在他打破了顾问的研究补助金帐户并未能兑现他所承诺的诺贝尔奖之后,他便在运筹学获得博士学位。 目前,他帮助金融服务和保险行业的客户在AWS上构建机器学习解决方案。 在业余时间,他喜欢阅读和教学。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。赵启云 是 Amazon SageMaker 推理平台团队的高级软件开发工程师。 他是 Deployment Guardrails 和 Shadow Deployments 的首席开发人员,专注于帮助客户以高可用性大规模管理 ML 工作负载和部署。 他还致力于平台架构的演进,以实现快速安全的 ML 作业部署和轻松运行 ML 在线实验。 在业余时间,他喜欢阅读、游戏和旅行。

通过 Amazon SageMaker 影子测试 PlatoBlockchain 数据智能,最大限度地减少 ML 模型更新对生产的影响。 垂直搜索。 人工智能。塔伦塞拉姆 是 Amazon SageMaker Inference 的高级产品经理。 他有兴趣了解机器学习的最新趋势并帮助客户利用这些趋势。 在业余时间,他喜欢骑自行车、滑雪和打网球。

时间戳记:

更多来自 AWS机器学习