使用Amazon SageMaker、HashiCorp Terraform和GitLab CI/CD进行批量推理的MLOps,包括模型监控和重新训练
使用Amazon SageMaker、HashiCorp Terraform和GitLab CI/CD进行MLOps批量推理,包括模型监控和重新训练
在生产环境中维护机器学习(ML)工作流是一项具有挑战性的任务,因为它需要为ML代码和模型创建持续集成和持续交付(CI/CD)流水线、模型版本控制、数据和概念漂移的监控、模型重新训练以及手动批准流程,以确保模型的新版本同时满足性能和合规性要求。
在本文中,我们将介绍如何使用Amazon SageMaker、Amazon EventBridge、AWS Lambda、Amazon Simple Notification Service(Amazon SNS)、HashiCorp Terraform和GitLab CI/CD创建用于批量推断的MLOps工作流。所介绍的MLOps工作流提供了一个可重用的模板,通过自动化、监控、可审计性和可扩展性来管理ML生命周期,从而降低了在生产环境中维护批量推断工作负载的复杂性和成本。
解决方案概述
下图展示了面向企业批量推断的目标MLOps架构,适用于使用GitLab CI/CD和Terraform基础架构即代码(IaC)与AWS工具和服务结合使用的组织。GitLab CI/CD充当宏编排器,编排包括使用SageMaker Python SDK和Terraform来源码、构建和提供Amazon SageMaker Pipelines和支持资源的模型构建
和模型部署
流水线。SageMaker Python SDK用于创建或更新用于训练、使用超参数优化(HPO)进行训练以及批量推断的SageMaker Pipelines。Terraform用于创建其他资源,如EventBridge规则、Lambda函数和SNS主题,用于监控SageMaker Pipelines并发送通知(例如,当流水线步骤失败或成功时)。SageMaker Pipelines充当ML模型训练和推断工作流的编排器。
此架构设计代表了多账号策略,其中ML模型在数据科学开发账号中构建、训练和注册到中央模型注册表(该账号具有比典型应用程序开发账号更多的控制)。然后,使用DevOps工具(如GitLab CI/CD)的自动化将推断流水线部署到暂存和生产账号。中央模型注册表也可以选择性地放置在共享服务账号中。有关ML多账号策略的最佳实践,请参阅操作模型。
在下面的子节中,我们将详细讨论架构设计的不同方面。
基础架构即代码
基础架构即代码(IaC)通过可机器读取的文件来管理IT基础架构,确保高效的版本控制。在本文和附带的代码示例中,我们演示了如何使用HashiCorp Terraform和GitLab CI/CD有效地管理AWS资源。这种方法凸显了IaC的关键优势,提供了IT基础架构管理中透明和可重复的过程。
模型训练和重新训练
在此设计中,SageMaker训练流水线定期根据计划(通过EventBridge)或基于Amazon Simple Storage Service(Amazon S3)事件触发器(例如,在Amazon S3中放置触发文件或新的训练数据,对于单个训练数据对象)使用新数据对模型进行定期校准。该流水线不会对模型引入结构或实质性的更改,因为它使用在企业模型审查过程中获得批准的固定超参数。
如果模型超过预定义的模型性能阈值(例如,回归的RMSE和分类的F1分数),训练流水线将在Amazon SageMaker模型注册表中注册新训练的模型版本。当模型的新版本在模型注册表中注册时,它会通过Amazon SNS向负责的数据科学家发送通知。然后,数据科学家需要通过Amazon SageMaker Studio UI或使用AWS命令行界面(AWS CLI)或Python的AWS SDK(Boto3)通过API调用来审查和手动批准模型的最新版本,然后才能将新版本的模型用于推断。
SageMaker训练流水线及其支持资源是由GitLab的模型构建
流水线创建的,可以通过手动运行GitLab流水线或自动将代码合并到模型构建
Git存储库的main
分支来创建。
批量推断
在SageMaker批量推断管道中,可以按计划运行(通过EventBridge)或根据S3事件触发运行。批量推断管道会自动从模型注册表中提取最新的已批准版本,并将其用于推断。批量推断管道包括针对数据质量和模型质量(如果有可用的基准标签)的检查步骤。
如果批量推断管道发现数据质量问题,它将通过Amazon SNS通知负责的数据科学家。如果发现模型质量问题(例如,RMSE大于预先指定的阈值),模型质量检查步骤将失败,从而触发EventBridge事件以启动带有HPO管道的训练。
SageMaker批量推断管道及其支持资源由GitLab的model deploy
管道创建,可以通过手动运行GitLab管道或自动合并代码到model deploy
Git存储库的main
分支时创建。
模型调整和再调整
当批量推断管道的模型质量检查步骤失败时,将触发SageMaker带有HPO管道的训练。模型质量检查是通过将模型预测与实际基准标签进行比较来执行的。如果模型质量指标(例如,回归的RMSE和分类的F1分数)不符合预先指定的标准,则将标记模型质量检查步骤为失败。如果需要,负责的数据科学家还可以通过SageMaker Studio UI或使用AWS CLI或SageMaker Python SDK的API调用手动触发SageMaker带有HPO管道的训练。由于模型超参数正在更改,负责的数据科学家需要在新模型版本在模型注册表中获得批准之前从企业模型审核委员会获得批准。
SageMaker带有HPO管道及其支持资源由GitLab的model build
管道创建,可以通过手动运行GitLab管道或自动合并代码到model build
Git存储库的main
分支时创建。
模型监控
数据统计和约束基线是训练和带有HPO管道的训练的一部分生成的。如果模型通过了评估,它们将保存在Amazon S3中,并在模型注册表中注册。批量推断管道的建议架构使用Amazon SageMaker模型监控进行数据质量检查,同时使用自定义的Amazon SageMaker处理步骤进行模型质量检查。该设计将数据质量检查和模型质量检查解耦,从而在检测到数据漂移时只发送警告通知;在检测到模型质量违规时触发带有HPO管道的训练。
模型批准
在新训练的模型在模型注册表中注册后,负责的数据科学家将收到通知。如果模型是由训练管道(在固定超参数的情况下使用新训练数据进行重新校准)训练的,则不需要从企业模型审核委员会获得批准。数据科学家可以独立审查和批准新版本的模型。另一方面,如果模型是通过带有HPO管道(通过更改超参数进行重新调整)进行训练的,则新模型版本需要通过企业审核流程才能在生产中用于推断。审核流程完成后,数据科学家可以继续并在模型注册表中批准新版本的模型。将模型包的状态更改为Approved
将通过EventBridge触发一个Lambda函数,该函数将通过API调用触发GitLab的model deploy
管道。这将自动更新SageMaker批量推断管道,以利用最新批准的模型版本进行推断。
在模型注册表中批准或拒绝新模型版本有两种主要方式:使用Python的AWS SDK(Boto3)或通过SageMaker Studio UI。默认情况下,训练管道和带有HPO管道都将ModelApprovalStatus
设置为PendingManualApproval
。负责的数据科学家可以通过调用Boto3的update_model_package
API来更新模型的批准状态。有关通过SageMaker Studio UI更新模型批准状态的详细信息,请参阅更新模型批准状态。
数据I/O设计
SageMaker直接与Amazon S3交互,用于读取训练和推断管道中各个步骤的输入和存储输出。以下图示说明了如何在S3存储桶中组织不同的Python脚本、原始和处理后的训练数据、原始和处理后的推断数据、推断结果和基准标签(如果用于模型质量监控),模型工件、训练和推断评估指标(模型质量监控),以及数据质量基线和违规报告(数据质量监控)。图中箭头的方向表示哪些文件是SageMaker管道中各个步骤的输入或输出。箭头根据管道步骤类型进行了颜色编码,以便更容易阅读。管道将自动从GitLab存储库上传Python脚本,并将每个步骤的输出文件或模型工件存储到适当的S3路径中。
数据工程师负责以下工作:
- 将标记的训练数据上传到Amazon S3的适当路径。这包括定期添加新的训练数据,以确保训练管道和HPO训练管道可以访问最新的训练数据,用于模型重新训练和微调。
- 在推理管道计划运行之前,将输入数据上传到S3存储桶的适当路径。
- 将基本真实标签上传到适当的S3路径,以进行模型质量监控。
数据科学家负责以下工作:
- 准备基本真实标签并将其提供给数据工程团队,以便上传到Amazon S3。
- 将通过HPO训练管道训练的模型版本经过企业审查流程,并获得必要的批准。
- 手动批准或拒绝模型注册表中的新训练模型版本。
- 批准推理管道和支持资源的生产门,以提升到生产环境。
示例代码
在本节中,我们提供了一个用于批量推理操作的示例代码,其单账户设置如下架构图所示。示例代码可以在GitHub存储库中找到,并可作为企业常常需要的具备模型监控和自动重新训练使用质量门的起点。示例代码与目标架构有以下不同之处:
- 它使用单个AWS账户来构建和部署ML模型和支持资源。请参考使用多个AWS账户组织您的AWS环境,以获取有关在AWS上进行多账户设置的指导。
- 它使用单个GitLab CI/CD管道来构建和部署ML模型和支持资源。
- 当训练出新版本的模型并获得批准后,GitLab CI/CD管道不会自动触发,需要负责的数据科学家手动运行以使用最新批准的模型版本更新SageMaker批量推理管道。
- 它仅支持基于S3事件的触发器来运行SageMaker训练和推理管道。
先决条件
在部署此解决方案之前,您应具备以下先决条件:
- 一个AWS账户
- SageMaker Studio
- 具有Amazon S3读/写和AWS Key Management Service (AWS KMS)加密/解密权限的SageMaker执行角色
- 用于存储数据、脚本和模型构件的S3存储桶
- Terraform版本0.13.5或更高
- 具有工作的Docker runner的GitLab,用于运行管道
- AWS CLI
- jq
- unzip
- Python3 (Python 3.7或更高版本) 和以下Python包:
- boto3
- sagemaker
- pandas
- pyyaml
存储库结构
GitHub存储库包含以下目录和文件:
/code/lambda_function/
– 此目录包含一个Lambda函数的Python文件,用于准备和发送有关SageMaker管道步骤状态更改的通知消息 (通过Amazon SNS)/data/
– 此目录包含原始数据文件 (训练、推理和基本真实数据)/env_files/
– 此目录包含Terraform输入变量文件/pipeline_scripts/
– 此目录包含三个Python脚本,用于创建和更新SageMaker的训练、推理和HPO训练管道,以及指定每个管道参数的配置文件/scripts/
– 此目录包含其他Python脚本 (如预处理和评估),这些脚本由训练、推理和HPO训练管道引用.gitlab-ci.yml
– 此文件指定GitLab CI/CD管道配置/events.tf
– 此文件定义EventBridge资源/lambda.tf
– 此文件定义Lambda通知函数和相关的AWS Identity and Access Management (IAM)资源/main.tf
– 此文件定义Terraform数据源和本地变量/sns.tf
– 此文件定义Amazon SNS资源/tags.json
– 此JSON文件允许您声明自定义标签键值对,并使用本地变量将它们附加到Terraform资源/variables.tf
– 此文件声明所有Terraform变量
变量和配置
下表显示了用于参数化此解决方案的变量。有关更多详细信息,请参考 ./env_files/dev_env.tfvars
文件。
****名称**** | ****描述**** |
bucket_name |
用于存储数据、脚本和模型工件的S3存储桶 |
bucket_prefix |
ML项目的S3前缀 |
bucket_train_prefix |
训练数据的S3前缀 |
bucket_inf_prefix |
推理数据的S3前缀 |
notification_function_name |
准备并发送有关SageMaker管道步骤状态更改的通知消息的Lambda函数的名称 |
custom_notification_config |
在检测到特定管道运行状态时,用于自定义通知消息的配置 |
email_recipient |
接收SageMaker管道步骤状态更改通知的电子邮件地址列表 |
pipeline_inf |
SageMaker推理管道的名称 |
pipeline_train |
SageMaker训练管道的名称 |
pipeline_trainwhpo |
带有HPO的SageMaker训练管道的名称 |
recreate_pipelines |
如果设置为true ,将在运行GitLab CI/CD时删除三个现有的SageMaker管道(训练、推理、带有HPO),并创建新的管道 |
model_package_group_name |
模型包组的名称 |
accuracy_mse_threshold |
MSE的最大值,超过此值将需要更新模型 |
role_arn |
SageMaker管道执行角色的IAM角色ARN |
kms_key |
Amazon S3和SageMaker加密的KMS密钥ARN |
subnet_id |
SageMaker网络配置的子网ID |
sg_id |
SageMaker网络配置的安全组ID |
upload_training_data |
如果设置为true ,将上传训练数据到Amazon S3,并触发训练管道的运行 |
upload_inference_data |
如果设置为true ,将推理数据上传到Amazon S3,并触发推理管道的运行 |
user_id |
作为标签添加到SageMaker资源的SageMaker用户的员工ID |
部署解决方案
按照以下步骤在您的AWS帐户中部署解决方案:
- 将GitHub存储库克隆到您的工作目录中。
- 查看并修改GitLab CI/CD管道配置以适应您的环境。配置在
./gitlab-ci.yml
文件中指定。 - 参考README文件,更新
./env_files/dev_env.tfvars
文件中的通用解决方案变量。该文件包含Python脚本和Terraform自动化的变量。- 检查在
./batch_scoring_pipeline/pipeline_scripts/
下定义的其他SageMaker Pipelines参数。如有必要,请进行审查和更新参数。
- 检查在
- 查看
./pipeline_scripts/
中的SageMaker管道创建脚本以及在./scripts/
文件夹中被它们引用的脚本。GitHub仓库提供的示例脚本基于鲍鱼数据集。如果您要使用不同的数据集,请确保更新脚本以适应您的特定问题。 - 使用以下命名约定将数据文件放入
./data/
文件夹中。如果您使用鲍鱼数据集以及提供的示例脚本,请确保数据文件没有标题,训练数据包括独立变量和目标变量,并保留列的原始顺序,推理数据仅包括独立变量,而基准文件仅包括目标变量。training-data.csv
inference-data.csv
ground-truth.csv
- 提交并推送代码到存储库以触发GitLab CI/CD管道运行(第一次运行)。请注意,第一个管道运行将在
pipeline
阶段失败,因为推理管道脚本尚未有批准的模型版本可供使用。请查看步骤日志并验证是否成功创建了名为TrainingPipeline
的新SageMaker管道。
-
- 打开SageMaker Studio UI,然后查看并运行训练管道。
- 在训练管道成功运行后,在模型注册表中批准注册的模型版本,然后重新运行整个GitLab CI/CD管道。
- 在
build
阶段中,查看Terraform计划输出。在GitLab CI/CD管道中批准手动apply
阶段,以恢复管道运行并授权Terraform在您的AWS帐户中创建监控和通知资源。 - 最后,在SageMaker Studio UI中查看SageMaker管道的运行状态和输出,并检查您的电子邮件以获取通知消息,如下截图所示。默认的消息正文格式为JSON。
SageMaker管道
在本节中,我们描述了MLOps工作流中的三个SageMaker管道。
训练管道
训练管道由以下步骤组成:
- 预处理步骤,包括特征转换和编码
- 数据质量检查步骤,使用训练数据生成数据统计和约束基线
- 训练步骤
- 训练评估步骤
- 条件步骤,检查训练模型是否满足预定义的性能阈值
- 模型注册步骤,如果训练模型满足所需的性能阈值,则在模型注册表中注册新训练的模型
在训练管道中,skip_check_data_quality
和register_new_baseline_data_quality
参数都设置为True
。这些参数指示管道跳过数据质量检查,只是使用训练数据创建和注册新的数据统计或约束基线。以下图示展示了训练管道的成功运行。
批量推断流水线
批量推断流水线由以下步骤组成:
- 从模型注册表中获取最新批准的模型版本创建模型
- 预处理步骤,包括特征转换和编码
- 批量推断步骤
- 数据质量检查预处理步骤,创建包含输入数据和模型预测的新CSV文件,用于数据质量检查
- 数据质量检查步骤,根据注册模型的基线统计和约束检查输入数据
- 条件步骤,检查是否可用地面真实数据。如果有地面真实数据,则执行模型质量检查步骤
- 模型质量计算步骤,根据地面真实标签计算模型性能
推断流水线中的skip_check_data_quality
和register_new_baseline_data_quality
参数都设置为False
。这些参数指示流水线使用与注册模型相关联的数据统计或约束基线进行数据质量检查(supplied_baseline_statistics_data_quality
和supplied_baseline_constraints_data_quality
),并在推断过程中跳过创建或注册新数据统计和约束基线。下图说明了批量推断流水线的运行,其中数据质量检查步骤由于模型在推断数据上的性能较差而失败。在这种特殊情况下,将自动触发带有HPO的训练流水线,以对模型进行微调。
带有HPO的训练流水线
带有HPO的训练流水线由以下步骤组成:
- 预处理步骤(特征转换和编码)
- 使用训练数据生成数据统计和约束基线的数据质量检查步骤
- 超参数调优步骤
- 训练评估步骤
- 条件步骤,检查训练模型是否达到预先指定的准确度阈值
- 如果最佳训练模型达到所需的准确度阈值,则进行模型注册步骤
训练带有HPO的流水线中的skip_check_data_quality
和register_new_baseline_data_quality
参数都设置为True
。下图描述了带有HPO的训练流水线的成功运行。
清理
按照以下步骤清理资源:
- 在GitLab CI/CD流水线中使用
destroy
阶段来消除Terraform提供的所有资源。 - 使用AWS CLI列出并删除由Python脚本创建的任何剩余流水线。
- 可选择删除其他AWS资源,如S3存储桶或在CI/CD流水线之外创建的IAM角色。
结论
在本文中,我们演示了如何使用Amazon SageMaker、Amazon EventBridge、AWS Lambda、Amazon SNS、HashiCorp Terraform和GitLab CI/CD为批量推断作业创建MLOps工作流。所提供的工作流自动化了数据和模型监控、模型重新训练以及批量作业运行、代码版本控制和基础设施供应。这可以极大地简化和降低维护生产中批量推断作业的复杂性和成本。有关实施细节的更多信息,请查阅GitHub存储库。