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

(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 updatesudo apt-get upgrade -ysudo 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 jenkinssudo apt install python3-pippip3 install awscli --upgrade --uservim ~/.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.gitcp -r ml-ops/* ml-ops-codecommitcd ml-ops-codecommitgit 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
亚马逊云科技解决方案架构师