亚马逊AWS官方博客

Amazon SageMaker 无服务器推理 – 无需担心服务器配置的机器学习推理

2021 年 12 月,我们在 Amazon SageMaker 中推出了 Amazon SageMaker 无服务器推理(预览版),作为新的选项来部署机器学习 (ML) 模型进行推理,而无需配置或管理底层基础设施。今天,我很高兴地宣布,Amazon SageMaker 无服务器推理现已正式推出 (GA)。

不同的机器学习推理使用案例对模型托管基础设施提出了不同的要求。如果处理广告投放、欺诈侦测或个性化产品推荐等使用案例,则很可能需要响应时间短至几毫秒的 API 式在线推理。如果使用大型机器学习模型(例如在计算机视觉 (CV) 应用程序中),则可能需要经过优化的基础设施,以便在几分钟内针对较大的有效负载运行推理。如果要针对整个数据集或更大批次的数据运行预测,则可能需要按需运行一次性批量推理作业,而不是托管模型服务端点。如果您的应用程序具有间歇性流量模式,例如聊天机器人服务或用于处理表单或分析文档中数据的应用程序,该怎么办? 在这种情况下,可能需要在线推理选项,其能够根据推理请求量自动预置和扩展计算容量。在空闲期间,它应该能够完全关闭计算容量,这样就无需支付费用。

Amazon SageMaker 是我们的完全托管式机器学习服务,它提供了不同的模型推理选项来支持所有这些使用案例:

Amazon SageMaker 无服务器推理的更多详细信息
通过与机器学习从业人员的大量对话,我选择要求提供完全托管的机器学习推理选项,该选项可让您专注于开发推理代码,同时自动管理基础设施的所有事务。SageMaker 无服务器推理现在提供这种轻松部署的功能。

根据模型收到的推理请求量,SageMaker 无服务器推理会自动预置、扩展和关闭计算容量。因此,您只需为运行推理代码的计算时间和处理的数据量付费,而无需为空闲时间付费。

您可以使用 SageMaker 的内置算法和机器学习框架服务容器将模型部署到无服务器推理端点,或者选择引入自有的容器。如果流量变得可预测且保持稳定,您可以轻松地从无服务器推理端点更新到 SageMaker 实时端点,而无需更改容器镜像。使用无服务器推理,您还可受益于 SageMaker 提供的功能,包括内置指标,如调用计数、故障、延迟、主机指标和 Amazon CloudWatch 中的错误。

自预览版发布以来,SageMaker 无服务器推理增加了对 SageMaker Python SDK模型注册表的支持。SageMaker Python SDK 是一个开源库,用于在 SageMaker 上构建和部署机器学习模型。借助 SageMaker 模型注册表,您可以对模型进行编目、版本化和部署到生产环境。

作为正式推出的新功能,SageMaker 无服务器推理已将每个端点的最大并发调用次数上限从预览版期间的 50 次增加到 200 次,可让您将 Amazon SageMaker 无服务器推理用于高流量工作负载。Amazon SageMaker 无服务器推理现已在提供 Amazon SageMaker 的所有 AWS 区域推出,但 AWS GovCloud (美国) 和 AWS 中国区域除外。

一些客户已经开始享受 SageMaker 无服务器推理带来的好处:

Bazaarvoice 利用机器学习来审核用户生成的内容,从而以及时和值得信赖的方式为我们的客户提供无缝的购物体验。但是,在全球范围内的多元化客户群中开展运营需要各种各样的模型,其中许多模型要么不经常使用,要么由于内容的剧增而需要快速扩展。Amazon SageMaker 无服务器推理提供了两全其美的优势:它可以在内容剧增期间快速无缝地扩展,并降低不常用模型的成本。” — Bazaarvoice 首席研究工程师 Lou Kratz 博士

Transformer 变革了机器学习,而 Hugging Face 一直在推动其在各公司中的采用,首先是自然语言处理,现在则是音频和计算机视觉。全球机器学习团队的新前沿领域是以经济高效的方式部署功能强大的大型模型。我们测试了 Amazon SageMaker 无服务器推理,并且能够在抽象化基础设施的同时显著降低间歇性流量工作负载的成本。我们通过 SageMaker 无服务器推理让 Hugging Face 模型能够开箱即用,帮助客户进一步降低机器学习成本。” — Hugging Face 产品总监 Jeff Boudier

接下来了解如何开始使用 SageMaker 无服务器推理。

在此演示中,我构建了一个文本分类器来分类电子商务客户的评论,例如将“我喜欢这件产品!”分为正面 (1)、中性 (0) 和负面 (-1) 情绪。我使用 Women’s E-Commerce Clothing Reviews 数据集微调来自 Hugging Face Transformer 库和模型中心的 RoBERTa 模型。现在,我将向您展示如何将经过训练的模型部署到 Amazon SageMaker 无服务器推理端点。

将模型部署到 Amazon SageMaker 无服务器推理端点
您可以使用 SageMaker 控制台、AWS SDK、SageMaker Python SDK、AWS CLI 或 AWS CloudFormation 创建、更新、描述和删除无服务器推理端点。在第一个示例中,我将使用 SageMaker Python SDK,因为它通过抽象来简化模型部署工作流程。还可以使用 SageMaker Python SDK,通过根据请求传递有效负载来调用端点。稍后会介绍此流程。

首先,使用所需的无服务器配置创建端点配置。您可以指定内存大小和最大并发调用次数。SageMaker 无服务器推理会根据选择的内存量按比例自动分配计算资源。如果选择较大的内存,则容器有权访问更多的 vCPU。作为通用的经验法则,内存大小应至少与模型大小一样大。可以选择的内存大小为 1024 MB、2048 MB、3072 MB、4096 MB、5120 MB 和 6144 MB。对于我的 RoBERTa 模型,配置 5120 MB 的内存大小和最多 5 次并发调用。

import sagemaker
from sagemaker.serverless import ServerlessInferenceConfig

serverless_config = ServerlessInferenceConfig(
	memory_size_in_mb=5120,
	max_concurrency=5
)

现在开始部署模型。 您可以使用 estimator.deploy() 方法直接从 SageMaker 训练估计器部署模型,以及进行无服务器推理端点配置。在此示例中,我还提供了自定义推理代码。


endpoint_name="roberta-womens-clothing-serverless-1"

estimator.deploy(
	endpoint_name = endpoint_name,
	entry_point="inference.py",
	serverless_inference_config=serverless_config
)

当您使用适用于 Python 的 AWS SDK (Boto3) 时,SageMaker 无服务器推理还支持模型注册表。在这篇博文的后面,我将向您展示如何从模型注册表部署模型。

接下来检查无服务器推理端点设置和部署状态。转到 SageMaker 控制台并浏览至已部署的推理端点:

在 SageMaker 控制台中查看 Amazon SageMaker 无服务器端点配置

在 SageMaker 控制台中,还可以根据需要创建、更新或删除无服务器推理端点。在 Amazon SageMaker Studio 中,选择端点选项卡和您的无服务器推理端点以查看端点配置详细信息。

在 SageMaker Studio 中查看 Amazon SageMaker 无服务器端点配置

一旦端点状态显示为 InService,您就可以开始发送推理请求。

现在运行几个示例预测。经过微调的 RoBERTa 模型预计 JSON Lines 格式的推理请求以及要归类为输入特征的审核文本。JSON Lines 文本文件由几行组成,其中每行都是有效的 JSON 对象,由换行符分隔。这是存储一次处理一条记录的数据(例如在模型推理中)的理想格式。可以在 Amazon SageMaker 开发人员指南中详细了解用于推理的 JSON Lines 和其他常用数据格式。请注意,根据模型接受的推理请求格式,以下代码可能看起来有所不同。


from sagemaker.predictor import Predictor
from sagemaker.serializers import JSONLinesSerializer
from sagemaker.deserializers import JSONLinesDeserializer

sess = sagemaker.Session(sagemaker_client=sm)

inputs = [
    {"features": ["I love this product!"]},
    {"features": ["OK, but not great."]},
    {"features": ["This is not the right product."]},
]

predictor = Predictor(
    endpoint_name=endpoint_name,
    serializer=JSONLinesSerializer(),
    deserializer=JSONLinesDeserializer(),
    sagemaker_session=sess
)

predicted_classes = predictor.predict(inputs)

for predicted_class in predicted_classes:
    print("Predicted class {} with probability {}".format(predicted_class['predicted_label'], predicted_class['probability']))

结果将类似于如下,其中将示例评论分类为相应的情绪类别。


概率为 0.9495596289634705 的预测类别 1
概率为 0.5395089387893677 的预测类别 0
概率为 0.7887083292007446 的预测类别 -1

还可以将模型从模型注册表部署到 SageMaker 无服务器推理端点。目前仅通过适用于 Python 的 AWS SDK (Boto3) 支持此功能。接下来介绍另一个快速演示。

从 SageMaker 模型注册表中部署模型
要使用 Boto3 从模型注册表中部署模型,我们首先通过调用 create_model() 方法从模型版本创建一个模型对象。然后,我将模型版本的 Amazon Resource Name (ARN) 作为模型对象容器的一部分进行传递。

import boto3
import sagemaker

sm = boto3.client(service_name='sagemaker')
role = sagemaker.get_execution_role()
model_name="roberta-womens-clothing-serverless"

container_list = 
	[{'ModelPackageName': <MODEL_PACKAGE_ARN>}]

create_model_response = sm.create_model(
    ModelName = model_name,
    ExecutionRoleArn = role,
    Containers = container_list
)

接下来,创建无服务器推理端点。请记住,您可以使用 SageMaker 控制台、AWS SDK、SageMaker Python SDK、AWS CLI 或 AWS CloudFormation 创建、更新、描述和删除无服务器推理端点。为了保持一致,在第二个示例中继续使用 Boto3。

与第一个示例类似,首先使用所需的无服务器配置创建端点配置。为端点指定了 5120 MB 的内存大小和最多 5 次并发调用。

endpoint_config_name="roberta-womens-clothing-serverless-ep-config"

create_endpoint_config_response = sm.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ProductionVariants=[{
        'ServerlessConfig':{
            'MemorySizeInMB' : 5120,
            'MaxConcurrency' : 5
        },
        'ModelName':model_name,
        'VariantName':'AllTraffic'}])

接下来,我通过调用 create_endpoint() 方法来创建 SageMaker 无服务器推理端点。


endpoint_name="roberta-womens-clothing-serverless-2"

create_endpoint_response = sm.create_endpoint(
    EndpointName=endpoint_name,
    EndpointConfigName=endpoint_config_name)

一旦端点状态显示为 InService,您就可以开始发送推理请求。同样,为了保持一致性,我选择使用 Boto3 和 SageMaker 运行时客户端 invoke_endpoint() 方法运行示例预测。

sm_runtime = boto3.client("sagemaker-runtime")
response = sm_runtime.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType="application/jsonlines",
    Accept="application/jsonlines",
    Body=bytes('{"features": ["I love this product!"]}', 'utf-8')
)

print(response['Body'].read().decode('utf-8'))
{"probability": 0.966135561466217, "predicted_label": 1}

如何针对 SageMaker 无服务器推理优化模型
SageMaker 无服务器推理会自动扩展底层计算资源以处理请求。如果端点在一段时间内没有接收流量,则会缩减计算资源。如果端点突然收到新请求,您可能会注意到端点需要一些时间扩展计算资源以处理请求。

这种冷启动时间在很大程度上取决于模型大小和容器的启动时间。要优化冷启动时间,可以尝试最小化模型大小,例如,通过应用知识提炼量化模型修剪等技术。

知识提炼使用较大的模型(教师模型)来训练较小的模型(学生模型),以解决相同的任务。量化将表示模型参数的数字精度从 32 位浮点数降低到 16 位浮点数或 8 位整数。模型修剪可移除对训练过程贡献不大的冗余模型参数。

可用性和定价
Amazon SageMaker 无服务器推理现已在提供 Amazon SageMaker 的所有 AWS 区域推出,但 AWS GovCloud (美国) 和 AWS 中国区域除外。

使用 SageMaker 无服务器推理,您只需为用于处理推理请求的计算容量(按毫秒计费)和处理的数据量付费。计算容量费用还取决于选择的内存配置。有关详细的定价信息,请访问 SageMaker 定价页面

立即开始使用 Amazon SageMaker 无服务器推理
要了解有关 Amazon SageMaker 无服务器推理的更多信息,请访问 Amazon SageMaker 机器学习推理网页。以下是 SageMaker 无服务器推理示例笔记本,它们将帮助您立即开始使用。从 SageMaker 控制台尝试一下,让我们了解您的想法。

Antje