乐趣区

关于人工智能:软件开发领域常用的AB测试也能用给ML模型啦

一般来说,开发进去的 ML 模型还须要一直地欠缺能力提供让人称心的后果。然而在很多场景,例如在电子商务利用等多种理论环境中,单靠离线评估并不足以保障模型品质,咱们须要在生产期间对模型进行 A / B 测试,并据此做出模型更新决策。

借助 Amazon SageMaker,大家能够在端点之上运行多个生产模型变体,轻松对 ML 模型执行 A / B 测试。这些生产模型变体能够别离对应由不同训练数据集、算法以及 ML 框架训练而成的 ML 模型,再配合不同的云实例类型,即可建设起多种测试因素组合。

===

Amazon SageMaker 是一项全托管服务,可能将疾速构建、训练以及部署机器学习(ML)模型的能力交付至每一位开发人员及数据科学家手中。目前,包含 Intuit、Voodoo、ADP、Cerner、道琼斯以及 Thomson Reuters 在内的成千上万家客户都在应用 Amazon SageMaker 以加重 ML 流程的经营累赘。在 Amazon SageMaker 的帮忙下,咱们能够在托管端点上部署本人的 ML 模型,并实时获取推理后果。大家也能够通过 Amazon CloudWatch 轻松查看端点的性能指标、启用 Autoscaling 以依据流量变动主动扩大端点,并在生产期间更新模型且不造成任何可用性影响。

当初,大家曾经能够将理论流量散发至同一端点上的各个变种当中,并由 Amazon SageMaker 依据指定的散发形式在各变体之间调配推理流量。对于心愿管制发送至各个变体的流量的用户,这项性能有助于解脱指向特定变体的申请路由操作,显著简化实现流程。例如,咱们可能须要更新生产环境中的模型,并将局部流量定向至新模型以测试其与原有模型间的性能差别。此外,在某些特定用例中,咱们也须要应用特定模型解决推理申请,并调用零碎中的特定变体。例如,大家可能心愿测试并比拟 ML 模型在不同客户群体中的性能体现,并对来自客户的申请做出进一步细分,将其中特定局部齐全交由某一特定变体进行解决。

而为了抉择应用哪个变体解决推理申请,咱们只须要在每项推理申请上增加 TargetVariant 标头,即可由 Amazon SageMaker 保障由指定的变体解决该项申请。

用例:Amazon Alexa

Amazon Alexa 应用 Amazon SageMaker 治理各类 ML 工作负载。Amazon Alexa 团队会频繁更新其 ML 模型,借此应答各种新兴平安威逼。为此,在应用 Amazon SageMaker 中的模型测试性能向生产环境公布新的模型版本前,该团队会测试、比拟并确定哪个版本更合乎其安全性、隐衷性以及业务需要。对于 Alexa 团队在客户平安与隐衷爱护方面的更多具体钻研信息,请参阅在文本中应用分层构造示意模式放弃隐衷与实用程序。

Alexa 体验与设施团队软件开发经理 Nathanael Teissier 示意,“Amazon SageMaker 中提供的模型测试性能使咱们得以测试隐衷爱护模型的最新版本,并保障这些模型都能合乎咱们在客户隐衷方面提出的最高规范。作为一项新性能,SageMaker 可能依据各项申请抉择所须要的生产变体,从而在无需批改以后设置的前提下为 A / B 测试的部署策略带来新的可能性。”

下文将向大家展现如何通过指向变体的流量调配与特定变体调用,轻松在 Amazon SageMaker 当中对 ML 模型执行 A / B 测试。咱们的测试模型曾经配合不同训练数据集实现训练,且所有生产变体皆部署在 Amazon SageMaker 端点上。

应用 Amazon SageMaker 进行 A /B 测试

在生产 ML 工作流当中,数据科学家与工程师们常常尝试各种形式以改良现有模型,例如执行超参数调优,或者引入更多或最新数据进行训练或改善特征选择等。而对新模型以及解决生产流量的旧模型上执行 A / B 测试,往往是模型验证流程中的最初一个环节。在 A / B 测试中,咱们须要测试模型朱同变体,并比拟各个变体的绝对性能。如果新版本带来的性能优于或者等同于原有版本,即可应用新模型替换新模型。

Amazon SageMaker 容许用户通过生产变体,在同一端点之后测试多种模型或者模型的多个版本。每个 ProductionVariant 都会标识一个 ML 模型以及托管该模型所对应的部署资源。咱们能够为每个生产变体提供流量调配,或者在各项申请中间接调用指标变体以将端点调用申请调配给多个生产变体。在以下各章节中,咱们将具体介绍测试 ML 模型的两种办法。

向各变体调配流量以测试模型

要通过向多个模型调配流量以测试各模型,咱们须要在端点配置中为各生产变体指定权重,从而布局路由至各个模型的流量百分比。Amazon SageMaker 会依据大家提供的具体权重,在各生产变体之间调配流量。这也是生产变体在理论应用中的默认形式。下图所示,具体介绍了整个测试流程的具体实现形式。请留神,咱们还应在每个推理响应中蕴含解决申请的变体名称。

通过调用各变体进行模型测试

要通过调用各变体进行模型测试,咱们须要在申请当中设置 TargetVariant 标头。如果曾经提供了权重并指定 TargetVariant 以调配流量,则指标路由将笼罩掉原有流量散发形式。下图所示,具体介绍了这种办法的运作形式。在这里,咱们在推理申请中调用 ProductionVariant3,大家也能够同时在各项申请中调用不同的变体。

解决方案概述

本文将通过示例向大家介绍如何应用这项新性能。咱们能够在 Amazon SageMaker 中应用 Jupyter notebook 以创立用于托管两套模型的端点(应用 ProductionVariant)。两套模型皆通过 Amazon SageMaker 内置的 XGBoost 算法配合用于预测挪动运营商客户散失的数据集训练而成。对于模型训练的更多详细信息,请参阅 XGBoost 客户散失预测。在以下用例中,咱们将应用同一数据集中的不同子集进行模型训练,并在各模型中应用不同的 XGBoost 算法版本。

通过应用 Amazon SageMaker Jupyter notebook 中的 A / B 测试示例,大家也能够本人尝试整个过程。咱们能够在 Amazon SageMaker Studio 或者 Amazon SageMaker notebook 实例中理论运行。咱们应用的数据集齐全公开可用,Daniel T. Larose 也曾在《从数据中发现常识(Discovering Knowledge in Data)》一书中提到这套数据集。作者称,其为来自加州大学尔湾分校的机器学习数据集。

本次演练蕴含以下操作步骤:

  • 创立并部署模型。
  • 调用已部署模型。
  • 评估变体性能。
  • 将推理流量导向您所选定的生产变体。

创立并部署模型

首先,咱们须要定义模型在 Amazon Simple Storage Service(Amazon S3)中的地位。在后续模型部署步骤当中,咱们须要应用这些地位。具体请参见以下代码:

model_url = f"s3://{path_to_model_1}"
model_url2 = f"s3://{path_to_model_2}"

接下来,应用容器镜像与模型数据创立模型对象。咱们能够将这些模型对象作为生产变体部署在端点之上。模型的具体设定,能够匹配不同的数据集、不同算法、不同的 ML 框架以及不同的超参数设置。具体请参见以下代码:


from sagemaker.amazon.amazon_estimator import get_image_uri
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}"
image_uri = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-1')
image_uri2 = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-2')
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_uri2,
 'ModelDataUrl': model_url2
})

创立 2 个生产变体,每个变体都对应特定的模型与资源需要(即实例类型与数量)。要在 2 个变体之间均匀散发推理申请,请将二者的 initial_weight 设置为 0.5,具体参见以下代码:

from sagemaker.session import production_variant
variant1 = production_variant(model_name=model_name,
 instance_type="ml.m5.xlarge",
 initial_instance_count=1,
 variant_name='Variant1',
 initial_weight=0.5)
variant2 = production_variant(model_name=model_name2,
 instance_type="ml.m5.xlarge",
 initial_instance_count=1,
 variant_name='Variant2',
 initial_weight=0.5)

应用以下代码,将这些生产变体部署在 Amazon SageMaker 端点上:

endpoint_name = f"DEMO-xgb-churn-pred-{datetime.now():%Y-%m-%d-%H-%M-%S}"
print(f"EndpointName={endpoint_name}")
sm_session.endpoint_from_production_variants(
 name=endpoint_name,
 production_variants=[variant1, variant2]
)

调用部署实现的模型

当初,咱们能够将数据发送至此端点并实时获取推理后果。在本文中,咱们应用 Amazon SageMaker 反对的两种办法进行模型测试:将流量散发至各变体,以及调用特定变体。

将流量散发至各变体

Amazon SageMaker 会依据用户在之前变体定义中配置的各项权重,在端点上的生产变体之间调配流量。具体参见以下端点调用代码:

# get a subset of test data for a quick test
!tail -120 test_data/test-dataset-input-cols.csv > test_data/test_sample_tail_input_cols.csv
print(f"Sending test traffic to the endpoint {endpoint_name}. nPlease wait...")
with open('test_data/test_sample_tail_input_cols.csv', 'r') as f:
 for row in f:
 print(".", end="", flush=True)
 payload = row.rstrip('n')
 sm_runtime.invoke_endpoint(EndpointName=endpoint_name,
 ContentType="text/csv",
 Body=payload)
 time.sleep(0.5)
print("Done!") 

Amazon SageMaker 会将各变体中的提早及调用等指标提交至 Amazon CloudWatch。对于端点指标的残缺列表,请参阅应用 Amazon CloudWatch 监控 Amazon SageMaker。大家能够查问 Amazon CloudWatch 以获取各变体的调用次数,理解默认状况下如何各变体接管到的调用量。咱们得出的后果应相似于下图:

调用特定变体

以下用例应用新的 Amazon SageMaker 变体性能以调用特定变体。在具体操作中,咱们只需应用新参数定义心愿调用的特定 ProductionVariant 即可。以下代码将在所有申请中调用 Variant1,大家也能够通过雷同的流程调用其余变体:

print(f"Sending test traffic to the endpoint {endpoint_name}. nPlease wait...")
with open('test_data/test_sample_tail_input_cols.csv', 'r') as f:
 for row in f:
 print(".", end="", flush=True)
 payload = row.rstrip('n')
 sm_runtime.invoke_endpoint(EndpointName=endpoint_name,
 ContentType="text/csv",
 Body=payload,
 TargetVariant="Variant1") # <- Note new parameter
 time.sleep(0.5)

要确认曾经 Variant1 解决了所有新调用,请查问 CloudWatch 以获取每个变体的调用次数。通过下图能够看到,Variant1 曾经实现了最近所有申请中的调用(最新工夫戳),且不存在指向 Variant2 的调用。

评估变体性能

下图评估了 Variant1 的准确率、精准率、召回率、F1 得分以及 ROC/AUC。

下图评估了 Variant2 中的雷同预测指标。

对于大多数已定义的指标,Variant2 的成果都更好,因而大家能够抉择它作为生产环境中的推理流量解决计划。

将推理流量导向所选定的生产变体

当初,咱们曾经确定了 Variant2 模型比 Variant1 成果更好,接下来就是将更多流量转移至 Variant2。

大家当然能够持续应用 TargetVariant 调用选定的变体。但更简略的解决办法,是应用 UpdateEndpointWeightsAndCapacities 对调配给各变体的权重进行更新。如此一来,无需批改端点即可更改指向各生产变体的流量调配。

大家应该还记得,之前创立模型与端点配置时,咱们在变体权重中将流量分配比例设定为 50/50。下图所示,为指向各变体总调用数量的 CloudWatch 指标,咱们能够由此看到各变体的调用模式。

要将 75% 的流量转移到 Variant2,请应用 UpdateEndpointWeightsAndCapacities 为各变体调配新的权重。具体参见以下代码:

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

Amazon SageMaker 当初会将 75% 的推理申请导向 Variant2,只为 Variant1 保留 25% 申请。

下图中的 CloudWatch 指标为各变体的总调用次数,能够看到 Variant2 的调用次数显著高于 Variant1。

咱们能够持续监控各项指标,并在某一变体的性能达到现实程度后将 100% 流量路由至该变体。在本用例中,咱们应用 UpdateEndpointWeightsAndCapacities 更新针对变体的流量调配。将 Variant1 的权重设定为 0.0,Variant2 的权重设置为 1.0。如此一来,Amazon SageMaker 将把所有推理申请 100% 发送至 Variant2,参见以下代码:

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

下图所示为针对各变体的总调用量 CloudWatch 指标,能够看到 Variant2 解决了所有推理申请,而 Variant1 没有解决任何推理申请。

当初,咱们能够平安地更新端点,并将 Variant1 从端点中删除。大家还能够向端点中增加新的变体,并参照本次演练中的各项步骤持续测试生产环境下的新模型。

总结

Amazon SageMaker 可帮忙用户在端点之上运行多个生产变体,从而轻松对生产环境中的 ML 模型进行 A / B 测试。大家能够应用 SageMaker 提供的性能配合不同训练数据集、超参数、算法以及 ML 框架测试由此训练出的模型,理解它们在不同实例类型上的执行性能,并将各项因素整合起来造成不同搭配。

咱们还能够在端点上的各变体之间进行流量调配,Amazon SageMaker 会依据指定的散发形式将推理流量拆分并散发至各个变体。另外,如果须要面向特定客户群体测试模型性能,则可通过 SageMaker 提供的 TargetVariant 标头指定负责解决特定推理申请的变体,相应申请将被自在路由至您所指定的变体处。

对于 A / B 测试的更多详细信息,请参阅 AWS 开发者指南:在生产环境中测试模型。

退出移动版