关于分析:通过Amazon-SageMaker与Amazon-Step-Functions实现机器学习的CICD-方案

10次阅读

共计 8299 个字符,预计需要花费 21 分钟才能阅读完成。

在传统的机器学习工作流程当中,常常会面临两个问题:

(1)数据迭代迅速,须要定期对模型进行从新训练,每次训练实现后,都须要重新部署模型,如何实现训练与部署过程的的自动化,从而晋升工作效率;

(2)算法团队一直地对算法进行开发与变更,并且须要尝试不同的特色工程,每次变更都须要做单元测试,如何将 Amazon SageMaker 与 CI/CD 工具整合,在晋升开发效率的同时缩小运维团队的工作累赘。本文会介绍通过 Amazon SageMaker 与 Amazon Step Functions 进行模型主动训练与部署的办法,并会与 Amazon CodeCommit、Amazon CodeBuild、Jenkins 集成,实现机器学习的 CI/CD 计划。

相干技术介绍

在开始之前,请先对以下技术进行简略理解。

1.1 Amazon SageMaker

Amazon SageMaker 是一项齐全托管的机器学习 PaaS 平台,它提供的性能残缺的笼罩了整个机器学习生命周期。并且您不须要对用于训练和推理的实例进行保护,只须要依据工作负载指定相应的机型与数量即可,通过简略的 API 进行模型的一键训练与部署。

1.2 Amazon Step Functions

Amazon Step Functions 是一项云原生的 workflow 编排工具,在创立时不须要配置基础设施,只须要在工作流程当中指定要执行的步骤即可。Amazon Step Functions 为开发者提供了 数据迷信开发工具包,并且曾经与 Amazon SageMaker 进行了集成,开发者能够通过面向对象编程的形式在 workflow 中定义 Amazon SageMaker 的步骤,因而能够将模型训练与部署的过程自动化。

1.3 Amazon CodeCommit 与 Amazon CodeBuild

Amazon CodeCommit 与 Amazon CodeBuild 是 Amazon CI/CD 系列当中的两个重要服务,Amazon CodeCommit 是一项齐全托管的代码仓库服务,能够提供给用户近乎有限的代码存储空间,在应用习惯上和规范的 git 工具没有差别。Amazon CodeBuild 可编译源代码,运行单元测试,并构建可供部署的我的项目,并且也无需预置、治理和扩大本人的构建服务器,能够在构建申请顶峰时实现主动扩大。

1.4 Jenkins

Jenkins 是一个自蕴含的开源自动化服务器,可用于自动化与构建,测试以及交付或部署软件无关的各种工作。它的开源社区十分沉闷,整合了 1000 多种插件,为 CI/CD 的过程提供了极大的灵活性,并且也能够与 Amazon Code 系列集成,使得开发者能够轻松的集成两者的劣势。

演练

2.1 流程架构图与过程简介

(1)在一台 Amazon EC2 上装置 Jenkins,配置好与 Amazon CodeCommit、Amazon CodeBuild 集成的插件;

(2)开发人员 push 代码到 Amazon CodeCommit 后触发 Jenkins pipeline,代码在 Amazon CodeBuild 中封装成 docker image,并推送到 ECR 当中(注:在本试验中,为了不便在 CI/CD 过程中对代码版本进行管制,会通过 BYOC 的形式在 Amazon SageMaker 中应用自定义算法,该形式须要本人编写 Dockerfile 并将算法 build 为 docker image,而后上传到 ECR 当中,具体介绍可参考 将您的算法或模型与 Amazon SageMaker 联合应用);

(3)触发 Amazon  Step Functions 执行 Amazon SageMaker 训练与部署的步骤;

(4)Amazon SageMaker 从 ECR 中加载 docker image 与 Amazon S3 中的数据进行训练;

(5)训练实现后对模型进行部署,裸露供推理应用的 endpoint。

2.2 前提条件

(1)本文示例所应用的区域为 us-east-1;

(2)在该区域应用 Ubuntu 18.04 的 AMI 创立一台 Amazon EC2,并确保与其绑定的 IAM Role 有 AdministratorAccess 权限,平安组放开 8080 端口供 Jenkins web 应用,后续章节有装置 Jenkins 的具体步骤;

(3)为了模仿用户的开发环境,请先在本地或近程服务器配置好 git 工具与 y 与亚马逊云科技的 credentials,并确定其领有 AdministratorAccess 权限。

2.3 实现过程

(1)在 Amazon Step Functions 中定义应用 Amazon SageMaker 训练与部署模型的步骤

(2)关上 IAM console,找到 Amazon SageMaker 主动创立的新角色,增加 AdministratorAccess 权限;

(3)在 Terminal 中执行命令:

git clone https://github.com/micxyj/awsblog-lab-guide.git

(4)进入下载好的文件夹,执行 unzip package.zip 命令进行解压,待解压实现后在 Jupyter notebook 左侧的工作目录中关上 sfn_deploy_byoc.ipynb 文件;

(5)依照该 notebook 中的步骤执行一遍即可;

(6)执行实现后,关上 Amazon Step Functions 控制台,会看到多出一个状态机,如下图所示:

2.3.2 在 Amazon EC2 上装置 Jenkins

在本试验中,Jenkins 只用来提供 pipeline 的作用,构建编译的步骤全副会由 CodeBuild 来实现。

(1)登陆 Amazon EC2,装置 Java 环境;

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install openjdk-8-jdk -y

(2)依据 Jenkins 官网文档装置 Jenkins 2.235 版本;

(3)装置实现后,执行下列命令,记下初始密码;

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

(4)在浏览器输出 Jenkins server 的 URL,输出上一步的初始密码并点击 Continue;

(5)抉择 Install suggested plugins 并期待插件装置实现;

(6)配置 Admin User 并抉择 Save and Continue,接下来的步骤放弃默认并点击持续实现配置;

(7)在 Jenkins 服务器上切换到 jenkins 用户,并配置后续实验所需的依赖包。

sudo su -
sudo vim /etc/sudoers
# 在文件中的 User privilege specification 下增加一行:jenkins ALL=(ALL) NOPASSWD: ALL,而后保留并敞开文件
su jenkins
sudo apt install python3-pip
pip3 install awscli --upgrade --user
vim ~/.bashrc
# 在文件中增加一行 python 门路:export PATH=$HOME/.local/bin:$PATH,而后保留并敞开文件
source ~/.bashrc
# 命令行输出 aws configure,不须要设置 access id 与 access key,在 Default region name 配置中输出 us-east- 1 即可

* 左右滑动查看更多

2.3.3 创立 Amazon CodeCommit 与 Amazon CodeBuild

(1)关上 CodeCommit 控制台,点击创立存储库;

(2)输出存储库名称并点击创立;

(3)进入到 IAM 控制台中,抉择并配置本地环境应用的 iam user 的 Amazon CodeCommit HTTPS Git 凭证;

点击生成凭证后将凭证下载到本地,供试验后续应用

(4)回到 CodeCommit 控制台,抉择第二步中创立好的存储库,克隆 HTTPS URL,在本地执行 git clone;

个别第一次执行 git clone 会要求用户输出 Amazon CodeCommit HTTPS Git 的凭证,关上上一步下载好的凭证,输出用户名与明码即可,如果有报错,请查问CodeCommit 问题排查

(5)从 github 上下载实验所需代码到本地,并上传到 CodeCommit 的代码仓库;

git clone https://github.com/micxyj/ml-ops.git
cp -r ml-ops/* ml-ops-codecommit
cd ml-ops-codecommit
git add .
git commit -m 'update'
git push

push 胜利之后,回到 CodeCommit 控制台,关上存储库,发现代码曾经上传实现;

在 cifar10 文件夹中蕴含了应用 tensorflow 对 cifar-10 数据集进行训练与创立 tersorflow serving 的代码,会通过 Dockerfile 文件与 build_and_push.sh 打包封装成 docker image 并上传到 ECR 当中,上传实现后会执行 invoke_sfn.py 脚本,运行曾经定义好的 Amazon Step Functions 状态机,从而实现 Amazon SageMaker 训练与部署的过程。

(6)关上 Amazon CodeBuild 控制台,依照下述信息创立我的项目;

Buildspec 中定义的代码即为在构建编译过程中所须要执行的命令,能够把该过程了解为:

1)下载执行脚本所需的依赖包 boto3;

2)执行 build_and_push.sh 脚本将算法封装成 docker image 并上传到 ECR;

3)执行 invoke_sfn.py 脚本,触发 Step Functions 状态机进行模型的训练与部署。在 build commands 下复制粘贴以下代码:

- pip install boto3
- chmod 777 build_and_push.sh
- ./build_and_push.sh sagemaker-tf-cifar10-example
- python invoke_sfn.py

其余配置放弃默认即可,点击创立构建我的项目。

(7)关上 iam role 的控制台,赋予 codebuild-ml-ops-service-role 角色 Amazon EC2 ContainerRegistryFullAccess 与 Amazon StepFunctionsFullAccess 的权限;

2.3.4 将 Amazon CodeCommit、Amazon CodeBuild 与 Jenkins 集成

(1)关上 jenkins web 页面,下载与 Amazon CodeCommit、Amazon CodeBuild 集成的相干插件;

(2)搜寻 Amazon CodeCommit Trigger 与 Amazon CodeBuild 插件并装置,装置实现之后点击 restart;

(3)配置 Amazon CodeCommit Trigger 插件;

Amazon CodeCommit Trigger插件须要通过 SQS 与 SNS 来实现 webhook 的性能(即 push 代码到 CodeCommit 之后,触发 Jenkins Pipeline),因而须要先对 SQS 与 SNS 进行配置。

创立一个新的 SNS 主题并输出名称。

将以下 json 代码复制到拜访策略当中,将 your_account_id 与 your_sns_name 替换为你的账户 id 和 SNS 名称,其余配置放弃不变并点击创立主题。

{

  "Version": "2008-10-17",

  "Id": "__default_policy_ID",

  "Statement": [

    {

      "Sid": "__default_statement_ID",

      "Effect": "Allow",

      "Principal": {"AWS": "*"},

      "Action": [

        "SNS:Publish",

        "SNS:RemovePermission",

        "SNS:SetTopicAttributes",

        "SNS:DeleteTopic",

        "SNS:ListSubscriptionsByTopic",

        "SNS:GetTopicAttributes",

        "SNS:Receive",

        "SNS:AddPermission",

        "SNS:Subscribe"

      ],

      "Resource": "arn:aws:sns:us-east-1:your_account_id:your_sns_name",

      "Condition": {

        "StringEquals": {"AWS:SourceOwner": "your_account_id"}

      }

    }

  ]

}

* 左右滑动查看更多

关上 CodeCommit 控制台,配置触发器,按图中信息进行配置,抉择刚刚创立好的 SNS 主题后点击创立触发器。

关上 SQS 控制台,创立 SQS 队列并输出名称。

复制以下 json 代码到拜访策略当中,将 your_account_id、your_sqs_name、your_sns_name 替换为相应的信息,其余配置放弃不变并点击创立。

{

  "Version": "2012-10-17",

  "Id": "arn:aws:sqs:us-east-1:your_account_id:your_sqs_name/SQSDefaultPolicy",

  "Statement": [

    {

      "Effect": "Allow",

      "Principal": {"Service": "sns.amazonaws.com"},

      "Action": "sqs:SendMessage",

      "Resource": "arn:aws:sqs:us-east-1:your_account_id:your_sqs_name",

      "Condition": {

        "ArnEquals": {"aws:SourceArn": "arn:aws:sns:us-east-1:your_account_id:your_sns_name"}

      }

    }

  ]

}

* 左右滑动查看更多

点击订阅 SNS 主题,抉择之前创立好的 SNS 主题 ARN 后保留即可。

关上 Jenkins web 页面,点击系统配置。

下拉到 Amazon Code Commit Trigger SQS Plugin 栏目,首先增加亚马逊云科技的 credentials,应用具备 AdministratorAccess 权限的 iam user 即可。

增加实现 credentials 之后,抉择刚创立好的 credentials、正确的 region(us-east-1)与之前创立好的 sqs 队列,点击 Test access,返回 successful 则示意配置正确,最初点击 save。

(4)创立 Jenkins Item;

输出名称 ml-ops-pipeline 并抉择 Pipeline。

在 Pipeline 中的 Build Triggers 栏目,勾选“Build when a CodeCommit repository is updated and notifies a SQS queue”,点击“Manually enter CodeCommit URL and branches”,在“Code commit repository URL”处输出 Amazon CodeCommit 代码仓库的 Git URL。

下拉到 Pipeline 栏目,在“Definition”中抉择“Pipeline script from SCM”,在“SCM”中抉择“Git”。

点击“Credentials”旁的“add”按钮,抉择 Jenkins,将弹出如下页面,输出为 Amazon CodeCommit 的 Git credentials(其中 Username 与 Password 都在 2.3.3 章节提到的 Git 凭证中):

增加实现之后,输出 Amazon CodeCommit 代码仓库的 Git URL 与刚创立好的 Credentials。

其余配置放弃默认选项,点击 Save。

展现

(1)关上下载到本地的 Amazon CodeCommit 近程仓库代码文件夹,关上 invoke_sfn.py 文件,将 your_account_id 与 your_step_functions_name 别离替换为你的账户 id 与之前执行 notebook 后生成的 Amazon Step Functions 状态机的名称;

(2)关上 Jenkinsfile,将 your_project_name 替换为你的 CodeBuild 项目名称,从代码中能够看出,Jenkins 装置实现 Amazon CodeBuild 插件之后,就能够以常见的 Groovy 语法定义须要执行的 step,触发 Amazon CodeBuild 执行相应的构建编译的过程,因而,Jenkins 在这里只起到调度的作用,编译构建的负载全副交给 Amazon CodeBuild 来实现,用户并不需要预置底层资源;

(3)此时代码曾经产生了变更,push 代码到 Amazon Codecommit 当中,触发整个 CI/CD 的流程;

(4)查看 Amazon CodeBuild 的构建日志,工作正在执行,因为 Jenkins 装置了 Amazon CodeBuild 的插件,也能够在 Jenkins 的 console 上看到雷同的日志输入,能够利用这一机制,在 Jenkins 上对构建过程的输入进行对立监控治理;

(5)待 Amazon CodeBuild 将 docker image 上传到 ECR 之后,会执行 buildspec 中第二个步骤,触发 Amazon Step Functions,关上 Amazon Step Functions 与 Amazon SageMaker 训练任务的界面,能够看到 Amazon SageMaker 训练过程正在执行;

(6)待状态机中部署的过程执行实现,关上 Amazon SageMaker 的终端节点界面,能够看到终端节点正在创立过程当中,待创立实现之后,就能够用于推理。

总结

本文介绍了如何利用 Amazon Step Functions 定义 Amazon SageMaker 中训练与部署的过程,当模型须要从新训练时,能够间接触发 Amazon Step Functions 中定义好的状态机,从而缩小运维人员反复工作;当算法或特色工程代码产生变更时,须要思考如何实现 MLOps,亚马逊云科技的 Code 系列能够轻松和开源的工具集成,开发者能够利用到两者的劣势,比方能够应用 Jenkins 提供的多种插件,并且在编译构建的过程中应用 Amazon CodeBuild,将工作高峰期扩大资源的工作交给亚马逊云科技主动实现。本文通过上述两个场景实现机器学习的 CI/CD 过程,从而进一步晋升算法工程师的开发效率,缩小运维团队的工作累赘。

参考资料

[1] Automating model retraining and deployment using the Amazon Step Functions Data Science SDK for Amazon SageMaker

[2] Automated and continuous deployment of Amazon SageMaker models with Amazon Step Functions

[3] 将 Amazon CodeBuild 与 Jenkins 联合应用

[4] Building your own TensorFlow container

[5] Continuous Delivery for Machine Learning

本篇作者


肖元君
亚马逊云科技解决方案架构师
负责基于亚马逊云科技云计算计划的架构征询和设计实现,同时致力于数据分析与人工智能的钻研与利用


金忠敏
亚马逊云科技解决方案架构师
当初专一于云计算解决方案和架构的工作。具备超过 15 年的 IT 从业教训,曾从事软件开发,售后反对,零碎交付,售前等工作。参加过很多大型项目架构设计和施行交付


Pan Xiankun
亚马逊云科技解决方案架构师

正文完
 0