本次建立的CD pipeline中,會有兩個部分:
(1)模型自動部署到測試環境(staging area) (上篇文章)
(2)模型自動部署到正式環境(production area) (本篇文章)
而這兩個部分中間,並不會連續,中間會插入一個核准的關卡。
因為第一部分幾乎和第二部分一模一樣,所以本篇文章會較為簡短,如果想要詳細了解,必須回去閱讀上一篇!
CD pipeline文章:
【Azure MLOps - 6】建立CD pipeline:把機器學習模型部署到staging area
本篇文章結構:
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
「部署到正式環境」agent執行的任務,都和前一篇「部署到測試環境」的任務幾乎一樣,差別在於部署到AKS,而不是ACI (Azure compute instance)。不過因為我這次練習時候,使用的是Azure試用帳戶,不能建立AKS,所以這裡只能示範建立自動部署到AKS的pipeline,執行的時候會報錯。
回到上一篇CD pipeline的畫面,點選Add:
一樣點選empty job之後,改名稱:Deploy to Prod
和之前一樣設定好agent,如果不知道這是什麼意思的,可以參閱這個系列的前幾篇文章,有詳細解說:
由於後續會在agent裡面測試「部署到正式環境的api是否可以呼叫並預測」,而測試使用的程式碼是prod_test.py (位在【pipeline published artifact區域】)如下圖,所以我們需要指定agent python版本。
點擊agent旁邊的+,搜尋python,加入use python任務,指定python版本:
與CI pipeline & 第一部分CD pipeline相同,需要再agent安裝az ml extension,才有辦法使用指令使用Azure Machine Learning各種功能。所以點擊agent旁邊的+,搜尋Azure CLI,加入任務:
az extension add -n azure-cli-ml
接下來我們希望模型部署到container上,下一個任務新增Azure Kubernetes Service (AKS)。
因為要使用az ml cli指令新增AKS compute,點擊agent旁邊的+,搜尋Azure CLI,加入任務,命名為:Create AKS。AKS和ACI不同,多了這個任務。
使用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:
aks.clusterName aks
aks.vmSize Standard_B4ms (機器規格)
aks.agentCount 3
Service.name.prod insurance-service-aks (service名稱,下一步驟會用到)
接下來我們希望模型部署AKS上,下一個任務把模型部署到剛剛創立的Azure Kubernetes Service (AKS)。
因為要使用az ml cli指令部署模型,點擊agent旁邊的+,搜尋Azure CLI,加入任務,命名為Deploy to AKS:
內容就跟上一篇幾乎一樣~
使用指令: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區域】中:
所以需要指定工作目錄,下拉選單/_MLOps-WorkShop-1-CI/landing/s/deployment:
接下來的步驟也和上一篇部署到測試區的任務一樣。
如果正式啟動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」:
要在agent當中執行prod_test.py,就需要先把程式當中需要的套件安裝好,所以一樣會需要在agent執行安裝指令(與CI pipeline一樣,可以回去複習)。增加一個bash task,執行install_requirements.sh:
(install_requirements.sh在_MLOps-WorkShop-1-CI/landing/s/package_requirement/)
接下來新增一個Azure CLI任務,取名為「Prod Test」,執行pytest,pytest解釋詳見之前在建立CI pipeline的解說:
在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,所以往下捲動,設定工作目錄:
前一步驟使用pytest測試,並產出report,新增一個任務把這些報告發布到Azure DevOps中。搜尋publish result,add後修改名稱Publish Prod Test Results。前一個步驟有設定pytest報告的檔名都叫做test-,所以Test results files填入:**/test-*.xml
CD pipeline的第二部分:模型自動部署到測試環境(Prod area),也完成囉~
觸發CD pipeline的第二部分:模型自動部署到正式環境(production area)的條件是被「核准」,情境假設是開發團隊想要觀察模型表現一陣子,確認新模型的預測結果是否比舊版模型好,才會上到正式環境。
回到pipeline主頁,點選閃電,select trigger,選擇after stage。還有其他的選項,像是Manual only好像也可以,不過我們這裡選擇after stage,stage選擇Pre-deployment approvals,意思就是在前一個staging area deployment結束後,需被核准後才觸發。
開啟Pre-deployment approvals,選擇核准對象(很可能是你們的部門主管或團隊leader),還有其他更精細的條件比方說超過幾天等待核准都沒有回音,就會失效。核准者我先填入自己的e-mail,到時候整條pipeline運作的時候,前一個staging area deployment結束後,我會收到一封信請我核准pord area deployment:
雖然我們設定好觸發條件,不過在真的讓他自動觸發前,還是先執行一次這個pipeline看看,點選頁面右上方的create release:
可以看到整條pipeline開始執行:
過了幾分鐘,staging area完成之後,可以看到pipeline並沒有直接沒有往下,會需要approver的核准:
approver會收到一封email,要求approver上Devop檢查pipeline是否要核准「Deploy to prod」的stage,點選view approval,會導到Azure DevOps:
核准者可以看一下是否要核準,點選approve:
可以寫下評語或回饋,如果要核准就點選approve,如果覺得還不能進到正式環境,就點選reject。點選approve,就會開始進行部署到正式環境的pipeline囉:
如果你跟我一樣也是使用Azure試用帳號,會遇到無法新增的AKS的狀況。
所以在後續的示範,「第二部分:模型自動部署到正式環境」我也部署到ACI以測試流程是否成功。下一篇來測試使用整條CI/CD pipeline流程吧!
最終篇【Azure MLOps - 最終篇】END TO END CI/CD MLOPS