Azure DevOps,之前稱爲Visual Studio Team Services(VSTS),可幫助我的和組織更快地規劃,協做和發佈產品。其中一項值得注意的服務是Azure Pipelines,它能夠幫助開發人員構建持續集成(CI)和持續交付(CD)管道,從而自動化和標準化軟件開發過程的構建,測試和部署階段。此外,Azure Pipelines還提供本機容器支持,可與任何語言,平臺和雲配合使用。像軟件開發這樣的機器學習也是一個包括構建,測試和部署階段的過程,這使其成爲自動化和標準化的良好候選者。在Build 2018,微軟宣佈推出ML.NET,.NET的開源,跨平臺機器學習框架。若是咱們將全部這些工具和服務放在一塊兒,這意味着咱們能夠自動化和標準化使用ML.NET構建的機器學習模型的訓練,將其打包到Docker容器中並將其部署到Azure Container Instances(ACI) 。在本文中,我將介紹在Azure Devops中構建CI / CD管道的過程,該管道訓練,打包和部署ML.NET機器學習模型,以使用各類測量來預測鳶尾花屬於哪一類。
html
由於這篇文章的目的是演示Azure Devops的功能而不是ML.NET的功能,因此我將從一個預構建的應用程序開始。有關ML.NET功能的更多信息和詳細信息,請查看官方文檔頁面以及我之前的一些帖子:git
本文中使用的應用程序包含三個.NET Core項目。一個是類庫,咱們將使用它來爲訓練模型包裝ML.NET功能,以及加載預先訓練的模型,而後將其用於進行預測。另外一個是.NET Core控制檯應用程序,它引用類庫來訓練和持久化ML.NET模型。最後,還有ASP.NET Core Web API,它還引用了類庫應用程序來加載由控制檯應用程序建立的預先訓練的模型,而後經過HTTP進行預測。此應用程序能夠單獨使用和部署,但在本文中,它將打包到Docker鏡像中,而後將其部署到Azure Container Instances。github
能夠在MLModel
目錄中找到類庫。類庫定義觀察和預測數據類,它們分別能夠在IrisData.cs
和IrisPrediction.cs
文件中找到。此外,Model
該類包含輔助方法,用於訓練和保存機器學習模型,加載預先訓練的模型並使用這些模型進行預測。docker
在解決方案目錄中,咱們在目錄中也有一個控制檯應用程序ModelTrainer
。此應用程序引用MLModel
目錄中的類庫來訓練和持久化機器學習模型。api
該ModelApi
目錄包含一個ASP.NET Core Web API應用程序,該應用程序引用MLModel
類庫項目以加載由ModelTrainer
控制檯應用程序訓練並經過HTTP進行預測的預訓練模型。能夠在ModelApi應用程序Controllers目錄中的PredictController.cs
類中找到進行預測的邏輯。bash
從概念上講,當手動構建和部署應用程序時,機器學習模型在MLModel
類庫中定義和開發。一旦對模型滿意,就會構建類庫。MLModel
構建引用類庫的控制檯應用程序以及運行以在稱爲的文件中訓練和持久化分類模型model.zip
。該MLModel
類庫也被引用的ModelApi
ASP.NET核心項目。由於ModelApi
咱們要部署的應用程序是爲了公開咱們預先訓練好的機器學習模型,因此咱們須要找到一種方法來打包它以進行部署。咱們將使用Azure Container Instances部署ModelApi
意味着咱們須要建立項目的Docker鏡像,而後將其推送到Docker註冊表,以供公衆使用。可使用Azure DevOps標準化和自動化構建多個項目以及將Docker鏡像構建,發佈和部署到Azure Container Instances。本文的其他部分將重點介紹如何使用Azure管道經過Azure DevOps中的CI / CD管道逐步操做此機器學習應用程序。app
在開始以前,您要作的第一件事就是將mlnetazdevopssample GitHub存儲庫分紅您本身的GitHub賬戶。框架
導航到https://devops.azure.com,單擊Start Free
並按照提示建立新賬戶或登陸現有賬戶。機器學習
登陸後,單擊Create Project
。工具
輸入項目名稱以及簡短說明。而後,單擊Create
。
使用Azure管道,咱們將爲應用程序的構建和打包步驟配置CI管道。如下是咱們的CI管道中涉及的全部步驟的說明:
建立項目後,在主項目頁面中,將鼠標懸停在上Pipelines
,而後單擊Builds
。
在Builds
管道頁面中,單擊New pipeline
。
選擇GitHub做爲源,並將您的GitHub賬戶與Azure DevOps鏈接。
一旦您受權Azure DevOps使用您的GitHub賬戶,請選擇將用於此構建管道的存儲庫和分支。在咱們的例子中,咱們將使用mlnetazdevopssample
存儲庫的主分支。完成配置後,單擊Continue
。
下一步是選擇要在咱們的管道中執行的做業。由於這個構建管道中有多個步驟,因此讓咱們從一個開始,Empty Job
並根據咱們的須要進行自定義。
在構建管道頁面內部,在咱們開始添加做業以前,讓咱們選擇將執行做業的代理。對於此管道,請Hosted Ubuntu 1604
從下拉列表中選擇該選項。
咱們的CI管道的第一步是構建咱們的類庫,其中包含包含ML.NET框架和持久模型的訓練,加載和預測功能的方法。
爲此,咱們將向咱們添加一個.NET Core任務Agent Job 1
。
添加到管道後,讓咱們配置此任務。爲了使其更具描述性,咱們能夠給它一個名稱,如Build Class Library
。由於此任務將負責構建.NET Core類庫,因此咱們將保留默認的build
Command設置。
咱們要配置的另外一個設置是Working Directory
。咱們能夠經過單擊Advanced
選項卡來完成。
對於此任務,咱們將使用該MLModel
目錄。
完成配置後,單擊頂部工具欄上的Save & Queue
- > Save
。
輸入描述管道更改的詳細註釋,而後單擊Save
。
一旦咱們構建了咱們將從.NET Core控制檯和ASP.NET Core Web API應用程序引用的類庫應用程序,就能夠構建控制檯應用程序,這將用於訓練和持久化ML.NET模型。
與上一步相似,將新的.NET Core 構建任務添加到管道。將爲此任務更改的惟一設置是Working Directory
具備值的值ModelTrainer
。
雖然不是必需的,但在完成任務配置後,單擊Save & Queue
- > Save
以保存並註釋對管道的更改。
如今咱們的控制檯應用程序已經構建完畢,是時候運行它來訓練和持久化ML.NET模型了。爲此,咱們將添加另外一個.NET Core任務。不一樣之處在於Command
如今將使用該run
值配置設置。
在Working Directory
將被設置爲ModelTrainer
在前面的任務同樣。
請記住保存並註釋管道的新更改。
運行控制檯應用程序並訓練ML.NET模型後,它將保留model.zip
在ModelTrainer調用
目錄中。咱們可使用此持久化版本的模型從控制檯應用程序或咱們選擇的任何其餘應用程序進行預測。在這種狀況下,咱們將經過ASP.NET Core Web API進行預測。爲了讓咱們的API引用此文件,咱們須要將其複製到咱們ModelApi
目錄的根目錄中。執行該任務的方法是經過bash腳本。要向咱們的管道添加bash腳本,咱們須要作的就是向它添加一個Bash任務。
一旦添加到咱們的管道,就能夠配置任務了。咱們將設置的Type
設置Inline
將顯示一個文本框,供咱們輸入腳本。
在文本框內,輸入如下內容:
# Write your commands here cp ../ModelTrainer/model.zip . # Use the environment variables input below to pass secret variables to this script
咱們能夠Working Directory
將此步驟設置爲ModelApi
。此命令將model.zip
文件從ModelTrainer
目錄複製到ModelApi
目錄。
完成後,將新更改保存並註釋到管道。
如今咱們在ModelApi
應用程序中有了必要的文件,是時候構建它了。咱們將向咱們的管道添加一個.NET Core任務並設置Command
爲build
。這Working Directory
將ModelApi
像上一個任務同樣。
完成後,保存並註釋管道的新更改。
ASP.NET Core Web API應用程序的部署方法是經過容器。所以,在構建應用程序以後,咱們必須爲它構建一個Docker鏡像,而後能夠將其推送到您選擇的Docker註冊表。要構建Docker鏡像,咱們將向管道添加Docker任務。
當咱們配置任務時,咱們將從設置爲Container Registry Type
開始Container Registry
。
這將提示設置與Docker註冊表的服務鏈接(若是尚不存在)。
咱們將使用的Docker註冊表類型是Docker Hub。爲鏈接命名,輸入Docker Hub賬戶的憑據,而後單擊Verify this connection
以確保您的憑據有效,而且能夠與Docker Hub創建鏈接。完成後點擊OK
。
該Command
設置將build
所以咱們能夠保留默認值是還有Dockerfile
其中會使用到Dockerfile在根目錄設置mlnetazdevopssample
目錄。
最後,咱們將配置Image name
設置。咱們將使用的慣例是<docker-hub-username>/<image-name>
。就我而言,lqdev
是個人Docker Hub的用戶名,並在lqdev/mlnetazdevopssample命名個人鏡像爲mlnetazdevopssample
。此外,選中Include latest tag
複選框以使每一個構建都是最新的,而不是使用版本號標記它。
請記住保存並註釋最近對管道的更改。
CI管道的最後一步是將新構建的鏡像推送到Docker Hub。爲此,咱們將使用anoter Docker任務。
與上一個任務同樣,咱們將設置Container registry type
爲Container Registry
。Docker registry service connection
經過從下拉列表中選擇鏈接,將其設置爲最近建立的鏈接。咱們將更Command
改成push
並設置Image name
爲上一步中構建的圖像的名稱。命名約定是<docker-hub-username>/<image-name>:latest
。咱們之前的Docker構建任務添加了最新的標記,所以請確保將其包含在此任務中。
完成後,單擊Save & Queue
- > Save & Queue
。此操做將手動觸發CI管道。
不要忘記註釋您的更改,而後單擊Save & queue
以啓動CI管道。
構建開始時,您能夠單擊左窗格中Builds
的Pipelines
部分下方。
從列表中選擇第一個構建以獲取有關構建的更多詳細信息。
這將帶您進入實時顯示管道狀態的日誌。
若是構建成功,請導航到https://hub.docker.com/以檢查Docker鏡像是否已推送到註冊表。
如今咱們已經創建了CI管道,它將構建和打包咱們的應用程序,如今是時候部署它了。咱們能夠本身作或者使用CD管道自動化它。咱們的應用程序將部署到Azure Container Instances,這是一項Azure服務,提供了一種快速運行容器的方法,而無需擔憂虛擬機或業務流程服務的管理。咱們的CD管道涉及的步驟以下:
要開始設置CD管道,請從Azure DevOps項目主頁面懸停Pipelines
並單擊Releases
。
進入該頁面後,單擊New pipeline
。
與咱們的CI管道同樣,咱們將從稍後開始Empty Job
配置。
建立管道後,就能夠配置它了。咱們要作的第一件事是添加一個工件。工件能夠是各類各樣的東西,包括構建管道的輸出。在咱們的例子中,咱們的CI管道將成爲咱們CD管道的觸發器。要添加工件,請單擊Add an artifact
。
在配置表單,設置Source type
到Build
和Source
在前面的步驟中建立的CI管道的名稱。完成後,單擊Add
。
在配置咱們的工件以後,是時候配置CD管道中的步驟了。爲此,請單擊發布管道頁面部分中的Stage 1
選項,Stages
並將名稱更改成更具描述性的名稱。
完成後,關閉表單並單擊Stages標題下方的超連接。
您如今應該位於相似於CI管道做業配置頁面的頁面上。在此頁面上,咱們將要單擊Agent Job
面板以將Agent pool
設置設置爲Hosted Ubuntu 1604
。
完成後,就能夠在CD管道中配置任務了。
開始向Azure CLI
管道添加任務。在此任務中,咱們將在Azure中建立一個資源組,咱們將部署應用程序。
在執行任何其餘操做以前,將DevOps連接到Azure訂閱,方法是從下拉列表中選擇一個,而後單擊Authorize
該訂閱將提示您對訂閱進行身份驗證。
鏈接Azure訂閱後,讓咱們將Script Location
設置更改成Inline Script
。
在Inline Script
文本框中輸入如下內容:
az group create --name mlnetazdevopssampleresourcegroup --location eastus
這個腳本會在Azure中建立位於eastus的
資源組命名爲mlnetazdevopssampleresourcegroup
。這兩個配置項能夠根據您的喜愛進行調整。
CD管道中的下一步也是最後一步是部署到Azure Container Instances。要部署咱們的應用程序,咱們將添加另外一項Azure CLI
任務。這一次,因爲咱們已經Azure subscription
在上一個任務中配置了咱們,所以咱們能夠選擇服務鏈接而不是下拉列表中的訂閱。
與上一個任務同樣,咱們的腳本將是Inline的。
在Inline Script
文本框中輸入如下內容:
az container create --resource-group mlnetazdevopssampleresourcegroup --name mlnetcontainer --image lqdev/mlnetazdevopssample:latest --ports 80 --ip-address public
配置完此步驟後,請確保經過單擊保存並註釋全部更改Save
。此腳本在由管道的上一個任務建立的資源組中建立一個容器,其中包含mlnetcontainer
來自Docker圖像的名稱,該圖像由CI管道推送到Docker Hub。此外,它打開端口80併爲外部訪問的容器分配可公開訪問的IP地址。
而後,爲了使其易於識別,請經過將鼠標懸停在附近New release pipeline
並單擊鉛筆圖標來編輯管道的名稱。
確保保存並註釋您的更改。
在前面的步驟中,咱們配置了CI和CD管道。可是,咱們仍然沒有徹底自動化啓動這二者的觸發器。
首先,讓咱們經過自動化CI管道開始。爲此,請轉到項目的主頁面,將鼠標懸停在上面Pipelines
並單擊Builds
。
這將帶您進入CI管道頁面。在此頁面上,單擊Edit
。
而後,單擊Triggers
。
進入此頁面後,選中Enable continous integration
複選框,而後單擊Save & Queue
- > 保存並註釋您的更改Save
。
要自動化CD管道觸發器,請單擊頁面Releases
下方Pipelines
以自動化CD管道。
進入CD管道的頁面後,單擊Edit
。
而後,單擊Artifacts部分中的閃電圖標,該圖標將顯示配置表單。在此表單中,將Continuous deployment trigger
設置切換爲Enabled
。
完成後,保存並註釋您的更改。
雖然在將新更改簽入mlnetazdevopssample
存儲庫的主分支時將啓動前進構建和部署,但出於演示目的,咱們將手動啓動咱們剛剛配置的CI / CD管道。爲此,請單擊左窗格中的Pipelines
下方的Builds。
從CI管道頁面單擊Queue
。
這將提示顯示一個模式,您能夠在其中單擊Queue
以啓動構建。
這將啓動一個新的CI構建,隨後也將啓動您的應用程序的CD管道。
若是一切都成功,ASP.NET Core Web API應用程序的Docker鏡像將部署到Azure Container Instances,能夠經過公共IP地址訪問。
要查看部署是否有效,請導航至https://portal.azure.com/並單擊Resource groups
。
此時,您應該看到CD管道建立的資源組。若是是這種狀況,請單擊它。
而後,這將顯示一個頁面,顯示部署到此資源組的容器。點擊它。
容器頁面將顯示有關容器的診斷和配置信息。咱們感興趣的信息是IP address
。將鼠標懸停在其右側並單擊顯示的圖標Click to copy
。這會將地址複製到剪貼板。
在像Postman或Insomnia這樣的應用程序中,向Azure 發出一個HTTP POST請求,http://<ip-address>/api/predict
其中ip-address
包含Azure中容器的公共IP地址,具備如下正文。
{ "SepalLength":3.3, "SepalWidth":1.6, "PetalLength":0.2, "PetalWidth":5.1 }
若是成功,響應將是Iris-virginica
。
在這篇文章中,咱們實現了ML.NET應用程序的構建,打包和部署,該應用程序使用Azure DevOps實現對鳶尾花的分類進行預測。咱們建立了Continous Integration和Continous Delivery管道,它將ASP.NET Core Web API的Docker鏡像部署到Azure Container Instances。請記住,這只是其中一種方法,Azure DevOps能夠靈活地配置全部這些任務和工做流以知足您的要求。