在上一篇【Azure MLOps - 2】使用Azure DevOps建立專案與連線設定,做完:
(1)在Azure DevOps建立專案
(2)為了能讓DevOps agent執行AML上的各種步驟,而建立起來的service connection
接下來就要開始建立CI pipeline了!
本篇文章架構:
上一篇有說明,其實CI pipeline做的每個任務都是由DevOps上的agent完成,在沒有建立pipeline之前都是資料科學家透過手動在Azure Machine Learning上操作完成。
每次啟動時,agent就會開始一步一步完成這個工作清單(pipeline)上的每個任務(tasks):
所以建立CI pipeline的流程如下:
由於任務比較多,會分成上下兩篇。
選擇上篇建立的專案,點選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就好:
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執行正確),再往下繼續執行其他任務。這個單元測試並非非做不可,同樣的道理,很可能你也會想做更多測試,那也可以插入更多的測試任務。
回到task的地方,點選+為這個agent新增一個任務:
因為需要在agent當中運行「測試程式碼(train_test.py)」,第一件事要先指定使用版的版本,這裡使用的是version 3.6 (需要和train_test.py使用的python版本相符)。在搜尋框中輸入:python後,點選add,就會在agent底下新增一個新任務囉:
版本version spec輸入3.6,這個任務名稱輸入:「use python 3.6」後,幫助在左邊任務列表裡看得更清楚:
剛才說我們要讓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當中安裝必要套件】就完成囉!
前兩個步驟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指令,所以就不需要指定工作目錄了,完成!
前一個安排的測試任務,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」:
恭喜大家完成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(下)