构建一个端到端的 MLOps 流水线,使用 Amazon SageMaker Pipelines、G
使用 Amazon SageMaker Pipelines、GitHub 和 GitHub Actions 构建端到端的 MLOps 管道
作者:Romina Sharifpour 和 Pooya Vahidi2023年12月13日
关键要点
MLOps 是为了更有效地管理机器学习模型的生命周期而构建的。Amazon SageMaker 提供了多种功能,支持 CI/CD 以及模型注册。利用 GitHub 和 GitHub Actions 实现自动化工作流,优化机器学习ML流水线。本文将指导如何创建一个集成了 GitHub 和 GitHub Actions 的自定义 SageMaker MLOps 项目模板。机器学习ML模型并不是独立运行的。为了提供价值,它们必须集成到现有的生产系统和基础设施中,这就需要在设计和开发过程中考虑整个 ML 生命周期。机器学习运维MLOps旨在简化、自动化并监控 ML 模型在整个生命周期中的运作。建立一个强大的 MLOps 管道需要跨职能团队的协作,数据科学家、ML 工程师、IT 员工和 DevOps 团队必须共同努力,把模型从研究转化为部署和维护。利用合适的流程和工具,MLOps 能够帮助组织在其团队中可靠高效地采用 ML。
尽管 CI/CD 管道的需求各不相同,并反映出每个组织的独特需求,但通过使用托管的编排工具,可以简化跨团队实施 MLOps 的过程,加快开发进度并消除繁重的重复性工作。
Amazon SageMaker MLOps 是一套包含多种功能的工具,涵盖了 Amazon SageMaker ProjectsCI/CD、Amazon SageMaker Pipelines 和 Amazon SageMaker Model Registry。
SageMaker Pipelines 允许简单创建和管理 ML 工作流,同时提供工作流步骤的存储和重用功能。SageMaker Model Registry 则集中跟踪模型,简化了模型的部署。SageMaker Projects 引入 CI/CD 的实践,包括环境一致性、版本控制、测试和自动化。这使得在 ML 环境中迅速建立 CI/CD 变得容易,促进了企业内的有效扩展。
Amazon SageMaker 提供的内置 项目模板 还集成了许多第三方工具,如 Jenkins 用于编排,GitHub 用于源代码管理,以及其他 AWS 本地的 CI/CD 工具,如 AWS CodeCommit、AWS CodePipeline 和 AWS CodeBuild。然而,在许多场景中,客户希望将 SageMaker Pipelines 与已有的 CI/CD 工具集成,从而创建自己的自定义项目模板。
在这篇文章中,我们将逐步实施以下内容:
创建一个与 GitHub 和 GitHub Actions 集成的自定义 SageMaker MLOps 项目模板。通过单击即可使数据科学团队在 Amazon SageMaker Studio 中可用您的自定义项目模板。解决方案概述
在本文中,我们构建以下架构:创建一个自动化的模型构建管道,其中包括数据准备、模型训练、模型评估和在 SageMaker Model Registry 中注册训练模型的步骤。生成的训练 ML 模型随后将在手动审批后从 SageMaker Model Registry 部署到暂存和生产环境。
让我们深入探讨该架构的组成部分以了解完整的配置。
GitHub 和 GitHub Actions
GitHub 是一个基于网络的平台,提供使用 Git 的版本控制和源代码管理。它使团队能够在软件开发项目中协作,跟踪更改,并管理代码库。GitHub 充当了存储、版本控制和管理您的 ML 代码库的集中位置,从而确保您的 ML 代码和管道被版本化、记录并可供团队成员访问。
GitHub Actions 是 GitHub 生态系统中的强大自动化工具。它允许您创建自定义工作流,以自动化软件开发生命周期过程,例如构建、测试和部署代码。您可以创建由特定事件如代码推送到代码库或创建拉取请求触发的事件驱动工作流。在实施 MLOps 时,您可以使用 GitHub Actions 自动化 ML 流水线的各个阶段,例如:
自动化阶段描述数据验证和预处理处理和清洗数据,以便进行建模。模型训练和评估训练模型,评估其性能。模型部署和监控部署模型并监控其运行情况。ML 模型的 CI/CD实现模型的持续集成和交付。使用 GitHub Actions 可以简化您的 ML 工作流,确保模型始终得到构建、测试和部署,从而提高 ML 部署的效率和可靠性。
在接下来的部分中,我们将首先设置与我们使用的架构部分相关的一些组件的先决条件:
AWS CloudFormation AWS CloudFormation 启动模型部署,并在模型部署管道由训练模型的批准激活后建立 SageMaker 端点。AWS CodeStar 连接 我们使用 AWS CodeStar 建立与 GitHub 存储库的链接,并利用它作为与 AWS 资源如 SageMaker Studio的代码库集成。Amazon EventBridge Amazon EventBridge 跟踪模型注册表的所有修改。它还维护一条规则,当模型包版本的状态从 PendingManualApproval 变为 Approved 时,触发 Lambda 函数以部署模型管道。AWS Lambda 我们使用 AWS Lambda 函数在模型注册表中注册新模型后启动 GitHub Actions 中的模型部署工作流。Amazon SageMaker 我们配置以下 SageMaker 组件:管道 该组件构成一个有向无环图DAG,帮助我们建立自动化的 ML 工作流,涵盖数据准备、模型训练和模型评估的阶段。模型注册表维护模型版本的记录及相关工件、血统和元数据。建立一个模型包组,存放所有相关模型版本。模型注册表还负责管理模型版本的批准状态,以便后续部署。端点 该组件设置两个用于推理的 HTTPS 实时端点。可以根据需要调整托管配置,例如批量转换或异步推理。经过 SageMaker Model Registry 批准的训练模型后,生成一个暂存端点。该端点用于验证部署的模型是否满足准确性标准。当模型准备好进行生产部署时,通过 GitHub Actions 工作流中的手动审批阶段部署生产端点。代码仓库 这会在您的 SageMaker 帐户中创建一个 Git 仓库。通过您在创建 SageMaker 项目时输入的 GitHub 代码仓库中的现有数据,当您启动项目时,会在 SageMaker 中与同一个代码库建立关联。这实际上在 SageMaker 中与 GitHub 仓库建立了一条链接,使得您可以与代码库进行交互操作拉取/推送。模型注册表 它监测模型的不同版本及其相应工件,包括血统和元数据。创建一个被称为 模型包组 的集合,存放相关的模型版本。同时,模型注册表还负责监督模型版本的批准状态,确保其为后续部署做好准备。AWS Secrets Manager 为了安全地保管您的 GitHub 个人访问令牌,需要在 AWS Secrets Manager 中建立一个秘密并将您的访问令牌存放在其中。AWS Service Catalog 我们使用 AWS Service Catalog 实现 SageMaker 项目,其中包含 SageMaker 代码仓库、Lambda 函数、EventBridge 规则、工件 S3 存储桶等组件,所有这些都通过 CloudFormation 实现。这允许您的组织重复使用项目模板并分配项目给每位用户,以简化操作。Amazon S3 我们使用 Amazon Simple Storage ServiceAmazon S3存储管道生成的模型工件。先决条件
您需要具备以下先决条件:
一个 GitHub 账户。一个 AWS 账户。一个 SageMaker Studio 域。AWS 命令行界面AWS CLI已 安装 并已 配置。或者,您可以使用 AWS CloudShell。在实施解决方案之前,您还需完成额外的设置步骤。
设置 AWS CodeStar 连接
如果您还没有 AWS CodeStar 连接到您的 GitHub 账户,请参考 创建与 GitHub 的连接 的说明以创建一个。您的 AWS CodeStar 连接 ARN 将如下所示:
arnawscodestarconnectionsuswest2accountidconnection/aEXAMPLE8aad4d5d8878dfcab0bc441f
在这个示例中,aEXAMPLE8aad4d5d8878dfcab0bc441f 是该连接的唯一 ID。我们会在稍后的 SageMaker 项目创建中使用此 ID。

设置 GitHub 令牌的密钥访问
为了安全地存储您的 GitHub 个人访问令牌,您需要在 Secrets Manager 中创建一个密钥。如果您还没有 GitHub 的个人访问令牌,请参考 管理您的个人访问令牌 的指引创建一个。
您可以创建经典访问令牌或细粒度访问令牌。不过,请确保令牌对于存储库的内容和操作工作流、运行和工件具有访问权限。
完成以下步骤将您的令牌存储在 Secrets Manager 中:
在 Secrets Manager 控制台,选择 Store a new secret。选择 Other type of secret 作为 Choose secret type。在 Key 字段中为您的秘密提供一个名称,并将您的个人访问令牌添加到相应的 Value 字段中。选择 Next,为您的秘密输入一个名称,然后再次选择 Next。选择 Store 以保存您的秘密。通过将 GitHub 个人访问令牌存储在 Secrets Manager 中,您可以在 MLOps 管道中安全地访问它,同时确保其机密性。
为 GitHub Actions 创建 IAM 用户
为了允许 GitHub Actions 在您的 AWS 环境中部署 SageMaker 端点,您需要创建一个 AWS 身份和访问管理IAM用户并授予必要的权限。有关说明,请参阅 在 AWS 账户中创建 IAM 用户。使用 iam/GithubActionsMLOpsExecutionPolicyjson 文件在 代码示例 中提供为此用户提供足够的权限以部署端点。
创建 IAM 用户后, 生成访问密钥。您稍后将在配置 GitHub 密钥的步骤中使用此密钥,包括访问密钥 ID和秘密访问密钥。
设置您的 GitHub 账户
以下是为您的 GitHub 账户做好准备以运行示例的步骤。
克隆 GitHub 仓库您可以重复使用现有的 GitHub 仓库以进行这个示例。但是,创建一个新的仓库会更容易。这个仓库将包含 SageMaker 管道构建和部署的所有源代码。
将种子代码目录的内容复制到您的 GitHub 仓库的根目录。例如,github 目录应该位于 GitHub 仓库的根目录下。
创建一个包含 IAM 用户访问密钥的 GitHub 密钥在这一步中,我们将新创建用户的访问密钥详细信息存储在我们的 GitHub 密钥 中。
在 GitHub 网站上,导航到您的仓库并选择 Settings。在安全部分,选择 Secrets and Variables,然后选择 Actions。选择 New Repository Secret。在 Name 中输入 AWSACCESSKEYID。在 Secret 中输入与您之前创建的 IAM 用户关联的访问密钥 ID。选择 Add Secret。对 AWSSECRETACCESSKEY 重复相同的步骤。配置您的 GitHub 环境为了在我们的部署管道中创建手动审批步骤,我们将使用 GitHub 环境。完成以下步骤:
银河加速器app转到 GitHub 仓库的 Settings,Environments 菜单,并创建一个名为 production 的新环境。在 Environment protection rules 中,选择 Required reviewers。添加所需的 GitHub 用户名作为审核者。对于这个示例,您可以选择自己的用户名。请注意,某些类型的 GitHub 计划不提供环境功能。有关更多信息,请参考 使用环境进行部署。
部署 Lambda 函数
在接下来的步骤中,我们将 lambdafunctionpy 压缩成一个 zip 文件,然后上传到 S3 存储桶。
相关代码示例可以在以下 GitHub 仓库 中找到。具体而言,lambdafunctionpy 位于 lambdafunctions/lambdagithubworkflowtrigger 目录中。
推荐您克隆代码示例的一个分支,这样您就可以修改代码并尝试示例的不同方面。
获取代码副本后,导航到相应目录并使用 zip 命令压缩 lambdafunctionpy。Windows 和 MacOS 用户可以直接使用原生文件管理系统,即文件资源管理器或 Finder,生成 zip 文件。bashcd lambdafunctions/lambdagithubworkflowtriggerzip lambdagithubworkflowtriggerzip lambdafunctionpy
将 lambdagithubworkflowtriggerzip 上传到 S3 存储桶。该存储桶将在后面由 Service Catalog 访问。您可以选择任何可用的存储桶,只要在后续步骤中 Service Catalog 能够从中检索数据即可。
从此步骤起,我们需要安装并配置 AWS CLI v2。或者,您也可以使用 AWS CloudShell,它预装了所有必需的工具,避免了任何额外的配置。
使用以下命令将文件上传到 S3 存储桶:bashaws s3 cp lambdagithubworkflowtriggerzip s3//yourbucket/
现在我们创建一个 Lambda 层,以处理与我们刚刚上传的 lambdafunction 相关的依赖项。
设置一个 Python 虚拟环境并安装依赖项:bashmkdir lambdalayercd lambdalayerpython3 m venv envsource env/bin/activatepip install pygithubdeactivate
使用以下命令生成 zip 文件:bashmv env/lib/python39/sitepackages/ pythonzip r layerzip python
将层发布到 AWS:bashaws lambda publishlayerversion layername python39githubarm64 description Python39 pygithub licenseinfo MIT zipfile fileb//layerzip compatibleruntimes python39 compatiblearchitectures arm64
发布此层后,所有 Lambda 函数都可以引用它以满足其依赖关系。如需更深入地了解 Lambda 层,请参阅 [使用 Lambda 层