使用Amazon SageMaker Pipelines、GitHub和GitHub Actions构建端到端的MLOps流水线

利用Amazon SageMaker Pipelines、GitHub和GitHub Actions构建完整的MLOps流程

机器学习(ML)模型不是孤立运行的。为了提供价值,它们必须整合到现有的生产系统和基础设施中,在设计和开发过程中必须考虑整个ML生命周期。ML运营,也称为MLOps,旨在通过简化、自动化和监控ML模型的整个生命周期来提高效率。建立强大的MLOps流水线需要跨职能的协作。数据科学家、ML工程师、IT人员和DevOps团队必须共同合作,从研究到部署和维护,实现模型的运营化。通过正确的流程和工具,MLOps能够使组织可靠高效地采用ML。

尽管持续集成和持续交付(CI/CD)流水线的需求可能因组织而异,但通过使用托管的编排和工具,可以简化跨团队扩展MLOps实践,加快开发进程并减少统一性的复杂性。

Amazon SageMaker MLOps是一个功能套件,包括Amazon SageMaker Projects(CI/CD)、Amazon SageMaker PipelinesAmazon SageMaker Model Registry

SageMaker Pipelines可简单创建和管理ML工作流,同时提供工作流步骤的存储和重用功能。SageMaker Model Registry将模型跟踪集中化,简化模型部署。 SageMaker Projects将CI/CD实践引入ML,包括环境一致性、版本控制、测试和自动化。这使得在您的ML环境中迅速建立CI/CD成为可能,有助于在企业中实现有效的扩展。

Amazon SageMaker提供的内置项目模板包括与一些第三方工具的集成,如用于编排的Jenkins和用于源代码控制的GitHub,还有一些使用AWS本地CI/CD工具,如AWS CodeCommitAWS CodePipelineAWS CodeBuild。然而,在许多情况下,客户希望将SageMaker Pipelines与其他现有的CI/CD工具集成在一起,从而创建自定义的项目模板。

在本文中,我们将向您展示实现以下内容的逐步实施:

  • 创建一个自定义SageMaker MLOps项目模板,与GitHub和GitHub Actions集成
  • 通过单击即可在Amazon SageMaker Studio中为您的数据科学团队提供自定义项目模板

解决方案概述

在本文中,我们构建了以下架构。我们创建一个自动化的模型构建流水线,包括数据准备、模型训练、模型评估和将训练好的模型注册到SageMaker Model Registry中的步骤。然后,经过手动批准,将产生的训练好的ML模型从SageMaker Model Registry部署到暂存环境和生产环境中。

Solution Overview

让我们深入了解这个架构的元素,以了解完整的配置。

GitHub 和 GitHub Actions

GitHub 是一个基于 Web 的平台,提供使用 Git 进行版本控制和源代码管理的功能。它使团队能够协作开发软件项目,跟踪更改,并管理代码仓库。GitHub 充当了一个集中存储、版本控制和管理 ML 代码库的位置。这确保了你的 ML 代码库和流程能够由团队成员进行版本控制、文档化和访问。

GitHub Actions 是 GitHub 生态系统中的强大自动化工具。它允许你创建自定义工作流,自动化软件开发的生命周期过程,如构建、测试和部署代码。你可以创建基于特定事件触发的工作流,比如当代码被推送到仓库或创建拉取请求时。在实施 MLOps 时,你可以使用 GitHub Actions 自动化 ML 流水线的各个阶段,例如:

  • 数据验证和预处理
  • 模型训练和评估
  • 模型部署和监控
  • ML 模型的 CI/CD

通过使用 GitHub Actions,你可以优化 ML 工作流程,并确保模型的一致构建、测试和部署,从而实现更高效和可靠的 ML 部署。

在接下来的章节中,我们将先设置与该架构中的一些组件相关的先决条件:

  • AWS CloudFormationAWS CloudFormation 启动模型部署,并在训练模型获得批准后建立 SageMaker 端点。
  • AWS CodeStar 连接 – 我们使用 AWS CodeStar 建立与 GitHub 仓库的链接,并将其作为与 AWS 资源,如 SageMaker Studio,进行代码存储库集成。
  • Amazon EventBridgeAmazon EventBridge 跟踪模型注册表的所有修改。它还维护一个规则,当模型包版本的状态从 PendingManualApproval 更改为 Approved 时,触发 Lambda 函数来部署模型流水线。
  • AWS Lambda – 我们使用一个 AWS Lambda 函数,在模型注册表中注册新模型之后,触发 GitHub Actions 中的模型部署工作流。
  • Amazon SageMaker – 我们配置了以下 SageMaker 组件:
    • 流水线 – 这个组件由一个有向无环图 (DAG) 组成,帮助我们为数据准备、模型训练和模型评估阶段构建自动化的 ML 工作流。模型注册表维护着模型版本、相关的构件、血缘关系和元数据的记录。建立了一个包含所有相关模型版本的模型包组。模型注册表还负责管理模型版本的审批状态,以便进行后续部署。
    • 端点 – 这个组件为推理设置了两个 HTTPS 实时端点。主机配置可以进行调整,例如用于批量转换或异步推理。当 SageMaker 模型注册表中的训练模型获得批准激活模型部署流水线时,生成了一个暂存端点。该端点用于验证部署模型是否满足我们的准确性标准。当模型准备好进行生产部署时,通过 GitHub Actions 工作流中的手动批准阶段部署了一个生产端点。
    • 代码存储库 – 这在您的 SageMaker 帐户中创建了一个代码存储库的资源。使用在创建 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 Service (Amazon S3) 存储桶来存放由流水线生成的模型构件。

前提条件

您应具备以下前提条件:

在实施解决方案之前,您还必须完成其他设置步骤。

建立AWS CodeStar连接

如果您还没有将GitHub账户与AWS CodeStar连接起来,可以参考创建与GitHub的连接获取创建连接的说明。您的AWS CodeStar连接ARN将类似如下:

arn:aws:codestar-connections:us-west-2:account_id:connection/aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f

在此示例中,aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f是此连接的唯一ID。在接下来的示例中,我们将使用此ID来创建SageMaker项目。

为GitHub令牌设置秘密访问密钥

为了安全地存储GitHub个人访问令牌,您需要在Secrets Manager中创建一个秘密。如果您还没有GitHub的个人访问令牌,请参考管理您的个人访问令牌获取创建令牌的说明。

您可以创建传统的或者细粒度的访问令牌。但是,请确保令牌具有对存储库内容和操作(工作流程、运行和构件)的访问权限。

请按照以下步骤将您的令牌存储在Secrets Manager中:

  1. 在Secrets Manager控制台中,选择存储新的秘密
  2. 对于选择秘密类型,选择其他类型的秘密
  3. 字段中提供一个秘密名称,并将您的个人访问令牌添加到相应的字段中。
  4. 选择下一步,输入一个秘密名称,并再次选择下一步
  5. 选择存储以保存您的秘密。

通过将GitHub个人访问令牌存储在Secrets Manager中,您可以在MLOps管道中安全地访问它,并确保其保密性。

为GitHub Actions创建IAM用户

为了允许GitHub Actions在您的AWS环境中部署SageMaker端点,您需要创建一个AWS身份和访问管理(IAM)用户,并授予其必要的权限。有关说明,请参考在您的AWS账户中创建IAM用户。使用提供的iam/GithubActionsMLOpsExecutionPolicy.json文件(在代码示例中提供)为该用户提供足够的权限以部署您的端点。

创建IAM用户后,生成一个访问密钥。在后续的配置GitHub Secrets的步骤中,您将使用此访问密钥,该密钥包括访问密钥ID和秘密访问密钥。

设置您的GitHub帐户

以下是准备GitHub帐户运行此示例的步骤。

克隆GitHub存储库

您可以重复使用现有的GitHub存储库来进行此示例。但是,如果您创建一个新的存储库会更容易。此存储库将包含SageMaker管道构建和部署的所有源代码。

将种子代码目录的内容复制到您的GitHub存储库的根目录下。例如,.github目录应该位于您的GitHub存储库的根目录下。

创建包含IAM用户访问密钥的GitHub密钥

在此步骤中,我们将新创建用户的访问密钥详细信息存储在我们的GitHub密钥中。

  1. 在GitHub网站上,导航到您的存储库并选择设置
  2. 在安全部分,选择Secrets and Variables,然后选择Actions
  3. 选择New Repository Secret
  4. Name输入AWS_ACCESS_KEY_ID
  5. Secret输入与先前创建的IAM用户关联的访问密钥ID。
  6. 选择Add Secret
  7. 对于AWS_SECRET_ACCESS_KEY,重复相同的步骤。

配置您的GitHub环境

为了在我们的部署流水线中创建手动批准步骤,我们使用GitHub环境完成以下步骤:

  1. 导航到您的GitHub存储库的SettingsEnvironments菜单,创建一个名为production的新环境。
  2. 对于Environment protection rules,选择Required reviewers
  3. 将所需的GitHub用户名添加为审阅者。对于此示例,您可以选择您自己的用户名。

请注意,环境功能在某些类型的GitHub计划中不可用。有关更多信息,请参阅使用环境进行部署

部署Lambda函数

以下步骤将lambda_function.py压缩为.zip文件,然后将其上传到S3存储桶。

此示例的相关代码示例可以在以下GitHub存储库中找到。具体而言,lambda_function.py位于lambda_functions/lambda_github_workflow_trigger目录中。

建议创建一个代码示例的分支并进行克隆。这将使您有机会修改代码并尝试示例的不同方面。

  1. 在您获得代码副本后,导航到适当的目录并使用zip命令压缩lambda_function.py。Windows和MacOS用户可以使用其本地文件管理系统,分别是文件资源管理器或Finder,生成一个.zip文件。
cd lambda_functions/lambda_github_workflow_triggerzip lambda-github-workflow-trigger.zip lambda_function.py
  1. lambda-github-workflow-trigger.zip上传到S3存储桶。

稍后,Service Catalog将访问此存储桶。您可以选择任何您可以访问的存储桶,只要Service Catalog能够在后续步骤中从中检索数据。

从此步骤开始,我们需要安装和配置AWS CLI v2。另一种选择是使用AWS CloudShell,它预安装了所有必要的工具,无需进行任何额外的配置。

  1. 要将文件上传到S3存储桶,请使用以下命令:
aws s3 cp lambda-github-workflow-trigger.zip s3://your-bucket/

现在我们为刚刚上传的lambda_function相关的依赖项构建一个Lambda layer。

  1. 设置一个Python虚拟环境并安装依赖项:
mkdir lambda_layercd lambda_layerpython3 -m venv .envsource .env/bin/activatepip install pygithubdeactivate
  1. 使用以下命令生成.zip文件:
mv .env/lib/python3.9/site-packages/ pythonzip -r layer.zip python
  1. 将该layer发布到AWS:
aws lambda publish-layer-version --layer-name python39-github-arm64 \   --description "Python3.9 pygithub" \   --license-info "MIT" \   --zip-file fileb://layer.zip \   --compatible-runtimes python3.9 \   --compatible-architectures "arm64"

通过发布这个layer,您的所有Lambda函数现在都可以引用它来满足其依赖项。如需更详细了解Lambda layers,请参阅使用Lambda Layers

在SageMaker中创建自定义项目模板

完成上述所有步骤后,我们拥有了所有的CI/CD流水线资源和组件。接下来,我们将演示如何将这些资源作为自定义项目在SageMaker Studio中可通过一键部署访问。

正如之前讨论的,当SageMaker提供的模板无法满足您的需求时(例如,您想在CodePipeline中具有更复杂的编排,包含多个阶段的自定义批准步骤,或者与GitHub和GitHub Actions等第三方工具集成,本文中会进行演示),您可以创建自己的模板。我们建议从SageMaker提供的模板开始,以了解如何组织您的代码和资源,并在此基础上进行扩展。更多详细信息,请参阅创建自定义项目模板

注意,您还可以自动化此步骤,而不是使用CloudFormation通过代码部署服务目录组合和产品。然而,在本文中,为了获得更好的学习体验,我们将向您展示控制台部署。

在这个阶段,我们使用提供的CloudFormation模板创建一个服务目录组合,以帮助我们在SageMaker中创建自定义项目。

您可以创建一个新的域或者重复使用您的SageMaker域进行以下步骤。如果您还没有域,请参阅使用快速设置加入Amazon SageMaker域获取设置说明。

在为SageMaker模板启用管理员访问权限后,请完成以下步骤:

  1. 在服务目录控制台上,导航到管理,选择组合
  2. 选择创建新组合
  3. 将组合命名为“SageMaker组织模板”。
  4. template.yml文件下载到您的计算机。

此Cloud Formation模板将提供我们所有需要的CI/CD资源作为配置和基础设施的代码。您可以详细研究模板,了解它作为其中一部分部署了哪些资源。此模板已根据GitHub和GitHub Actions进行了定制。

  1. template.yml文件中,将S3Bucket值更改为您上传Lambda .zip文件的桶:
GitHubWorkflowTriggerLambda:  ...  Code:    S3Bucket: <your-bucket>    S3Key: lambda-github-workflow-trigger.zip  ...
  1. 选择新组合。
  2. 选择上传新产品
  3. 对于产品名称,输入您的模板名称。我们使用名称build-deploy-github
  4. 对于描述,输入描述。
  5. 对于所有者,输入您的姓名。
  6. 版本详细信息下,对于方法,选择使用模板文件
  7. 选择上传模板
  8. 上传您下载的模板。
  9. 对于版本标题,选择1.0
  10. 选择审核
  11. 审核您的设置,并选择创建产品
  12. 选择刷新以列出新产品。
  13. 选择刚刚创建的产品。
  14. 标签选项卡中,向产品添加以下标签:
    • = sagemaker:studio-visibility
    • = true

回到投资组合详情页面,您应该能看到类似以下截图(具有不同的ID)。

产品目录投资组合
  1. 约束选项卡中,选择创建约束
  2. 对于产品,选择build-deploy-github(刚刚创建的产品)。
  3. 对于约束类型,选择启动
  4. 启动约束下,对于方法,选择选择IAM角色
  5. 选择AmazonSageMakerServiceCatalogProductsLaunchRole
  6. 选择创建
  7. 组、角色和用户选项卡中,选择添加组、角色、用户
  8. 角色选项卡中,选择您在配置SageMaker Studio域时使用的角色。这是SageMaker域角色的位置。
产品目录启动约束
  1. 选择添加访问

从SageMaker Studio部署项目

在前面的部分中,您准备了自定义MLOps项目环境。现在,让我们使用这个模板创建一个项目:

  1. 在SageMaker控制台上,导航到要创建此项目的域。
  2. 启动菜单中,选择Studio

您将被重定向到SageMaker Studio环境。

  1. 在SageMaker Studio中,在导航窗格下的部署中,选择项目
  2. 选择创建项目
  3. 在模板列表的顶部,选择组织模板

如果您已经成功完成了之前的所有步骤,您应该能够看到一个名为Build-Deploy-GitHub的新自定义项目模板。

  1. 选择该模板,然后选择选择项目模板
  2. 输入可选描述。
  3. 对于GitHub仓库所有者名称,输入您的GitHub仓库的所有者。例如,如果您的仓库位于https://github.com/pooyavahidi/my-repo,则所有者将是pooyavahidi
  4. 对于GitHub仓库名称,输入您复制种子代码的存储库的名称。它只是仓库的名称。例如,在https://github.com/pooyavahidi/my-repo中,仓库是my-repo
  5. 对于CodeStar连接唯一ID,输入您创建的AWS CodeStar连接的唯一ID。
  6. 对于在Secrets Manager中存储GitHub令牌的秘密名称,输入您在Secrets Manager中创建和存储GitHub令牌的秘密名称。
  7. 对于用于部署的GitHub工作流文件,输入GitHub工作流文件的名称(位于.github/workflows/deploy.yml),其中包含部署说明。对于此示例,您可以保持默认值:deploy.yml
  8. 选择创建项目
SageMaker Studio项目
  1. 创建项目后,请确保根据您的需要更新 GitHub 工作流文件中的 AWS_REGIONSAGEMAKER_PROJECT_NAME 环境变量。工作流文件位于您的 GitHub 存储库(从模板代码中复制的)的 .github/workflows 目录中。请确保同时更新 build.ymldeploy.yml 文件。
...env:  AWS_REGION: <地区>     SAGEMAKER_PROJECT_NAME: <您的项目名称>...

现在您的环境已经准备就绪!您可以直接运行流水线,进行更改,并将这些更改推送到您的 GitHub 存储库,以触发自动化构建流水线,并查看构建和部署的所有步骤是如何自动化的。

清理

要清理资源,请完成以下步骤:

  • 删除用于 SageMaker 项目和 SageMaker 终端节点的 CloudFormation 堆栈。
  • 删除 SageMaker 域。
  • 删除 Service Catalog 资源。
  • 删除与 GitHub 存储库的 AWS CodeStar 连接链接。
  • 删除为 GitHub Actions 创建的 IAM 用户。
  • 删除 Secrets Manager 中存储 GitHub 个人访问详细信息的密钥。

总结

在本文中,我们介绍了使用自定义 SageMaker MLOps 项目模板自动构建和组织 CI/CD 流水线的过程。该流水线有效地将现有的 CI/CD 机制与 SageMaker 的数据操作、模型训练、模型批准和模型部署能力集成在一起。在我们的场景中,我们重点介绍了如何将 GitHub Actions 与 SageMaker 项目和流水线集成。要全面了解实现细节,请访问GitHub 存储库。请随意尝试并在评论部分留下您可能遇到的任何疑问。