使用亚马逊SageMaker的最新功能,平均可以将模型部署成本降低50%

利用亚马逊SageMaker的最新功能,可将模型部署成本平均降低50%

随着组织将模型部署到生产环境中,他们不断寻求优化基础模型(FM)在最新加速器(例如AWS Inferentia和GPU)上运行的性能的方式,以便减少成本并减少响应延迟,为最终用户提供最佳体验。然而,一些FM没有充分利用实例上可用的加速器,导致硬件资源的低效利用。一些组织将多个FM部署到同一实例上,以更好地利用所有可用的加速器,但这需要复杂的基础架构编排,耗时且难以管理。当多个FM共享同一实例时,每个FM都有自己的扩展需求和使用模式,这使得难以预测何时需要添加或删除实例。例如,一个模型可能用于支持用户应用程序,在某些小时内使用量可能会激增,而另一个模型可能具有更一致的使用模式。除了优化成本,客户还希望通过减少延迟来提供最佳的最终用户体验。为了实现这一目标,他们经常部署多个相同的FM来并行处理用户请求。由于FM的输出可能从一个句子到多个段落不等,如果请求在实例之间随机路由,完成推理请求所需的时间会有显着差异,从而导致延迟的不可预测性。Amazon SageMaker现在支持新的推理能力,帮助您降低部署成本和延迟。

现在您可以创建基于组件的推理端点,并将机器学习(ML)模型部署到SageMaker端点。推理组件(IC)抽象了您的ML模型,并使您能够为每个模型分配CPU、GPU或AWS Neuron加速器以及缩放策略。推理组件提供以下优点:

  • SageMaker将优化地将模型放置和打包到ML实例上,以最大程度地利用资源,实现节省成本。
  • SageMaker将根据您的配置对每个模型进行缩放,以满足您的ML应用程序需求。
  • SageMaker将动态地添加和删除实例,以确保容量可用,并使空闲计算尽量少。
  • 您可以将模型的副本数缩减到零,为其他模型释放资源。您还可以指定保持重要模型始终加载并准备提供流量。

借助这些功能,您可以平均降低50%的模型部署成本。实际的成本节省将因工作负载和流量模式而异。让我们以一个简单的示例来说明如何在单个端点上打包多个模型可以最大程度地利用和节省成本。假设您有一个聊天应用程序,帮助游客了解当地的风俗和最佳实践,该应用程序使用了两个Llama 2的变体:一个针对欧洲游客进行了优化,另一个针对美国游客进行了优化。我们预计欧洲模型的流量在UTC 00:01-11:59之间,美国模型的流量在UTC 12:00-23:59之间。与将这些模型部署在自己的专用实例上,而这些实例将空闲一半时间的情况不同,您现在可以将它们部署在一个单一的端点上以节省成本。您可以将美国模型的规模缩小到零,当无需该模型时,以释放容量供欧洲模型使用,反之亦然。这样您可以高效利用硬件资源,避免浪费。这只是一个使用两个模型的简单示例,但是您可以轻松将这个想法扩展到将数百个模型打包到一个随着工作负载自动缩放的单个端点上。

在本文中,我们将向您展示基于IC的SageMaker端点的新功能。我们还将介绍使用推理组件和API部署多个模型的步骤。最后,我们详细介绍了一些新的可观察性功能,以及如何为您的模型设置自动缩放策略和管理端点的实例缩放。您还可以通过我们的新的简化、交互式用户体验来部署模型。我们还支持高级路由功能,以优化推理工作负载的延迟和性能。

构建模块

让我们更深入地了解并了解这些新功能的工作原理。以下是SageMaker托管中的一些新术语:

  • 推理组件 – 一个SageMaker托管对象,您可以使用它将模型部署到端点上。您可以通过提供以下内容来创建推理组件:
    • SageMaker模型或SageMaker兼容镜像和模型工件的规范。
    • 计算资源需求,包括每个模型副本的CPU核心数、主机内存和加速器数量。
  • 模型副本 – 推理组件的运行时副本,能够提供请求。
  • 托管实例自动缩放 – SageMaker托管能力,用于根据推理组件的缩放而增加或减少用于端点的计算实例的数量。

要创建一个新的推理组件,您可以指定一个容器镜像和一个模型工件,或者您可以使用您已经创建的SageMaker模型。您还需要指定计算资源需求,如主机CPU核心数、主机内存或模型运行所需的加速器数量。

当您部署一个推理组件时,您可以指定MinCopies以确保模型已经加载到您所需的数量,准备好服务请求。

您还可以选择设置策略,使推理组件副本的规模缩小到零。例如,如果对IC没有运行负载,模型副本将被卸载。这可以释放资源,可以由活动工作负载替换,以优化端点的利用率和效率。

推理请求的增加或减少时,您的ICs的副本数量也可以根据自动缩放策略进行缩放。SageMaker将处理放置,以优化模型的可用性和成本。

此外,如果您启用了托管的实例自动扩展,SageMaker将根据需要在给定时间内加载需要的推理组件的计算实例。SageMaker将扩展实例并对实例和推理组件进行打包,以优化成本同时保持模型性能。虽然我们推荐使用托管实例扩展,但您也可以选择自己管理缩放,如果您选择通过应用程序自动扩展。

SageMaker将重新平衡推理组件并缩小实例(如果推理组件不再需要),从而节省您的成本。

API的演练

SageMaker引入了一个名为InferenceComponent的新实体。这使得托管ML模型的细节与端点本身分离。 InferenceComponent允许您指定托管模型的关键属性,如您要使用的SageMaker模型或容器详细信息和模型工件。您还可以指定要部署的组件本身的副本数,以及所需的加速器(GPU、Inf或Trn加速器)或CPU(vCPU)数量。这为您在未来计划部署到单个端点的任意数量的模型提供了更大的灵活性。

让我们看一下创建带有推理组件的终端的Boto3 API调用。请注意,在本帖子中,我们将解决一些参数。

以下是CreateEndpointConfig的示例代码:

sagemaker_client.create_endpoint_config( EndpointConfigName=endpoint_config_name, ExecutionRoleArn=role, ProductionVariants=[{ "VariantName": variant_name, "InstanceType": instance_type, "InitialInstanceCount": initial_instance_count, "ModelDataDownloadTimeoutInSeconds": model_data_download_timeout_in_seconds, "ContainerStartupHealthCheckTimeoutInSeconds": container_startup_health_check_timeout_in_seconds, {"ManagedInstanceScaling": { "Status": "ENABLED", "MinInstanceCount": initial_instance_count, "MaxInstanceCount": max_instance_count, } }, }],)

以下是CreateEndpoint的示例代码:

sagemaker_client.create_endpoint(    EndpointName=endpoint_name,    EndpointConfigName=endpoint_config_name,)

以下是CreateInferenceComponent的示例代码:

sm_client.create_inference_component(    InferenceComponentName=inference_component_name,    EndpointName=endpoint_name,    VariantName=variant_name,    Specification={        "Container": {            "Image": inference_image_uri,            "ArtifactUrl": s3_code_artifact,        },        "StartupParameters": {            "ModelDataDownloadTimeoutInSeconds": 300,            "ContainerStartupHealthCheckTimeoutInSeconds": 600,        },        "ComputeResourceRequirements": {"NumberOfAcceleratorDevicesRequired": 1, "MinMemoryRequiredInMb": 1024}    },    RuntimeConfig={"CopyCount": 1},)

InferenceComponent与端点解耦提供了更多的灵活性。您可以在同一基础设施上托管多个模型,并根据需求进行添加或删除。每个模型可以独立进行更新。此外,您可以根据业务需求进行模型的扩展。而且,InferenceComponent还允许您控制每个模型的容量。换句话说,您可以确定要托管多少个每个模型的副本。这种可预测的扩展性可以帮助您满足每个模型的特定延迟要求。总体而言,InferenceComponent让您对托管模型具有更多控制权。

在以下表格中,我们展示了创建和调用不使用InferenceComponent和使用InferenceComponent的高级方法的对比。请注意,现在对于基于IC的端点,CreateModel()是可选的。

步骤 基于模型的端点 基于推断组件的端点
1 CreateModel(…) CreateEndpointConfig(…)
2 CreateEndpointConfig(…) CreateEndpoint(…)
3 CreateEndpoint(…) CreateInferenceComponent(…)
4 InvokeEndpoint(…) InvokeEndpoint(InferneceComponentName=‘value’…)

InferenceComponent的引入使您能够在模型级别进行扩展。有关InferenceComponent与自动扩展的更多详细信息,请参见深入了解实例和IC自动扩展

在调用SageMaker端点时,您现在可以指定新的参数InferenceComponentName以命中所需的InferenceComponentName。SageMaker会处理将请求路由到托管所请求的InferenceComponentName的实例。请参见以下代码:

smr_client = boto3.client("sagemaker-runtime") response_model = smr_client.invoke_endpoint(     InferenceComponentName=inference_component_name,    EndpointName=endpoint_name,     Body=payload,     ContentType="application/json", )

默认情况下,SageMaker对支持端点的实例的请求使用随机路由。如果您想启用最少未完成请求路由,您可以在端点配置的RoutingConfig中设置路由策略:

sm_client.create_endpoint_config(    EndpointConfigName=endpoint_config_name,    ExecutionRoleArn=role,    ProductionVariants=[{        "VariantName": variant_name,        "InstanceType": instance_type,        "InitialInstanceCount": initial_instance_count,        ...        'RoutingConfig': {                'RoutingStrategy': 'LEAST_OUTSTANDING_REQUESTS'            }    }],)

最不突出的请求路由轨迹到具有更多处理请求能力的特定实例。这将提供更统一的负载均衡和资源利用率。

除了CreateInferenceComponent,现在还提供了以下API:

  • DescribeInferenceComponent
  • DeleteInferenceComponent
  • UpdateInferenceComponent
  • ListInferenceComponents

InferenceComponent日志和指标

InferenceComponent日志位于/aws/sagemaker/InferenceComponents/<InferenceComponentName>。容器中发送到stderr和stdout的所有日志都会发送到Amazon CloudWatch中的这些日志中。

通过引入基于IC的终端节点,您现在可以查看附加实例度量、推断组件度量和调用度量。

对于SageMaker实例,您现在可以跟踪GPUReservationCPUReservation指标,以查看基于您部署的推断组件为终端节点保留的资源。这些指标可以帮助您确定终端节点和自动缩放策略的大小。您还可以查看与部署到终端节点的所有模型相关的总体指标。

SageMaker还在推断组件级别上公开指标,这可以显示您部署的推断组件的资源利用情况的更细粒度视图。这使您可以查看已部署的每个推断组件的聚合资源利用情况,例如GPUUtilizationNormalizedGPUMemoryUtilizationNormalized,它可能有零个或多个副本。

最后,SageMaker提供调用度量,现在对推断组件进行聚合追踪调用(Invocations)或每个实例化的副本进行追踪调用(InvocationsPerCopy

有关全面的指标列表,请参阅SageMaker终端节点调用指标

模型级自动缩放

要实现我们描述的自动缩放行为,当创建SageMaker终端节点配置和推断组件时,需要分别定义初始实例计数和初始模型副本计数。在创建终端节点和对应的IC后,要在IC级别应用自动缩放,需要首先注册缩放目标,然后将缩放策略与IC关联。

在实施缩放策略时,我们使用SageMakerInferenceComponentInvocationsPerCopy,这是SageMaker引入的新指标。它捕获每分钟每个模型副本的平均调用次数。

aas_client.put_scaling_policy(    PolicyName=endpoint_name,    PolicyType='TargetTrackingScaling',    ServiceNamespace=service_namespace,    ResourceId=resource_id,    ScalableDimension=scalable_dimension,    TargetTrackingScalingPolicyConfiguration={        "PredefinedMetricSpecification": {            "PredefinedMetricType": "SageMakerInferenceComponentInvocationsPerCopy",        },        "TargetValue": autoscaling_target_value,        "ScaleInCooldown": 300,  # default        "ScaleOutCooldown": 300,  # default    },)

在设置缩放策略后,SageMaker为每个自动缩放目标创建两个CloudWatch警报:一个在3分钟内触发扩展如果处于报警状态(三个1分钟数据点),一个在15分钟内触发缩小时(15个1分钟数据点),如下图所示。触发缩放动作的时间通常比这些分钟长1-2分钟,因为终端节点需要时间将指标发布到CloudWatch,AutoScaling也需要时间来响应。冷却时间是完成缩小时或扩展活动后的时间量(以秒为单位),在另一个扩展活动开始之前无法启动另一个扩展活动。如果扩展冷却时间短于终端节点更新时间,则不起作用,因为在终端节点处于“更新”状态时无法更新SageMaker终端节点。

请注意,当设置IC级自动扩展时,确保MaxInstanceCount参数等于或小于此端点可以处理的IC的最大数量。例如,如果您的端点仅配置为在端点配置中有一个实例,并且此实例最多只能托管四个模型副本,则MaxInstanceCount应等于或小于4。但是,您还可以使用SageMaker提供的托管自动扩展功能,根据所需的模型副本数自动调整实例计数,以满足更多计算资源的需求。以下代码片段演示了在创建端点配置期间如何设置托管实例扩展。这样,当IC级自动扩展需要更多的实例数来托管模型副本时,SageMaker将自动扩展实例数,以使IC级扩展成功。

sagemaker_client.create_endpoint_config(    EndpointConfigName=endpoint_config_name,    ExecutionRoleArn=role,    ProductionVariants=[{        "VariantName": variant_name,        "InstanceType": instance_type,        "InitialInstanceCount": initial_instance_count,        "ModelDataDownloadTimeoutInSeconds": model_data_download_timeout_in_seconds,        "ContainerStartupHealthCheckTimeoutInSeconds": container_startup_health_check_timeout_in_seconds,        {"ManagedInstanceScaling": {            "Status": "ENABLED",            "MinInstanceCount": initial_instance_count,            "MaxInstanceCount": max_instance_count,            }        },    }],)

您可以对同一端点应用多个自动缩放策略,这意味着您将能够对使用IC创建的端点应用传统的自动缩放策略,并根据其他端点指标进行缩放。更多信息请参考使用Amazon SageMaker上的自动缩放优化您的机器学习部署。然而,虽然这是可行的,但我们仍建议使用托管实例扩展而不是自己管理扩展。

结论

在本文中,我们介绍了SageMaker推断中的一项新功能,它将帮助您最大限度地利用计算实例,扩展到数百模型,并优化成本,同时提供可预测的性能。此外,我们提供了API的演练,并向您展示了如何配置和部署适用于您的工作负载的推断组件。

我们还支持高级路由功能,以优化推断工作负载的延迟和性能。SageMaker可以帮助您优化推断工作负载的成本和性能,并为管理提供模型级别的粒度。我们在GitHub上创建了一组笔记本,将向您展示如何使用不同的容器部署三个不同的模型,并应用自动缩放策略。我们鼓励您从笔记本1开始,并立即开始使用新的SageMaker托管功能!