iT邦幫忙

0

【Azure MLOps - 7】建立CD pipeline:把機器學習模型部署到production area

  • 分享至 

  • xImage
  •  

本次建立的CD pipeline中,會有兩個部分:
(1)模型自動部署到測試環境(staging area) (上篇文章)
(2)模型自動部署到正式環境(production area) (本篇文章)
而這兩個部分中間,並不會連續,中間會插入一個核准的關卡。

https://ithelp.ithome.com.tw/upload/images/20230118/20154404pyX7jHpV49.png

因為第一部分幾乎和第二部分一模一樣,所以本篇文章會較為簡短,如果想要詳細了解,必須回去閱讀上一篇!
CD pipeline文章:
【Azure MLOps - 6】建立CD pipeline:把機器學習模型部署到staging area

本篇文章結構:

  1. 概念說明
  2. 建立agent的任務
  3. 設定核准關卡
  4. 試跑第二部分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:
https://ithelp.ithome.com.tw/upload/images/20230118/20154404iv0xyk5Mud.png

一樣點選empty job之後,改名稱:Deploy to Prod
https://ithelp.ithome.com.tw/upload/images/20230118/20154404nwIKZm24vZ.png

和之前一樣設定好agent,如果不知道這是什麼意思的,可以參閱這個系列的前幾篇文章,有詳細解說:
https://ithelp.ithome.com.tw/upload/images/20230118/201544041XJFvKT6nd.png

2-2 agent任務:安裝az ml extension

由於後續會在agent裡面測試「部署到正式環境的api是否可以呼叫並預測」,而測試使用的程式碼是prod_test.py (位在【pipeline published artifact區域】)如下圖,所以我們需要指定agent python版本。
https://ithelp.ithome.com.tw/upload/images/20230118/201544043Nd47Shj48.png

點擊agent旁邊的+,搜尋python,加入use python任務,指定python版本:
https://ithelp.ithome.com.tw/upload/images/20230118/20154404R0jjuEuBHW.png

與CI pipeline & 第一部分CD pipeline相同,需要再agent安裝az ml extension,才有辦法使用指令使用Azure Machine Learning各種功能。所以點擊agent旁邊的+,搜尋Azure CLI,加入任務:
https://ithelp.ithome.com.tw/upload/images/20230118/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不同,多了這個任務。
https://ithelp.ithome.com.tw/upload/images/20230118/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:
https://ithelp.ithome.com.tw/upload/images/20230118/201544044AFzT5ewzl.png

aks.clusterName aks
aks.vmSize Standard_B4ms (機器規格)
aks.agentCount 3
Service.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:
內容就跟上一篇幾乎一樣~

https://ithelp.ithome.com.tw/upload/images/20230118/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區域】中:
https://ithelp.ithome.com.tw/upload/images/20230118/201544041gt4Jv1Wx6.png

所以需要指定工作目錄,下拉選單/_MLOps-WorkShop-1-CI/landing/s/deployment:
https://ithelp.ithome.com.tw/upload/images/20230118/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」:
https://ithelp.ithome.com.tw/upload/images/20230118/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/)
https://ithelp.ithome.com.tw/upload/images/20230118/201544040oXlLzvx5A.png

接下來新增一個Azure CLI任務,取名為「Prod Test」,執行pytest,pytest解釋詳見之前在建立CI pipeline的解說:
https://ithelp.ithome.com.tw/upload/images/20230118/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,所以往下捲動,設定工作目錄:
https://ithelp.ithome.com.tw/upload/images/20230118/201544047CvlACYE65.png

2-6 agent任務:發布endpoint測試結果

前一步驟使用pytest測試,並產出report,新增一個任務把這些報告發布到Azure DevOps中。搜尋publish result,add後修改名稱Publish Prod Test Results。前一個步驟有設定pytest報告的檔名都叫做test-,所以Test results files填入:**/test-*.xml
https://ithelp.ithome.com.tw/upload/images/20230119/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結束後,需被核准後才觸發。
https://ithelp.ithome.com.tw/upload/images/20230119/20154404DnQ14fUiGv.png

開啟Pre-deployment approvals,選擇核准對象(很可能是你們的部門主管或團隊leader),還有其他更精細的條件比方說超過幾天等待核准都沒有回音,就會失效。核准者我先填入自己的e-mail,到時候整條pipeline運作的時候,前一個staging area deployment結束後,我會收到一封信請我核准pord area deployment:
https://ithelp.ithome.com.tw/upload/images/20230119/20154404VrIcSPQ5xD.png

4. 試跑第二部分CD pipeline

雖然我們設定好觸發條件,不過在真的讓他自動觸發前,還是先執行一次這個pipeline看看,點選頁面右上方的create release:
https://ithelp.ithome.com.tw/upload/images/20230119/20154404CSg21OEtmS.png

可以看到整條pipeline開始執行:
https://ithelp.ithome.com.tw/upload/images/20230119/20154404w9VueOrIjE.png

過了幾分鐘,staging area完成之後,可以看到pipeline並沒有直接沒有往下,會需要approver的核准:
https://ithelp.ithome.com.tw/upload/images/20230119/20154404vLK35X1JhZ.png

approver會收到一封email,要求approver上Devop檢查pipeline是否要核准「Deploy to prod」的stage,點選view approval,會導到Azure DevOps:
https://ithelp.ithome.com.tw/upload/images/20230119/20154404EHfdDlsi4O.png

核准者可以看一下是否要核準,點選approve:
https://ithelp.ithome.com.tw/upload/images/20230119/20154404V3J3LEYOFJ.png

可以寫下評語或回饋,如果要核准就點選approve,如果覺得還不能進到正式環境,就點選reject。點選approve,就會開始進行部署到正式環境的pipeline囉:
https://ithelp.ithome.com.tw/upload/images/20230119/20154404x7MrdoCk9B.png

如果你跟我一樣也是使用Azure試用帳號,會遇到無法新增的AKS的狀況。
https://ithelp.ithome.com.tw/upload/images/20230119/20154404PRzaBpK478.png

所以在後續的示範,「第二部分:模型自動部署到正式環境」我也部署到ACI以測試流程是否成功。下一篇來測試使用整條CI/CD pipeline流程吧!

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


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言