使用 Amazon SageMaker 对数千个 ML 模型进行规模训练和推理 | 亚马逊网络服务

使用 Amazon SageMaker 对数千个 ML 模型进行规模训练和推理 | 亚马逊网络服务

随着机器学习 (ML) 在各个行业中变得越来越普遍,组织发现需要训练和服务大量 ML 模型,以满足客户的多样化需求。 特别是对于软件即服务 (SaaS) 提供商来说,高效且经济高效地训练和服务数千个模型的能力对于在快速发展的市场中保持竞争力至关重要。

训练和服务数千个模型需要强大且可扩展的基础设施,这就是 亚马逊SageMaker 可以帮助。 SageMaker 是一个完全托管的平台,使开发人员和数据科学家能够快速构建、训练和部署 ML 模型,同时还提供使用 AWS 云基础设施带来的成本节约优势。

在这篇文章中,我们将探讨如何使用 SageMaker 功能,包括 Amazon SageMaker处理、SageMaker 训练作业和 SageMaker 多模型端点 (MME),以经济高效的方式训练和服务数千个模型。 要开始使用所描述的解决方案,您可以参考随附的笔记本 GitHub上.

使用案例:能源预测

在这篇文章中,我们假设一家 ISV 公司的角色,通过跟踪客户的能源消耗并提供预测来帮助他们的客户变得更加可持续。 我们公司有 1,000 名客户希望更好地了解他们的能源使用情况,并就如何减少对环境的影响做出明智的决策。 为此,我们使用合成数据集并基于以下数据训练 ML 模型 先知 为每个客户做出能源消耗预测。 借助 SageMaker,我们可以高效地训练和服务这 1,000 个模型,为我们的客户提供有关其能源使用情况的准确且可操作的见解。

生成的数据集中包含三个特征:

  • 顾客ID – 这是每个客户的整数标识符,范围从 0 到 999。
  • 时间戳 – 这是一个日期/时间值,指示测量能耗的时间。 时间戳是在代码中指定的开始日期和结束日期之间随机生成的。
  • 消费 – 这是一个浮点值,表示以任意单位测量的能耗。 消耗值在 0-1,000 之间随机生成,具有正弦季节性。

解决方案概述

为了有效地训练和服务数千个 ML 模型,我们可以使用以下 SageMaker 功能:

  • SageMaker处理 – SageMaker Processing 是一项完全托管的数据准备服务,使您能够对输入数据执行数据处理和模型评估任务。 您可以使用 SageMaker Processing 将原始数据转换为训练和推理所需的格式,以及对模型进行批量和在线评估。
  • SageMaker 培训工作 – 您可以使用 SageMaker 训练作业根据各种算法和输入数据类型训练模型,并指定训练所需的计算资源。
  • SageMaker MME – 多模型端点使您能够在单个端点上托管多个模型,这使得使用单个 API 可以轻松地从多个模型提供预测。 SageMaker MME 可以通过减少从多个模型提供预测所需的端点数量来节省时间和资源。 MME 支持托管 CPU 和 GPU 支持的模型。 请注意,在我们的场景中,我们使用 1,000 个模型,但这并不是服务本身的限制。

下图说明了解决方案体系结构。

显示所描述流程的架构

工作流程包括以下步骤:

  1. 我们使用 SageMaker 处理来预处理数据并为每个客户创建一个 CSV 文件并将其存储在 亚马逊简单存储服务 (亚马逊S3)。
  2. SageMaker 训练作业配置为读取 SageMaker 处理作业的输出,并将其以循环方式分发到训练实例。 请注意,这也可以通过以下方式实现 Amazon SageMaker管道.
  3. 模型工件由训练作业存储在 Amazon S3 中,并直接由 SageMaker MME 提供。

将训练规模扩展到数千个模型

通过以下方式可以扩展数千个模型的训练 distribution 的参数 训练输入 SageMaker Python SDK 中的类,允许您指定如何在训练作业的多个训练实例之间分配数据。 有以下三个选项: distribution 参数: FullyReplicated, ShardedByS3KeyShardedByRecord。 该 ShardedByS3Key 选项意味着训练数据按 S3 对象键进行分片,每个训练实例接收唯一的数据子集,从而避免重复。 SageMaker 将数据复制到训练容器后,我们可以读取文件夹和文件结构来训练每个客户文件的唯一模型。 以下是示例代码片段:

# Assume that the training data is in an S3 bucket already, pass the parent folder
s3_input_train = sagemaker.inputs.TrainingInput( s3_data='s3://my-bucket/customer_data', distribution='ShardedByS3Key'
) # Create a SageMaker estimator and set the training input
estimator = sagemaker.estimator.Estimator(...)
estimator.fit(inputs=s3_input_train)

每个 SageMaker 训练作业都将模型保存在 /opt/ml/model 训练容器的文件夹,然后将其存档到 model.tar.gz 文件,然后在训练作业完成后将其上传到 Amazon S3。 高级用户还可以使用 SageMaker Pipelines 自动执行此过程。 通过同一训练作业存储多个模型时,SageMaker 会创建一个模型 model.tar.gz 包含所有经过训练的模型的文件。 这意味着,为了提供模型服务,我们需要首先解压存档。 为了避免这种情况,我们使用 检查站 保存各个模型的状态。 SageMaker 提供将训练作业期间创建的检查点复制到 Amazon S3 的功能。 这里,检查点需要保存在预先指定的位置,默认为 /opt/ml/checkpoints。 这些检查点可用于稍后恢复训练或作为模型部署在端点上。 有关 SageMaker 训练平台如何管理训练数据集、模型工件、检查点以及 AWS 云存储和 SageMaker 中训练作业之间的输出的存储路径的高级摘要,请参阅 用于训练数据集、检查点、模型工件和输出的 Amazon SageMaker 训练存储文件夹.

以下代码使用虚构的 model.save() 内部功能 train.py 包含训练逻辑的脚本:

import tarfile
import boto3
import os [ ... argument parsing ... ] for customer in os.list_dir(args.input_path): # Read data locally within the Training job df = pd.read_csv(os.path.join(args.input_path, customer, 'data.csv')) # Define and train the model model = MyModel() model.fit(df) # Save model to output directory with open(os.path.join(output_dir, 'model.json'), 'w') as fout: fout.write(model_to_json(model)) # Create the model.tar.gz archive containing the model and the training script with tarfile.open(os.path.join(output_dir, '{customer}.tar.gz'), "w:gz") as tar: tar.add(os.path.join(output_dir, 'model.json'), "model.json") tar.add(os.path.join(args.code_dir, "training.py"), "training.py")

使用 SageMaker MME 将推理扩展到数千个模型

SageMaker MME 允许您同时服务多个模型,方法是创建一个包含所有要服务的模型列表的端点配置,然后使用该端点配置创建一个端点。 每次添加新模型时无需重新部署端点,因为端点将自动为指定 S3 路径中存储的所有模型提供服务。 这是通过以下方式实现的 多模型服务器 (MMS),一个用于服务 ML 模型的开源框架,可以安装在容器中,以提供满足新 MME 容器 API 要求的前端。 此外,您还可以使用其他模型服务器,包括 火炬服务海卫一。 MMS 可以通过以下方式安装在您的自定义容器中 SageMaker 推理工具包。 要了解有关如何配置 Dockerfile 以包含 MMS 并使用它来为您的模型提供服务的更多信息,请参阅 为 SageMaker 多模型端点构建您自己的容器.

以下代码片段展示了如何使用 SageMaker Python SDK 创建 MME:

from sagemaker.multidatamodel import MultiDataModel # Create the MultiDataModel definition
multimodel = MultiDataModel( name='customer-models', model_data_prefix=f's3://{bucket}/scaling-thousand-models/models', model=your_model,
) # Deploy on a real-time endpoint
predictor = multimodel.deploy( initial_instance_count=1, instance_type='ml.c5.xlarge',
)

当 MME 上线时,我们可以调用它来生成预测。 可以在任何 AWS 开发工具包以及 SageMaker Python 开发工具包中完成调用,如以下代码片段所示:

predictor.predict( data='{"period": 7}', # the payload, in this case JSON target_model='{customer}.tar.gz' # the name of the target model
)

调用模型时,模型最初是从实例上的 Amazon S3 加载的,这可能会导致调用新模型时出现冷启动。 经常使用的模型缓存在内存和磁盘上,以提供低延迟推理。

结论

SageMaker 是一个功能强大且经济高效的平台,用于训练和服务数千个 ML 模型。 其功能(包括 SageMaker 处理、训练作业和 MME)使组织能够大规模高效地训练和服务数千个模型,同时还受益于使用 AWS 云基础设施的成本节约优势。 要了解有关如何使用 SageMaker 训练和服务数千个模型的更多信息,请参阅 处理数据, 使用 Amazon SageMaker 训练模型在一个端点后面的一个容器中托管多个模型.


作者简介

大卫德的图片戴维德·加利特利 是 EMEA 地区的 AI/ML 专家解决方案架构师。 他常驻布鲁塞尔,与比荷卢三国的客户密切合作。 他从小就是一名开发人员,7 岁开始编写代码。他从大学开始学习 AI/ML,从那时起就爱上了它。

莫里斯图片莫里茨·德格鲁特 是位于阿姆斯特丹的 Amazon Web Services 的解决方案架构师。 他喜欢研究机器学习相关的主题,并且偏爱初创公司。 业余时间,他喜欢滑雪和打壁球。

时间戳记:

更多来自 AWS机器学习