【Azure MLOps - 7】建立CD pipeline:把机器学习模型部署到production area

本次建立的CD pipeline中,会有两个部分:
(1)模型自动部署到测试环境(staging area) (上篇文章)
(2)模型自动部署到正式环境(production area) (本篇文章)
而这两个部分中间,并不会连续,中间会插入一个核准的关卡。

http://img2.58codes.com/2024/20154404pyX7jHpV49.png

因为第一部分几乎和第二部分一模一样,所以本篇文章会较为简短,如果想要详细了解,必须回去阅读上一篇!
CD pipeline文章:
【Azure MLOps - 6】建立CD pipeline:把机器学习模型部署到staging area

本篇文章结构:

概念说明建立agent的任务设定核准关卡试跑第二部分CD pipeline

CI pipeline文章:
【Azure MLOps - 1】使用Azure DevOps建立AML pipelines
【Azure MLOps - 2】使用Azure DevOps建立专案与连线设定
【Azure MLOps - 3】使用Azure DevOps建立训练模型的CI pipeline(上)
【Azure MLOps - 4】使用Azure DevOps建立训练模型的CI pipeline(下)
【Azure MLOps - 5】执行Azure DevOps CI pipeline

1. 概念说明

「部署到正式环境」agent执行的任务,都和前一篇「部署到测试环境」的任务几乎一样,差别在于部署到AKS,而不是ACI (Azure compute instance)。不过因为我这次练习时候,使用的是Azure试用帐户,不能建立AKS,所以这里只能示範建立自动部署到AKS的pipeline,执行的时候会报错。

2.建立agent的任务

2-1 建立新的stage与设定agent

回到上一篇CD pipeline的画面,点选Add:
http://img2.58codes.com/2024/20154404iv0xyk5Mud.png

一样点选empty job之后,改名称:Deploy to Prod
http://img2.58codes.com/2024/20154404nwIKZm24vZ.png

和之前一样设定好agent,如果不知道这是什么意思的,可以参阅这个系列的前几篇文章,有详细解说:
http://img2.58codes.com/2024/201544041XJFvKT6nd.png

2-2 agent任务:安装az ml extension

由于后续会在agent里面测试「部署到正式环境的api是否可以呼叫并预测」,而测试使用的程式码是prod_test.py (位在【pipeline published artifact区域】)如下图,所以我们需要指定agent python版本。
http://img2.58codes.com/2024/201544043Nd47Shj48.png

点击agent旁边的+,搜寻python,加入use python任务,指定python版本:
http://img2.58codes.com/2024/20154404R0jjuEuBHW.png

与CI pipeline & 第一部分CD pipeline相同,需要再agent安装az ml extension,才有办法使用指令使用Azure Machine Learning各种功能。所以点击agent旁边的+,搜寻Azure CLI,加入任务:
http://img2.58codes.com/2024/20154404CYqTfpOmct.png

az extension add -n azure-cli-ml

2-3 agent任务:在AML新增Azure Kubernetes Service (AKS)

接下来我们希望模型部署到container上,下一个任务新增Azure Kubernetes Service (AKS)。
因为要使用az ml cli指令新增AKS compute,点击agent旁边的+,搜寻Azure CLI,加入任务,命名为:Create AKS。AKS和ACI不同,多了这个任务。
http://img2.58codes.com/2024/20154404jWIokc4uO9.png

使用az ml computetarget create aks指令建立AKS,inline script填入:

az ml computetarget create aks -g $(azureml.resourceGroup) -w $(azureml.workspaceName) -n $(aks.clusterName) -s $(aks.vmSize) -a $(aks.agentCount)

详细的参数设定可参阅官方文件,在Azure Machine Learning compute中使用UI页面建立AKS compute所需要选择的设定参数,在指令中也会需要相同的参数。

接下来设定$()名称变数的Name & value:
http://img2.58codes.com/2024/201544044AFzT5ewzl.png

aks.clusterName aksaks.vmSize Standard_B4ms (机器规格)aks.agentCount 3Service.name.prod  insurance-service-aks (service名称,下一步骤会用到)

2-4 agent任务:部署模型到Azure Kubernetes Service (AKS)

接下来我们希望模型部署AKS上,下一个任务把模型部署到刚刚创立的Azure Kubernetes Service (AKS)。
因为要使用az ml cli指令部署模型,点击agent旁边的+,搜寻Azure CLI,加入任务,命名为Deploy to AKS:
内容就跟上一篇几乎一样~

http://img2.58codes.com/2024/20154404g6c4kGXQqc.png

使用指令:az ml model deploy进行部署,指令的详细参数可参阅官方说明:

az ml model deploy -g $(azureml.resourceGroup) -w $(azureml.workspaceName) -n $(service.name.prod) -f ../metadata/model.json --dc aksDeploymentConfigProd.yml --ic inferenceConfig.yml --ct $(aks.clusterName) --overwrite

提醒大家使用Azure Machine Learning部署,需要以下两个要素,
(1)model
(2)Inferencing and deployment configuration (Compute target+Environment+Scoring scripts)

model很简单理解,就是model.pkl,我们也已经複製到【pipeline published artifact区域】。
而另外一个要素,「Inferencing and deployment configuration」又由3个元素组成:
(1)Compute target
(2)Environment
(3)Scoring scripts
也就是模型在部署和推断(预测)的时候需要的configuration,稍微说明:
(1)compute target就是模型吃的运算资源,所以staging area就会是ACI,production area就会是AKS,所以用Azure CLI指令进行模型部署的时候,会需要进行AKS configuration。也就是上面指令的参数--dc所指定的档案: aksDeploymentConfigProd.yml

(2)Environment则是机器学习模型「在预测的时候」会需要什么环境,例如模型需要sklean,python3.7。也就是上面指令的--ic参数:inferenceConfig.yml

(3)scoring.py就是产出预测结果的程式,里面有两个功能,一个是把model load 到ACI的功能init function,另一个是进行预测的run function:

这些档案位在【pipeline published artifact区域】中:
http://img2.58codes.com/2024/201544041gt4Jv1Wx6.png

所以需要指定工作目录,下拉选单/_MLOps-WorkShop-1-CI/landing/s/deployment:
http://img2.58codes.com/2024/201544049RPdB17Hvm.png

2-5 agent任务:测试endpoint

接下来的步骤也和上一篇部署到测试区的任务一样。
如果正式启动pipeline,agent执行完2-4 agent任务后,会在Azure Machine Learning的endpoint产生一个叫做insurance-service-aks的web service,点进去之后会有一个endpoint url。(上一篇有示意图在2-4步骤)

以往资料科学家会手动测试endpoint url是否能正确被呼叫,并且回吐预测结果,确保endpoint部署成功,在pipeline中也会需要这个测试任务,建立一个agent任务代替手动执行。

测试endpoit的程式码: prod_test.py 一样位在【pipeline published artifact区域】,测试程式档中,会执行「传入特徵值(json格式)给endpoint」:
http://img2.58codes.com/2024/20154404DlV8Y6lQRx.png

要在agent当中执行prod_test.py,就需要先把程式当中需要的套件安装好,所以一样会需要在agent执行安装指令(与CI pipeline一样,可以回去複习)。增加一个bash task,执行install_requirements.sh:
(install_requirements.sh在_MLOps-WorkShop-1-CI/landing/s/package_requirement/)
http://img2.58codes.com/2024/201544040oXlLzvx5A.png

接下来新增一个Azure CLI任务,取名为「Prod Test」,执行pytest,pytest解释详见之前在建立CI pipeline的解说:
http://img2.58codes.com/2024/20154404YhVB6YI30H.png

在inline script当中输入:

pytest prod_test.py --doctest-modules --junitxml=junit/test-results.xml --cov=integration --cov-report=xml --cov-report=html --scoreurl $(az ml service show -g $(azureml.resourceGroup) -w $(azureml.workspaceName) -n $(service.name.prod) --query scoringUri -o tsv) --scorekey $(az ml service get-keys -g $(azureml.resourceGroup) -w $(azureml.workspaceName) -n $(service.name.prod) --query primarykey -o tsv)

说明一下,agent要测试的endpoint url需要由--scoreurl参数带入,az ml service show指令可以吐出部署的service detail,但我们只需要url资讯,所以az ml service show后面会有--query scoringUri参数。
其他细节请查阅官方文件。

prod_test.py档案位在【pipeline published artifact区域】/_MLOps-WorkShop-1-CI/landing/s/tests/integration,所以往下捲动,设定工作目录:
http://img2.58codes.com/2024/201544047CvlACYE65.png

2-6 agent任务:发布endpoint测试结果

前一步骤使用pytest测试,并产出report,新增一个任务把这些报告发布到Azure DevOps中。搜寻publish result,add后修改名称Publish Prod Test Results。前一个步骤有设定pytest报告的档名都叫做test-,所以Test results files填入:**/test-*.xml
http://img2.58codes.com/2024/201544040bb0qFyfqk.png

CD pipeline的第二部分:模型自动部署到测试环境(Prod area),也完成啰~

3. 设定核准关卡

触发CD pipeline的第二部分:模型自动部署到正式环境(production area)的条件是被「核准」,情境假设是开发团队想要观察模型表现一阵子,确认新模型的预测结果是否比旧版模型好,才会上到正式环境。

回到pipeline主页,点选闪电,select trigger,选择after stage。还有其他的选项,像是Manual only好像也可以,不过我们这里选择after stage,stage选择Pre-deployment approvals,意思就是在前一个staging area deployment结束后,需被核准后才触发。
http://img2.58codes.com/2024/20154404DnQ14fUiGv.png

开启Pre-deployment approvals,选择核准对象(很可能是你们的部门主管或团队leader),还有其他更精细的条件比方说超过几天等待核准都没有回音,就会失效。核准者我先填入自己的e-mail,到时候整条pipeline运作的时候,前一个staging area deployment结束后,我会收到一封信请我核准pord area deployment:
http://img2.58codes.com/2024/20154404VrIcSPQ5xD.png

4. 试跑第二部分CD pipeline

虽然我们设定好触发条件,不过在真的让他自动触发前,还是先执行一次这个pipeline看看,点选页面右上方的create release:
http://img2.58codes.com/2024/20154404CSg21OEtmS.png

可以看到整条pipeline开始执行:
http://img2.58codes.com/2024/20154404w9VueOrIjE.png

过了几分钟,staging area完成之后,可以看到pipeline并没有直接没有往下,会需要approver的核准:
http://img2.58codes.com/2024/20154404vLK35X1JhZ.png

approver会收到一封email,要求approver上Devop检查pipeline是否要核准「Deploy to prod」的stage,点选view approval,会导到Azure DevOps:
http://img2.58codes.com/2024/20154404EHfdDlsi4O.png

核准者可以看一下是否要核準,点选approve:
http://img2.58codes.com/2024/20154404V3J3LEYOFJ.png

可以写下评语或回馈,如果要核准就点选approve,如果觉得还不能进到正式环境,就点选reject。点选approve,就会开始进行部署到正式环境的pipeline啰:
http://img2.58codes.com/2024/20154404x7MrdoCk9B.png

如果你跟我一样也是使用Azure试用帐号,会遇到无法新增的AKS的状况。
http://img2.58codes.com/2024/20154404PRzaBpK478.png

所以在后续的示範,「第二部分:模型自动部署到正式环境」我也部署到ACI以测试流程是否成功。下一篇来测试使用整条CI/CD pipeline流程吧!

最终篇【Azure MLOps - 最终篇】END TO END CI/CD MLOPS


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章