使用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 Pipelines和Amazon 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 CodeCommit、 AWS CodePipeline和AWS CodeBuild。然而,在许多情况下,客户希望将SageMaker Pipelines与其他现有的CI/CD工具集成在一起,从而创建自定义的项目模板。
在本文中,我们将向您展示实现以下内容的逐步实施:
- 创建一个自定义SageMaker MLOps项目模板,与GitHub和GitHub Actions集成
- 通过单击即可在Amazon SageMaker Studio中为您的数据科学团队提供自定义项目模板
解决方案概述
在本文中,我们构建了以下架构。我们创建一个自动化的模型构建流水线,包括数据准备、模型训练、模型评估和将训练好的模型注册到SageMaker Model Registry中的步骤。然后,经过手动批准,将产生的训练好的ML模型从SageMaker Model Registry部署到暂存环境和生产环境中。
让我们深入了解这个架构的元素,以了解完整的配置。
GitHub 和 GitHub Actions
GitHub 是一个基于 Web 的平台,提供使用 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 模型注册表中的训练模型获得批准激活模型部署流水线时,生成了一个暂存端点。该端点用于验证部署模型是否满足我们的准确性标准。当模型准备好进行生产部署时,通过 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) 存储桶来存放由流水线生成的模型构件。
前提条件
您应具备以下前提条件:
- 一个GitHub账户。
- 一个AWS账户。
- 一个SageMaker Studio域。
- 已安装并配置AWS命令行接口(AWS CLI)。或者您可以使用AWS CloudShell。
在实施解决方案之前,您还必须完成其他设置步骤。
建立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中:
- 在Secrets Manager控制台中,选择存储新的秘密。
- 对于选择秘密类型,选择其他类型的秘密。
- 在键字段中提供一个秘密名称,并将您的个人访问令牌添加到相应的值字段中。
- 选择下一步,输入一个秘密名称,并再次选择下一步。
- 选择存储以保存您的秘密。
通过将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密钥中。
- 在GitHub网站上,导航到您的存储库并选择设置。
- 在安全部分,选择Secrets and Variables,然后选择Actions。
- 选择New Repository Secret。
- 为Name输入
AWS_ACCESS_KEY_ID
- 为Secret输入与先前创建的IAM用户关联的访问密钥ID。
- 选择Add Secret。
- 对于
AWS_SECRET_ACCESS_KEY
,重复相同的步骤。
配置您的GitHub环境
为了在我们的部署流水线中创建手动批准步骤,我们使用GitHub环境完成以下步骤:
- 导航到您的GitHub存储库的Settings和Environments菜单,创建一个名为production的新环境。
- 对于Environment protection rules,选择Required reviewers。
- 将所需的GitHub用户名添加为审阅者。对于此示例,您可以选择您自己的用户名。
请注意,环境功能在某些类型的GitHub计划中不可用。有关更多信息,请参阅使用环境进行部署。
部署Lambda函数
以下步骤将lambda_function.py
压缩为.zip文件,然后将其上传到S3存储桶。
此示例的相关代码示例可以在以下GitHub存储库中找到。具体而言,lambda_function.py
位于lambda_functions/lambda_github_workflow_trigger目录中。
建议创建一个代码示例的分支并进行克隆。这将使您有机会修改代码并尝试示例的不同方面。
- 在您获得代码副本后,导航到适当的目录并使用
zip
命令压缩lambda_function.py
。Windows和MacOS用户可以使用其本地文件管理系统,分别是文件资源管理器或Finder,生成一个.zip文件。
cd lambda_functions/lambda_github_workflow_triggerzip lambda-github-workflow-trigger.zip lambda_function.py
- 将
lambda-github-workflow-trigger.zip
上传到S3存储桶。
稍后,Service Catalog将访问此存储桶。您可以选择任何您可以访问的存储桶,只要Service Catalog能够在后续步骤中从中检索数据。
从此步骤开始,我们需要安装和配置AWS CLI v2。另一种选择是使用AWS CloudShell,它预安装了所有必要的工具,无需进行任何额外的配置。
- 要将文件上传到S3存储桶,请使用以下命令:
aws s3 cp lambda-github-workflow-trigger.zip s3://your-bucket/
现在我们为刚刚上传的lambda_function
相关的依赖项构建一个Lambda layer。
- 设置一个Python虚拟环境并安装依赖项:
mkdir lambda_layercd lambda_layerpython3 -m venv .envsource .env/bin/activatepip install pygithubdeactivate
- 使用以下命令生成.zip文件:
mv .env/lib/python3.9/site-packages/ pythonzip -r layer.zip python
- 将该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模板启用管理员访问权限后,请完成以下步骤:
- 在服务目录控制台上,导航到管理,选择组合。
- 选择创建新组合。
- 将组合命名为“SageMaker组织模板”。
- 将template.yml文件下载到您的计算机。
此Cloud Formation模板将提供我们所有需要的CI/CD资源作为配置和基础设施的代码。您可以详细研究模板,了解它作为其中一部分部署了哪些资源。此模板已根据GitHub和GitHub Actions进行了定制。
- 在
template.yml
文件中,将S3Bucket
值更改为您上传Lambda .zip文件的桶:
GitHubWorkflowTriggerLambda: ... Code: S3Bucket: <your-bucket> S3Key: lambda-github-workflow-trigger.zip ...
- 选择新组合。
- 选择上传新产品。
- 对于产品名称,输入您的模板名称。我们使用名称
build-deploy-github
。 - 对于描述,输入描述。
- 对于所有者,输入您的姓名。
- 在版本详细信息下,对于方法,选择使用模板文件。
- 选择上传模板。
- 上传您下载的模板。
- 对于版本标题,选择1.0。
- 选择审核。
- 审核您的设置,并选择创建产品。
- 选择刷新以列出新产品。
- 选择刚刚创建的产品。
- 在标签选项卡中,向产品添加以下标签:
- 键 =
sagemaker:studio-visibility
- 值 =
true
- 键 =
回到投资组合详情页面,您应该能看到类似以下截图(具有不同的ID)。
- 在约束选项卡中,选择创建约束。
- 对于产品,选择
build-deploy-github
(刚刚创建的产品)。 - 对于约束类型,选择启动。
- 在启动约束下,对于方法,选择选择IAM角色。
- 选择
AmazonSageMakerServiceCatalogProductsLaunchRole
。 - 选择创建。
- 在组、角色和用户选项卡中,选择添加组、角色、用户。
- 在角色选项卡中,选择您在配置SageMaker Studio域时使用的角色。这是SageMaker域角色的位置。
- 选择添加访问。
从SageMaker Studio部署项目
在前面的部分中,您准备了自定义MLOps项目环境。现在,让我们使用这个模板创建一个项目:
- 在SageMaker控制台上,导航到要创建此项目的域。
- 在启动菜单中,选择Studio。
您将被重定向到SageMaker Studio环境。
- 在SageMaker Studio中,在导航窗格下的部署中,选择项目。
- 选择创建项目。
- 在模板列表的顶部,选择组织模板。
如果您已经成功完成了之前的所有步骤,您应该能够看到一个名为Build-Deploy-GitHub
的新自定义项目模板。
- 选择该模板,然后选择选择项目模板。
- 输入可选描述。
- 对于GitHub仓库所有者名称,输入您的GitHub仓库的所有者。例如,如果您的仓库位于
https://github.com/pooyavahidi/my-repo
,则所有者将是pooyavahidi
。 - 对于GitHub仓库名称,输入您复制种子代码的存储库的名称。它只是仓库的名称。例如,在
https://github.com/pooyavahidi/my-repo
中,仓库是my-repo
。 - 对于CodeStar连接唯一ID,输入您创建的AWS CodeStar连接的唯一ID。
- 对于在Secrets Manager中存储GitHub令牌的秘密名称,输入您在Secrets Manager中创建和存储GitHub令牌的秘密名称。
- 对于用于部署的GitHub工作流文件,输入GitHub工作流文件的名称(位于
.github/workflows/deploy.yml
),其中包含部署说明。对于此示例,您可以保持默认值:deploy.yml
。 - 选择创建项目。
- 创建项目后,请确保根据您的需要更新 GitHub 工作流文件中的
AWS_REGION
和SAGEMAKER_PROJECT_NAME
环境变量。工作流文件位于您的 GitHub 存储库(从模板代码中复制的)的.github/workflows
目录中。请确保同时更新build.yml
和deploy.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 存储库。请随意尝试并在评论部分留下您可能遇到的任何疑问。