部署多模型实时推理端点
概述
在本入门教程中,您将学习如何使用 Amazon SageMaker Notebook 实例将多个训练过的机器学习模型部署到单个实时推理的多模型端点。
SageMaker Studio 是一个集成的机器学习 (ML) 开发环境 (IDE),提供全托管的 Jupyter Notebook 界面,您可以在其中执行端到端的 ML 生命周期任务,包括模型部署。
SageMaker 提供不同的推理选项来支持广泛的用例:
- SageMaker Real-Time Inference(实时推理)适用于有毫秒级低延迟要求的工作负载。
- SageMaker Serverless Inference(无服务器推理)适用于具有间歇性或不频繁的流量模式的工作负载。
- SageMaker Asynchronous Inference(异步推理)适用于具有负载量大或需要长时间处理的推理。
- SageMaker Batch Transform(批量转换)适用于对成批数据运行预测。
在本教程中,您将使用 SageMaker 实时推理选项部署一组已经在合成房价预测数据集上训练过的二元分类 XGBoost 模型。该数据集包含基于卧室数量、平方英尺和浴室数量等特征的房价详情。这些模型分别预测单个位置的房价。您将扮演机器学习工程师的角色,部署这些模型并运行示例推理。
要完成的目标
在本指南中,您将:
- 从各个已训练模型生成多个 SageMaker 模型构件
- 配置并部署一个实时端点来 serve(提供)这些模型
- 调用多模型端点,使用测试数据运行示例预测
前期准备
开始本指南之前,您需要先满足以下条件:
- AWS 账户:如果您还没有 AWS 账户,请遵循设置 AWS 环境入门指南中的说明获取快速概览。
AWS 使用经验
中级
完成时间
15 分钟
所需费用
请参考 SageMaker 定价来估算本教程所需成本。
前提条件
使用的服务
Amazon SageMaker 实时推理
Amazon SageMaker Notebook
上次更新时间
2022 年 3 月 7 日
操作步骤
步骤 1:设置 Amazon SageMaker Studio 域
使用 Amazon SageMaker,您可以通过控制台进行可视化部署,也可以使用 SageMaker Studio 或 SageMaker Notebook 进行编程部署。在本教程中,您将使用 SageMaker Studio Notebook 以编程方式部署模型,这需要一个 SageMaker Studio 域。
AWS 账户在每个 AWS 区域中可拥有多个 Studio 域。如果您已经拥有一个美国东部(弗吉尼亚州北部)区域的 SageMaker Studio 域,请按照 SageMaker Studio 设置指南将所需的 AWS IAM 策略附加到您的 SageMaker Studio 账户,然后跳过步骤 1,直接执行步骤 2。
如果没有现有的 SageMaker Studio 域,请继续执行步骤 1,运行 AWS CloudFormation 模板,创建 SageMaker Studio 域并添加本教程后续步骤所需的权限。
1.1 - 选择 AWS CloudFormation 堆栈链接。您将通过此链接打开 AWS CloudFormation 控制台,并创建 SageMaker Studio 域和名为 studio-user 的用户。您还将为您的 SageMaker Studio 账户添加所需的权限。在 CloudFormation 控制台中,确认右上角显示的 Region(区域)是 US East (N. Virginia)(美国东部(弗吉尼亚州北部))。堆栈名称应为 CFN-SM-IM-Lambda-Catalog,不应更改。系统需要 10 分钟左右来创建此堆栈的所有资源。
1.2 - 此堆栈假定您已在账户中设置了公共 VPC。如果没有公共 VPC,请参阅使用单个公有子网的 VPC 了解如何创建公共 VPC。
1.3 - 勾选 I acknowledge that AWS CloudFormation might create IAM resources(我了解 AWS CloudFormation 可能会创建 IAM 资源),然后点击 Create stack(创建堆栈)。
1.4 - 在 CloudFormation 窗格中,选择 Stacks(堆栈)。创建堆栈约需要 10 分钟。堆栈创建完成后,堆栈的状态应从 CREATE_IN_PROGRESS 变为 CREATE_COMPLETE。
步骤 2:设置 SageMaker Studio Notebook
在这一步中,您将启动一个新的 SageMaker Studio Notebook 实例,安装必要的开源库,并配置 SageMaker 变量,以从 Amazon S3 获取训练模型的构件。但由于模型构件不能直接用于推理,您需要首先从模型构件创建 SageMaker 模型。创建的模型将包含训练和推理代码,SageMaker 将使用这些代码来部署模型。
2.1 – 在控制台搜索栏中输入 SageMaker Studio,然后选择 SageMaker Studio。
2.2 – 从 SageMaker 控制台右上角的区域下拉菜单中选择 US East (N. Virginia)(美国东部(弗吉尼亚州北部))。从左侧导航窗格中选择 Studio,使用 studio-user 配置文件打开 SageMaker Studio。
2.3 – 打开 SageMaker Studio 用户界面。在导航栏中,依次点击 File(文件)> New(新建)> Notebook。
2.4 – 在 Set up notebook environment(设置 Notebook 环境)对话框中,在 Image(镜像)下选择 Data Science。自动选择的内核是 Python 3。点击 Select(选择)。
2.5 – 此时 Notebook 右上角的内核应当显示 Python 3 (Data Science)。
2.6 - 将以下代码片段复制并粘贴到 Notebook 的一个单元格中,按 Shift+Enter 运行当前单元格以更新 aiobotocore 库,该库是与许多 AWS 服务进行交互的 API。请忽略任何重启内核的警告和依赖冲突错误。
%pip install --upgrade -q aiobotocore
2.7 - 您还需要实例化 S3 客户端对象,并给出默认 S3 存储桶中模型构件上传的位置。为此,请将以下代码复制并粘贴到 Notebook 中的一个单元格中并运行它。模型构件存储在名为 sagemaker-sample-mme-files 的公共 S3 存储桶中。在第 29 行中,该存储桶已指定为读取存储桶。存储桶内的位置通过模型前缀指定。
import boto3
import sagemaker
import time
from sagemaker.image_uris import retrieve
from time import gmtime, strftime
from sagemaker.amazon.amazon_estimator import image_uris
sagemaker_session = sagemaker.Session()
default_bucket = sagemaker_session.default_bucket()
write_prefix = "housing-prices-prediction-mme-demo"
region = sagemaker_session.boto_region_name
s3_client = boto3.client("s3", region_name=region)
sm_client = boto3.client("sagemaker", region_name=region)
sm_runtime_client = boto3.client("sagemaker-runtime")
role = sagemaker.get_execution_role()
# S3 locations used for parameterizing the notebook run
read_bucket = "sagemaker-sample-files"
read_prefix = "models/house_price_prediction"
model_prefix = "models/xgb-hpp"
# S3 location of trained model artifact
model_artifacts = f"s3://{default_bucket}/{model_prefix}/"
# Location
location = ['Chicago_IL', 'Houston_TX', 'NewYork_NY', 'LosAngeles_CA']
test_data = [1997, 2527, 6, 2.5, 0.57, 1]
2.8 - 您需要将模型构件从公共 S3 存储桶复制到会话创建的 S3 存储桶中。在第 17 行代码中,该存储桶已指定为默认存储桶。为此,请将以下代码复制并粘贴到 Notebook 中的一个单元格中并运行它。
for i in range (0,4):
copy_source = {'Bucket': read_bucket, 'Key': f"{read_prefix}/{location[i]}.tar.gz"}
bucket = s3.Bucket(default_bucket)
bucket.copy(copy_source, f"{model_prefix}/{location[i]}.tar.gz")
步骤 3:创建实时推理端点
在 SageMaker 中,您可以使用以下方式之一将训练好的模型部署到实时推理端点:SageMaker SDK,AWS SDK - Boto3,或 SageMaker 控制台。有关更多信息,请参阅 Amazon SageMaker 开发人员指南中的部署推理模型部分。SageMaker SDK 比 AWS SDK - Boto3 抽象程度更高,后者提供了更底层的 API,能够更好地控制模型部署。在本教程中,您将使用 AWS SDK - Boto3 部署模型。要部署模型,您需要按照以下三个步骤进行操作:
- 从模型构件创建一个 SageMaker 模型
- 创建一个端点配置以指定实例类型和数量等属性
- 使用端点配置创建端点
3.1 - 要使用存储在 Amazon S3 中的训练模型构件创建一个 SageMaker 模型,请复制并粘贴以下代码。create_model 方法接受的参数有:包含训练图像的 Docker 容器(对于此模型,使用 XGBoost 容器)、模型构件的 Amazon S3 位置和执行角色。请注意,在下面的代码中,primary_container 的参数 Mode 设为 MultiModel。
# Retrieve the SageMaker managed XGBoost image
training_image = retrieve(framework="xgboost", region=region, version="1.3-1")
# Specify an unique model name that does not exist
model_name = "housing-prices-prediction-mme-xgb"
primary_container = {
"Image": training_image,
"ModelDataUrl": model_artifacts,
"Mode": "MultiModel"
}
model_matches = sm_client.list_models(NameContains=model_name)["Models"]
if not model_matches:
model = sm_client.create_model(ModelName=model_name,
PrimaryContainer=primary_container,
ExecutionRoleArn=role)
else:
print(f"Model with name {model_name} already exists! Change model name to create new")
3.2 - 您可以在 SageMaker 控制台的 Models 部分检查创建的模型。
3.3 - 创建 SageMaker 模型后,复制并粘贴以下代码,使用 Boto3 的 create_endpoint_config 方法配置端点。create_endpoint_config 方法的主要输入包括端点配置名称和 variant(变体)信息,例如推理实例类型和数量,要部署的模型的名称,以及端点应处理的流量份额。
# Endpoint Config name
endpoint_config_name = f"{model_name}-endpoint-config"
# Create endpoint if one with the same name does not exist
endpoint_config_matches = sm_client.list_endpoint_configs(NameContains=endpoint_config_name)["EndpointConfigs"]
if not endpoint_config_matches:
endpoint_config_response = sm_client.create_endpoint_config(
EndpointConfigName=endpoint_config_name,
ProductionVariants=[
{
"InstanceType": "ml.m5.xlarge",
"InitialInstanceCount": 1,
"InitialVariantWeight": 1,
"ModelName": model_name,
"VariantName": "AllTraffic",
}
],
)
else:
print(f"Endpoint config with name {endpoint_config_name} already exists! Change endpoint config name to create new")
3.4 - 您可以在 SageMaker 控制台的 Endpoint configurations (端点配置)部分检查创建的端点配置。
3.5 - 复制并粘贴以下代码即可创建端点。create_endpoint 方法接受端点配置作为参数,并将端点配置中指定的模型部署到计算实例上。部署模型约需要 6 分钟。
# Endpoint name
endpoint_name = f"{model_name}-endpoint"
endpoint_matches = sm_client.list_endpoints(NameContains=endpoint_name)["Endpoints"]
if not endpoint_matches:
endpoint_response = sm_client.create_endpoint(
EndpointName=endpoint_name,
EndpointConfigName=endpoint_config_name
)
else:
print(f"Endpoint with name {endpoint_name} already exists! Change endpoint name to create new")
resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp["EndpointStatus"]
while status == "Creating":
print(f"Endpoint Status: {status}...")
time.sleep(60)
resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp["EndpointStatus"]
print(f"Endpoint Status: {status}")
3.6 - 要检查端点的状态,请在 SageMaker 控制台的左侧导航菜单中选择 Endpoints(端点)。Status(状态)栏显示端点的状态。
步骤 4:调用推理端点
在端点状态变为 InService 之后,您可以使用 REST API、AWS SDK - Boto3、SageMaker Studio、AWS CLI 或 SageMaker Python SDK 来调用端点。在本教程中,您调用端点的方式是发送来自测试数据集的样本。复制并粘贴以下代码,即可调用端点并获取预测结果。
# converting the elements in test data to string
payload = ' '.join([str(elem) for elem in test_data])
for i in range (0,4):
predicted_value = sm_runtime_client.invoke_endpoint(EndpointName=endpoint_name, TargetModel=f"{location[i]}.tar.gz", ContentType="text/csv", Body=payload)
print(f"Predicted Value for {location[i]} target model:\n ${predicted_value['Body'].read().decode('utf-8')}")
4.1 - 执行完成后,该单元格将返回部署在端点上的四个模型对测试样本的模型预测结果。
4.2 - 要使用 Amazon CloudWatch 监控端点调用指标,请打开 SageMaker 控制台。在 Inference(推理)下,选择 Endpoints 中的 housing-prices-prediction-mme-xgb-endpoint。
4.3 - 在 Endpoint details(端点详细信息)页面上,在 Monitor(监控)下,选择 View invocation metrics(查看调用指标)。在指标图表中,您一开始可能只能看到一个点。但在多次调用后,您将看到折线图,它类似示例屏幕截图中所示。
4.4 - Metrics(指标)页面显示多个端点性能指标。您可以选择可视化不同时间段的端点性能,例如 1 小时或 3 小时。选择任一指标,即可查看其在所选时间段内的趋势。
步骤 5:清除资源
对于您不再使用的资源,最佳做法是及时删除,以避免产生意外费用。
5.1 - 在 Notebook 中运行以下代码段,即可删除您在本教程中创建的模型、端点配置和端点。如果不删除端点,您的账户将继续为在端点上运行的计算实例累积费用。
# Delete model
sm_client.delete_model(ModelName=model_name)
# Delete endpoint configuration
sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)
# Delete endpoint
sm_client.delete_endpoint(EndpointName=endpoint_name)
5.2 - 要删除 S3 存储桶:
- 打开 Amazon S3 控制台。在导航栏中选择 Buckets(存储桶),选择 sagemaker-<您的区域>-<您的账户 ID>,然后勾选 ousing-prices-prediction-demo 旁边的复选框 models/xgb-hpp。接着点击 Delete(删除)。
- 在 Delete objects(删除对象)对话框中,确认您选择的删除对象正确无误,并在 Permanently delete objects(永久删除对象)确认框中输入 permanently delete(永久删除)。
- 完成上述操作并清空存储桶后,您可以再次按照相同的步骤删除 sagemaker-<您的区域>-<您的账户 ID> 存储桶。
5.3 – 若您不停止内核或执行下列步骤删除应用程序,那么本教程中用于运行 Notebook 镜像的 Data Science 内核将持续产生费用。更多信息请参阅 Amazon SageMaker 开发人员指南中的关闭资源。
执行下列步骤可删除 SageMaker Studio 应用程序:在 SageMaker Studio 控制台上,选择 studio-user,然后选择 Delete app(删除应用程序),从而删除列在 Apps 下的所有应用程序。请耐心等待,直到 Status(状态)变为 Deleted(已删除)为止。
如果在步骤 1 中使用了现有的 SageMaker Studio 域,则可以跳过步骤 5 的其余部分,直接进入结果。
如果您在步骤 1 运行 CloudFormation 模板创建了一个新的 SageMaker Studio 域,请继续执行以下步骤来删除域、用户和 CloudFormation 模板创建的资源
5.4 - 打开 CloudFormation 控制台。在 CloudFormation 窗格中,选择 Stacks(堆栈)。从状态下拉菜单中,选择 Active(运行中)。在 Stack name(堆栈名)下,选择 CFN-SM-IM-Lambda-catalog 以打开堆栈详情页面。
5.5 – 在 CFN-SM-IM-Lambda-catalog 堆栈详情页面上,点击 Delete 删除此堆栈和它在步骤 1 中创建的资源。
结果
恭喜您!您已完成“部署多模型实时推理端点”教程。
在本教程中,您将多个 SageMaker 模型部署到了实时推理端点。您使用了 AWS SDK - Boto3 API 来调用端点,并通过运行示例推理测试了其功能。
可以通过下面的后续步骤部分继续您的 SageMaker 机器学习之旅。