【Azure MLOps - 3】使用Azure DevOps建立训练模型的CI pipeline(上)

在上一篇【Azure MLOps - 2】使用Azure DevOps建立专案与连线设定,做完:
(1)在Azure DevOps建立专案
(2)为了能让DevOps agent执行AML上的各种步骤,而建立起来的service connection
接下来就要开始建立CI pipeline了!
本篇文章架构:

概念说明建立job与agent建立agent的任务1:agent测试Azure DevOps Repo上传的训练模型程式码执行任务

1.概念说明

上一篇有说明,其实CI pipeline做的每个任务都是由DevOps上的agent完成,在没有建立pipeline之前都是资料科学家透过手动在Azure Machine Learning上操作完成。
每次启动时,agent就会开始一步一步完成这个工作清单(pipeline)上的每个任务(tasks):
http://img2.58codes.com/2024/20154404tmKZ0L5BpX.png

所以建立CI pipeline的流程如下:

建立job与agent (本篇教学)建立agent的任务1:agent测试Azure DevOps Repo上传的训练模型程式码 (本篇教学)建立agent的任务2:测试成功后,将训练资料集(training dataset)注册至AML workspace (下篇教学)建立agent的任务3:使用「模型训练程式码」与「训练资料集」来训练模型 (下篇教学)建立agent的任务4:注册由「模型训练程式码」训练出来的模型(model.pkl) (下篇教学)

由于任务比较多,会分成上下两篇。

2.建立job与agent

选择上篇建立的专案,点选pipeline功能键的create pipeline:
http://img2.58codes.com/2024/201544047p4PTCH3g5.png

接下来选择pipeline code位置,有些状况是会直接把执行任务写成yaml file,不过这次要使用的方法是一个一个建立,所以点选最下方「Use the classic editor to create a pipeline without YAML.」:
http://img2.58codes.com/2024/20154404Mnq0R1evXN.png

上一篇也有说明,在这次的练习情境中,模拟资料科学家使用vscode开发、用Git来进行版本控管模型训练程式码。在自己的机器里(或者用AML的compute,Azure compute instance)测试完数次后,认为这次的训练程式码,可以commit,并push到Azure DevOps Repo上。
为了「一旦在Azure DevOps Repo上有新的commit,就会启动pipeline流程,自动开始使用新本版的程式码训练模型」,在「select source」选择Azure DevOps Repo,与对应的repo和branch:
http://img2.58codes.com/2024/20154404F4ZQOeOrgB.png

在choose template选择empty job:
http://img2.58codes.com/2024/20154404VW9qiGNsBm.png

给这个pipeline一个名字,我这里是填上:MLOps-Workshop-1-CI
然后agent pool下拉选单选择azure pool
agent specification 下拉选单选择ubuntu
这里说明一下,在后面建立agent的任务的时候,会需要到一些指令操控agent来执行,所以这里选择的specification,后面就要使用对应的指令语法~
http://img2.58codes.com/2024/201544048f9ZibHGow.png

设定pipeline触发条件,我们这个是CI pipeline,所以勾选Continuous integration,其他选项包含scheduled:可以按照特定时间自动启动这个pipeline,或是Build completion:当有其他任务或pipeline完成或产出。
http://img2.58codes.com/2024/20154404f4iXBDOO19.png

点选后,可以按一下储存,建议在建立pipeline的时候,每完成一个步骤都可以按一下储存:
http://img2.58codes.com/2024/20154404KhRgo7da4u.png

指定好储存pipeline的位置,如果选的save&queue代表:储存后要让agent开始执行pipeline。所以我们这里先按save就好:
http://img2.58codes.com/2024/201544041CKr7M2nK3.png

3.建立agent的任务1:agent测试Azure DevOps Repo上传的训练模型程式码

agent设定好了,pipeline触发条件也设定好了,接下来要让agent测试Azure DevOps Repo中的训练模型程式码。在本次练习情境中,当资料科学家改版了训练程式码 (train_aml.py),并且push到Azure DevOps repo上。为了确保后续在执行训练程式码 (train_aml.py)的时候,呼叫的function没有问题,所以agent的第一个任务是:执行测试程式码(train_test.py),如果执行成功,才会进到下一个任务:

测试程式码(train_test.py)位在Azure DevOps的training资料夹下:
http://img2.58codes.com/2024/20154404GJGSujhC3C.png

这个步骤其实是想要示範单元测试(unit test),当在pipeline当中执行正式的任务(训练模型)前,想要测试 train_aml.py这支主程式中呼叫的function。当测试程式码正确执行完成后 (train_test.py执行正确),再往下继续执行其他任务。这个单元测试并非非做不可,同样的道理,很可能你也会想做更多测试,那也可以插入更多的测试任务。

3-1 指定agent的python版本

回到task的地方,点选+为这个agent新增一个任务:
http://img2.58codes.com/2024/20154404ExZBdtThQZ.png

因为需要在agent当中运行「测试程式码(train_test.py)」,第一件事要先指定使用版的版本,这里使用的是version 3.6 (需要和train_test.py使用的python版本相符)。在搜寻框中输入:python后,点选add,就会在agent底下新增一个新任务啰:
http://img2.58codes.com/2024/2015440421rqKn5Ohm.png

版本version spec输入3.6,这个任务名称输入:「use python 3.6」后,帮助在左边任务列表里看得更清楚:
http://img2.58codes.com/2024/20154404b7lFwSMUcj.png

3-2 在agent当中安装必要套件

刚才说我们要让agent执行「测试程式码(train_test.py)」script,所以必须要让agent也拥有「执行script里所需的必要套件」,必要套件的资讯也在Azure DevOps Repo里了,就在package_requirement资料夹下的requirements.txt档案中:
http://img2.58codes.com/2024/20154404hEK9HKmsdG.png

为了要让agent安装好这些必要套件,在agent中执行**「pip install 套件」**指令,範例程式码很贴心,已经写成一个sh档案了,档案名称为install_requirements.sh:
http://img2.58codes.com/2024/20154404xjvAIZ7wug.png

所以接下来的要新增的任务是:「让agent执行install_requirements.sh」,然后完成pip install -r requirements.txt所有套件安装;点选agent旁边的+,搜寻bash(因为我们的install_requirements.sh是bash指令),然后点选Bash:
http://img2.58codes.com/2024/201544045a9fGhAa9d.png

把这个任务取名叫做「install python requirements」,任务列表就可以看到这个任务名称了。我们要执行的是install_requirements.sh,所以在Script Path当中选择package_requirement/install_requirements.sh。
其实你可以看到蓝色框框的地方显示,Target script type有两个选择,如果选择inline的话,就是当没有sh档的时候,也可以直接输入执行的指令。因为我们有sh档,所以就选file path (sh档案的位置):
http://img2.58codes.com/2024/201544043NjdzA38ls.png

往下捲动后,选择「工作目录」。就是sh档所在的资料夹(目录),【3-2 在agent当中安装必要套件】就完成啰!
http://img2.58codes.com/2024/20154404B5eQx9pHup.png

3-3 agent执行data test

前两个步骤agent已经知道自己要执行的「测试程式码(train_test.py)」是3.6版本,也安装好「测试程式码(train_test.py)」当中所需要的所有套件,接下来新增的任务终于是执行「测试程式码(train_test.py)」档了!

和前一步骤相同,一样点选agent旁边的+,搜寻bash后,加入任务,并把该任务改名成data test(任务名称随意,你看的懂就好),在左侧的任务列表就可以看到啰,执行「测试程式码(train_test.py)」事先没有準备好sh档,所以点选inline:
http://img2.58codes.com/2024/20154404Hly1J51xnN.png

直接在下方框格当中输入要执行的bash指令:

pytest training/train_test.py --doctest-modules --junitxml=junit/test-results.xml --cov=data_test--cov-report=xml--cov-report=html

这个指令的大意是说使用pytest执行training目录下的train_test.py档,后面参数设设定是测试结果产出报告形式,执行这个程式码后就可以把测试结果生成报告,如果想要进一步了解Pytest功能和参数,可以看一下这篇教学文pytest-cov 的简单应用

因为是inline执行pytest指令,所以就不需要指定工作目录了,完成!
http://img2.58codes.com/2024/20154404umEGRmbdxO.png

3-4 把执行结果发布成报告

前一个安排的测试任务,agent执行之后,要产出一个测试报告供纪录。虽然说可能每次执行job pipeline的时候,执行过程也会被记录下来,不过这些纪录好像在30天后会被删除,所以如果能够发布成报告是比较好追蹤的型式,就看你对于这个测试有多需要详实纪录,再次强调这些任务要怎么安排都是看专案需求而定。

点选agent的旁边的+,新增任务,搜寻「publish test」,点选add:
http://img2.58codes.com/2024/20154404jgEV36Ft94.png

本次示範如下
任务名称取名为:Publish Test Results **/test-*.xml,报告格式输入JUnit,输出报告名称**/test-*.xml(所以发布的报告档名都会以test-为开头)
http://img2.58codes.com/2024/20154404qSC3zWpzkU.png

如果想要「不管测试任务成功或失败,都有报告产出」,往下捲,在【Control Options】的Run this task点选「Even if a previous task has failed, unless the build was canceled」:
http://img2.58codes.com/2024/20154404c0JdCxlyxB.png

4. 执行任务

恭喜大家完成CI pipeline上半部设定,先来看一下执行效果如何(你也可以继续做下一篇的内容,往下建立任务),接下来点选save&queue
http://img2.58codes.com/2024/20154404FU5gY1f8JS.png

点选pipeline的这个run (每一次run,都会有一个独立的run ID),往下拉,会看到job下会有Agent job 1蓝色转圈圈正在执行的画面:
http://img2.58codes.com/2024/20154404ZyADkHSl3p.png

点选之后,就可以看到这只Agent正在执行的每个步骤,如果成功的话,就可以看到绿色勾勾,红色叉叉就是失败(示意图如下),每个task都可以看到执行的过程,如果出现叉叉可以按照上面的error code进行除错:
http://img2.58codes.com/2024/20154404qT0yFmEYZ1.png

如果都执行成功,就会出现绿色勾勾。最后一个任务发布报告,也成功发布了:
http://img2.58codes.com/2024/20154404tqKbw5Ykeu.png

可以在左侧功能键的test plan下,点选test run,找到run ID,检视报告:
http://img2.58codes.com/2024/201544049XcLdBI28q.png

所以本篇的CI pipeline上的新增任务如下
http://img2.58codes.com/2024/201544049rfqKFIGtx.png

下一篇【Azure MLOps - 4】使用Azure DevOps建立训练模型的CI pipeline(下)


关于作者: 网站小编

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

热门文章