一般来说,开发进去的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_urimodel_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_variantvariant1 = 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.csvprint(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开发者指南:在生产环境中测试模型。