SageMaker 中的模型托管模式:在 SageMaker PlatoBlockchain Data Intelligence 上测试和更新模型的最佳实践。 垂直搜索。 哎。

SageMaker 中的模型托管模式:在 SageMaker 上测试和更新模型的最佳实践

亚马逊SageMaker 是一项完全托管的服务,可为开发人员和数据科学家提供快速构建、训练和部署机器学习 (ML) 模型的能力。 借助 SageMaker,您可以在托管端点上部署 ML 模型并实时获得推理结果。 您可以轻松查看端点的性能指标 亚马逊CloudWatch, 自动缩放端点 基于流量,并在不损失任何可用性的情况下更新生产中的模型。 SageMaker 提供多种选项来部署 ML 模型以通过以下任何方式进行推理,具体取决于您的用例:

  • 对于需要以毫秒为单位提供服务的同步预测,请使用 SageMaker 实时推理
  • 对于在流量突增之间有空闲期并且可以容忍冷启动的工作负载,请使用 无服务器推理
  • 对于负载大小高达 1 GB、处理时间长(长达 15 分钟)和近实时延迟要求(秒到分钟)的请求,请使用 SageMaker 异步推理
  • 要获得整个数据集的预测,请使用 SageMaker 批量转换

实时推理非常适合您具有实时、交互式、低延迟要求的推理工作负载。 您将模型部署到 SageMaker 托管服务并获得可用于推理的端点。 这些端点由完全托管的基础架构和支持支持 自动缩放. 您可以通过使用以下方法将多个模型组合到一个端点来提高效率和成本 多模型端点 or 多容器端点.

在某些用例中,您希望将同一模型的多个变体部署到生产中,以衡量它们的性能、衡量改进或运行 A/B 测试。 在这种情况下,SageMaker 多变体终端节点很有用,因为它们允许您将模型的多个生产变体部署到同一个 SageMaker 终端节点。

在本文中,我们讨论了 SageMaker 多变体端点和优化最佳实践。

比较 SageMaker 实时推理选项

下图简要概述了 SageMaker 的实时推理选项。

单一模型端点允许您在托管在专用实例或无服务器实例上的容器上部署一个模型,以实现低延迟和高吞吐量。 您可以创建一个模型并 取回 a SageMaker 支持的图像 适用于 TensorFlow、PyTorch、Scikit-learn 等流行框架。 如果您正在为您的模型使用自定义框架,您还可以 带上你自己的容器 安装你的依赖项。

SageMaker 还支持更多高级选项,例如多模型端点 (MME) 和多容器端点 (MCE)。 当您处理成百上千个模型并且不需要将每个模型部署为单独的端点时,MME 非常有用。 MME 允许您使用托管在实例上的共享服务容器,以经济高效、可扩展的方式在同一端点内托管多个模型。 底层基础设施(容器和实例)保持不变,但根据端点上的使用情况和可用内存量,从公共 S3 位置动态加载和卸载模型。 您的应用程序只需要将带有目标模型的 API 调用包含到此端点,即可实现低延迟、高吞吐量推理。 无需为每个模型支付单独的端点,您可以以单个端点的价格托管多个模型。

MCE 使您能够在单个端点上运行多达 15 个不同的 ML 容器并独立调用它们。 您可以在不同的服务堆栈(例如 ML 框架、模型服务器和算法)上构建这些 ML 容器,以在同一端点上运行以节省成本。 您可以将容器缝合在一起 串行推理管道 或独立调用容器。 当您拥有多个具有不同流量模式和相似资源需求的不同 ML 模型时,这可能是理想的选择。 何时使用 MCE 的示例包括但不限于以下内容:

  • 跨不同框架(例如 TensorFlow、PyTorch 和 Scikit-learn)托管模型,这些框架没有足够的流量来使实例的全部容量饱和
  • 托管来自具有不同 ML 算法(例如推荐、预测或分类)和处理函数的同一框架的模型
  • 针对 A/B 测试等场景,在不同框架版本(例如 TensorFlow 1.x 与 TensorFlow 2.x)上运行的类似架构的比较

SageMaker 多变体端点 (MVE) 允许您使用生产变体在同一端点后面测试多个模型或模型版本。 每个生产变体都标识一个 ML 模型和为托管该模型而部署的资源,例如服务容器和实例。

SageMaker 多变体端点概述

在生产 ML 工作流中,数据科学家和 ML 工程师通过各种方法改进模型,例如基于数据/模型/概念漂移的再训练、超参数调整、特征选择、框架选择等。 在新模型和具有生产流量的旧模型之间执行 A/B 测试可能是新模型验证过程中有效的最后一步。 在 A/B 测试中,您测试模型的不同变体并比较每个变体相对于彼此的表现。 然后,您可以选择性能最佳的模型,用性能优于先前版本的新版本替换先前的模型。 通过使用生产变体,您可以在同一端点后面测试这些 ML 模型和不同模型版本。 您可以使用不同的数据集、不同的算法和 ML 框架来训练这些 ML 模型; 将它们部署到不同的实例类型; 或这些选项的任意组合。 连接到 SageMaker 端点的负载均衡器提供了跨多个生产变体分发调用请求的能力。 例如,您可以通过为每个变体指定流量分配来在生产变体之间分配流量,或者您可以为每个请求直接调用特定变体。

您还可以配置自动扩展策略,以根据每秒请求数等指标自动扩展或缩小您的变体。

下图更详细地说明了 MVE 的工作原理。

SageMaker 多变体端点

部署 MVE 也非常简单。 您需要做的就是使用图像和模型数据定义模型对象 create_model 从 SageMaker Python SDK 构建,并使用定义端点配置 production_variant 构造以创建生产变体,每个变体都有自己不同的模型和资源要求(实例类型和数量)。 这使您还可以在不同的实例类型上测试模型。 要部署,请使用 endpoint_from_production_variant 构造以创建端点。

在端点创建期间,SageMaker 预配端点设置中指定的托管实例,并将生产变体指定的模型和推理容器下载到托管实例。 如果在启动容器并使用 ping 执行健康检查后返回成功响应,则会向用户发送一条指示端点创建完成的消息。 请参见以下代码:

sm_session.create_model(
	name=model_name,
	role=role,
	container_defs={'Image':  image_uri, 'ModelDataUrl': model_url}
	)

sm_session.create_model(
	name=model_name2,
	role=role,
	container_defs={'Image':  image_uri, 'ModelDataUrl': model_url2 }
	)

variant1 = production_variant(
	model_name=model_name,
	instance_type="ml.c5.4xlarge",
	initial_instance_count=1,
	variant_name="Variant1",
	initial_weight=1
	)

variant2 = production_variant(
	model_name=model_name2,
	instance_type="ml.m5.4xlarge",
	initial_instance_count=1,
	variant_name="Variant2",
	initial_weight=1
	)

sm_session.endpoint_from_production_variants(
	name=endpoint_name,
	production_variants=[variant1,  variant2]
	)

在前面的示例中,我们创建了两个变体,每个变体都有自己不同的模型(它们也可以有不同的实例类型和计数)。 我们设置了一个 initial_weight 两种变体均为 1:这意味着我们 50% 的请求转到 Variant1, 剩下的 50% 到 Variant2. 两个变体的权重总和为 2,每个变体的权重分配为 1。这意味着每个变体接收总流量的 50%。

调用端点类似于常见的 SageMaker 构造 invoke_endpoint; 您可以使用数据作为有效负载直接调用端点:

sm_runtime.invoke_endpoint(
	EndpointName=endpoint_name,
	ContentType="text/csv",
	Body=payload
	)

SageMaker 发出指标,例如 LatencyInvocations CloudWatch 中的每个变体。 有关 SageMaker 发出的指标的完整列表,请参阅 使用Amazon CloudWatch监控Amazon SageMaker. 您可以查询 CloudWatch 以获取每个变体的调用次数,以查看默认情况下调用是如何跨变体拆分的。

要调用特定版本的模型,请将变体指定为 TargetVariant 在调用 invoke_endpoint:

sm_runtime.invoke_endpoint(
	EndpointName=endpoint_name,
	ContentType="text/csv",
	Body=payload,
	TargetVariant="Variant1"
	)

您可以通过查看每个变体的准确性、精确度、召回率、F1 分数和接受者操作特征/曲线下面积等指标来评估每个生产变体的性能 Amazon SageMaker模型监控器. 然后,您可以通过调用更新分配给每个变体的权重来决定增加最佳模型的流量 更新端点权重和容量. 这会更改您的生产变体的流量分配,而无需更新您的端点。 因此,我们将 50% 的流量转移到初始设置,而不是 75% 的流量 Variant2 通过使用为每个变体分配新的权重 UpdateEndpointWeightsAndCapacities。 请参见以下代码:

sm.update_endpoint_weights_and_capacities(
	EndpointName=endpoint_name,
	DesiredWeightsAndCapacities=[
	{
		"DesiredWeight": 25,
		"VariantName": variant1["VariantName"]
	},
	{
		"DesiredWeight": 75,
		"VariantName": variant2["VariantName"]
	}
] )

当您对变体的性能感到满意时,您可以将 100% 的流量路由到该变体。 例如,您可以设置权重 Variant1 为 0,权重为 Variant2 1. SageMaker 然后将所有推理请求的 100% 发送到 Variant2. 然后您可以安全地更新您的端点并删除 Variant1 从你的端点。 您还可以通过向端点添加新变体来继续在生产环境中测试新模型。 您还可以将这些端点配置为根据端点接收的流量自动扩展。

多变异端点的优势

SageMaker MVE 允许您执行以下操作:

  • 使用相同的 SageMaker 端点部署和测试模型的多个变体。 这对于测试生产中模型的变体很有用。 例如,假设您已将模型部署到生产环境中。 您可以通过将少量流量(比如 5%)定向到新模型来测试模型的变体。
  • 通过监控 CloudWatch 中每个变体的运营指标,在不中断流量的情况下评估生产中的模型性能。
  • 在不损失任何可用性的情况下更新生产中的模型。 您可以修改端点,而无需使已部署到生产中的模型停止服务。 例如,您可以添加新的模型变体,更新现有模型变体的 ML 计算实例配置,或更改模型变体之间的流量分布。 有关详细信息,请参阅 更新端点更新端点权重和容量.

使用多变量端点时的挑战

SageMaker MVE 面临以下挑战:

  • 负载测试工作 – 您需要为每个变体的测试和模型矩阵比较投入大量的精力和资源。 要将 A/B 测试视为成功,您需要对从测试中收集的指标进行统计分析,以确定是否存在具有统计显着性的结果。 尽量减少探索性能不佳的变体可能会变得具有挑战性。 你可能会使用 多臂强盗 优化技术以避免将流量发送到不起作用的实验并在测试时优化性能。 对于负载测试,您还可以探索 Amazon SageMaker 推理推荐器 根据对延迟和吞吐量的生产要求、自定义流量模式和您选择的实例(最多 10 个)进行广泛的基准测试。
  • 模型变体和端点之间的紧密耦合 – 根据模型部署频率,它可能会变得棘手,因为端点可能最终会出现在 updating 每个正在更新的生产变体的状态。 SageMaker 还支持 部署护栏,您可以使用它以可控的方式轻松地从生产中的当前模型切换到新模型。 这个选项介绍 金丝雀线性 流量转移模式,以便您可以在更新过程中对流量从当前模型转移到新模型进行精细控制。 借助自动回滚等内置保护措施,您可以及早发现问题并在问题对生产造成重大影响之前自动采取纠正措施。

多变量端点的最佳实践

使用 SageMaker MVE 托管模型时,请考虑以下事项:

  • SageMaker 非常适合测试新模型,因为您可以轻松地将它们部署到 A/B 测试环境中,并且只需为使用的部分付费。 在端点运行时,您将按每个实例消耗的实例小时数付费。 当您完成测试并且不再广泛使用端点或变体时,您应该删除它以节省成本。 当你再次需要它时,你总是可以重新创建它,因为模型存储在 亚马逊简单存储服务 (亚马逊S3)。
  • 您应该使用最佳实例类型和大小来部署模型。 SageMaker 目前提供 ML计算实例 在各种实例系列上。 端点实例一直在运行(当实例处于服务状态时)。 因此,选择正确的实例类型会对 ML 模型的总成本和性能产生重大影响。 负载测试 是确定适当的实例类型和队列大小的最佳实践,无论是否为您的实时端点自动缩放,以避免过度配置和为您不需要的容量支付额外费用。
  • 您可以在 CloudWatch 中监控模型性能和资源利用率。 您可以配置一个 ProductionVariant 使用 应用程序自动缩放. 要指定扩展策略的指标和目标值,您可以配置目标跟踪扩展策略。 您可以使用预定义指标或自定义指标。 有关策略配置语法的更多信息,请参阅 目标跟踪缩放策略配置. 有关配置自动缩放的信息,请参阅 自动缩放Amazon SageMaker模型. 要为变体快速定义目标跟踪扩展策略,您可以选择特定的 CloudWatch 指标并设置阈值。 例如,使用公制 SageMakerVariantInvocationsPerInstance 监视每分钟调用变体的每个实例的平均次数,或使用指标 CPUUtilization 监视 CPU 处理的工作总量。 以下示例使用 SageMakerVariantInvocationsPerInstance 预定义的指标来调整变体实例的数量,以便每个实例都有一个 InvocationsPerInstance 70 的指标:
{
	"TargetValue": 70.0,
	"PredefinedMetricSpecification":
	{
		"PredefinedMetricType": "SageMakerVariantInvocationsPerInstance"
	}
}

  • 在部署模型后更改或删除模型工件或更改推理代码会产生不可预测的结果。 在将模型部署到生产环境之前,最好在充分调试推理代码片段(如 model_fn, input_fn, predict_fnoutput_fn) 在本地开发环境中,例如 SageMaker 笔记本实例或本地服务器。 如果您需要更改或删除模型工件或更改推理代码,请通过提供新的端点配置来修改端点。 提供新端点配置后,您可以更改或删除与旧端点配置对应的模型工件。
  • 您可以使用 SageMaker 批量转换 测试生产变体。 批量转换非常适合从大型数据集中获取推论。 您可以为每个新模型变体创建一个单独的转换作业,并使用验证数据集进行测试。 对于每个转换作业,在 Amazon S3 中为输出文件指定一个唯一的模型名称和位置。 要分析结果,请使用 推理管道日志和指标.

结论

SageMaker 使您能够通过在端点上运行多个生产变体轻松地在生产中对 ML 模型进行 A/B 测试。 您可以使用 SageMaker 的功能来测试使用不同训练数据集、超参数、算法或 ML 框架训练的模型; 他们如何在不同的实例类型上执行; 或以上所有的组合。 您可以提供端点上变体之间的流量分布,SageMaker 根据指定的分布将推理流量拆分到变体。 或者,如果您想为特定客户群测试模型,您可以通过提供以下方式指定应该处理推理请求的变体 TargetVariant 标头,SageMaker 会将请求路由到您指定的变体。 有关 A/B 测试的更多信息,请参阅 在生产中安全地更新模型.

参考资料


关于作者

SageMaker 中的模型托管模式:在 SageMaker PlatoBlockchain Data Intelligence 上测试和更新模型的最佳实践。 垂直搜索。 哎。迪帕里•拉贾莱 是 Amazon Web Services 的 AI/ML 专家技术客户经理。 她与企业客户合作,提供有关通过最佳实践实施机器学习解决方案的技术指导。 在业余时间,她喜欢徒步旅行、看电影以及与家人和朋友一起出去玩。

SageMaker 中的模型托管模式:在 SageMaker PlatoBlockchain Data Intelligence 上测试和更新模型的最佳实践。 垂直搜索。 哎。达瓦尔·帕特尔 是 AWS 的首席机器学习架构师。 他曾与从大型企业到中型初创公司的组织合作,解决与分布式计算和人工智能相关的问题。 他专注于深度学习,包括 NLP 和计算机视觉领域。 他帮助客户在 SageMaker 上实现高性能模型推理。

SageMaker 中的模型托管模式:在 SageMaker PlatoBlockchain Data Intelligence 上测试和更新模型的最佳实践。 垂直搜索。 哎。 索拉布·特里坎德 是 Amazon SageMaker Inference 的高级产品经理。 他热衷于与客户合作,并以机器学习民主化的目标为动力。 他专注于与部署复杂的 ML 应用程序、多租户 ML 模型、成本优化以及使深度学习模型的部署更易于访问相关的核心挑战。 在业余时间,Saurabh 喜欢徒步旅行、学习创新技术、关注 TechCrunch 以及与家人共度时光。

时间戳记:

更多来自 AWS机器学习