在上一篇【Azure MLOps - 2】使用Azure DevOps建立专案与连线设定,做完:
(1)在Azure DevOps建立专案
(2)为了能让DevOps agent执行AML上的各种步骤,而建立起来的service connection
接下来就要开始建立CI pipeline了!
本篇文章架构:
1.概念说明
上一篇有说明,其实CI pipeline做的每个任务都是由DevOps上的agent完成,在没有建立pipeline之前都是资料科学家透过手动在Azure Machine Learning上操作完成。
每次启动时,agent就会开始一步一步完成这个工作清单(pipeline)上的每个任务(tasks):
所以建立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:
接下来选择pipeline code位置,有些状况是会直接把执行任务写成yaml file,不过这次要使用的方法是一个一个建立,所以点选最下方「Use the classic editor to create a pipeline without YAML.」:
上一篇也有说明,在这次的练习情境中,模拟资料科学家使用vscode开发、用Git来进行版本控管模型训练程式码。在自己的机器里(或者用AML的compute,Azure compute instance)测试完数次后,认为这次的训练程式码,可以commit,并push到Azure DevOps Repo上。
为了「一旦在Azure DevOps Repo上有新的commit,就会启动pipeline流程,自动开始使用新本版的程式码训练模型」,在「select source」选择Azure DevOps Repo,与对应的repo和branch:
在choose template选择empty job:
给这个pipeline一个名字,我这里是填上:MLOps-Workshop-1-CI
然后agent pool下拉选单选择azure pool
agent specification 下拉选单选择ubuntu
这里说明一下,在后面建立agent的任务的时候,会需要到一些指令操控agent来执行,所以这里选择的specification,后面就要使用对应的指令语法~
设定pipeline触发条件,我们这个是CI pipeline,所以勾选Continuous integration,其他选项包含scheduled:可以按照特定时间自动启动这个pipeline,或是Build completion:当有其他任务或pipeline完成或产出。
点选后,可以按一下储存,建议在建立pipeline的时候,每完成一个步骤都可以按一下储存:
指定好储存pipeline的位置,如果选的save&queue代表:储存后要让agent开始执行pipeline。所以我们这里先按save就好:
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资料夹下:
这个步骤其实是想要示範单元测试(unit test),当在pipeline当中执行正式的任务(训练模型)前,想要测试 train_aml.py这支主程式中呼叫的function。当测试程式码正确执行完成后 (train_test.py执行正确),再往下继续执行其他任务。这个单元测试并非非做不可,同样的道理,很可能你也会想做更多测试,那也可以插入更多的测试任务。
3-1 指定agent的python版本
回到task的地方,点选+为这个agent新增一个任务:
因为需要在agent当中运行「测试程式码(train_test.py)」,第一件事要先指定使用版的版本,这里使用的是version 3.6 (需要和train_test.py使用的python版本相符)。在搜寻框中输入:python后,点选add,就会在agent底下新增一个新任务啰:
版本version spec输入3.6,这个任务名称输入:「use python 3.6」后,帮助在左边任务列表里看得更清楚:
3-2 在agent当中安装必要套件
刚才说我们要让agent执行「测试程式码(train_test.py)」script,所以必须要让agent也拥有「执行script里所需的必要套件」,必要套件的资讯也在Azure DevOps Repo里了,就在package_requirement资料夹下的requirements.txt档案中:
为了要让agent安装好这些必要套件,在agent中执行**「pip install 套件」**指令,範例程式码很贴心,已经写成一个sh档案了,档案名称为install_requirements.sh:
所以接下来的要新增的任务是:「让agent执行install_requirements.sh」,然后完成pip install -r requirements.txt所有套件安装;点选agent旁边的+,搜寻bash(因为我们的install_requirements.sh是bash指令),然后点选Bash:
把这个任务取名叫做「install python requirements」,任务列表就可以看到这个任务名称了。我们要执行的是install_requirements.sh,所以在Script Path当中选择package_requirement/install_requirements.sh。
其实你可以看到蓝色框框的地方显示,Target script type有两个选择,如果选择inline的话,就是当没有sh档的时候,也可以直接输入执行的指令。因为我们有sh档,所以就选file path (sh档案的位置):
往下捲动后,选择「工作目录」。就是sh档所在的资料夹(目录),【3-2 在agent当中安装必要套件】就完成啰!
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:
直接在下方框格当中输入要执行的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指令,所以就不需要指定工作目录了,完成!
3-4 把执行结果发布成报告
前一个安排的测试任务,agent执行之后,要产出一个测试报告供纪录。虽然说可能每次执行job pipeline的时候,执行过程也会被记录下来,不过这些纪录好像在30天后会被删除,所以如果能够发布成报告是比较好追蹤的型式,就看你对于这个测试有多需要详实纪录,再次强调这些任务要怎么安排都是看专案需求而定。
点选agent的旁边的+,新增任务,搜寻「publish test」,点选add:
本次示範如下
任务名称取名为:Publish Test Results **/test-*.xml
,报告格式输入JUnit,输出报告名称**/test-*.xml
(所以发布的报告档名都会以test-为开头)
如果想要「不管测试任务成功或失败,都有报告产出」,往下捲,在【Control Options】的Run this task点选「Even if a previous task has failed, unless the build was canceled」:
4. 执行任务
恭喜大家完成CI pipeline上半部设定,先来看一下执行效果如何(你也可以继续做下一篇的内容,往下建立任务),接下来点选save&queue
点选pipeline的这个run (每一次run,都会有一个独立的run ID),往下拉,会看到job下会有Agent job 1蓝色转圈圈正在执行的画面:
点选之后,就可以看到这只Agent正在执行的每个步骤,如果成功的话,就可以看到绿色勾勾,红色叉叉就是失败(示意图如下),每个task都可以看到执行的过程,如果出现叉叉可以按照上面的error code进行除错:
如果都执行成功,就会出现绿色勾勾。最后一个任务发布报告,也成功发布了:
可以在左侧功能键的test plan下,点选test run,找到run ID,检视报告:
所以本篇的CI pipeline上的新增任务如下
下一篇【Azure MLOps - 4】使用Azure DevOps建立训练模型的CI pipeline(下)