使用ML.NET + Azure DevOps + Azure Container Instances打造机器学习生产化
介紹
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機器學習模型,以使用各種測量來預測鳶尾花屬于哪一類。
先決條件
- Git
- GitHub Account
- .NET Core SDK
- Azure Account
應用程序
因為這篇文章的目的是演示Azure Devops的功能而不是ML.NET的功能,所以我將從一個預構建的應用程序開始。有關ML.NET功能的更多信息和詳細信息,請查看官方文檔頁面以及我以前的一些帖子:
- 使用ML.NET和Azure Function進行機器學習 - 第1部分
- 使用ML.NET和Azure Function進行機器學習 - 第2部分
- 使用ML.NET + ASP.NET Core + Docker + Azure Container Instances部署.NET機器學習模型
本文中使用的應用程序包含三個.NET Core項目。一個是類庫,我們將使用它來為訓練模型包裝ML.NET功能,以及加載預先訓練的模型,然后將其用于進行預測。另一個是.NET Core控制臺應用程序,它引用類庫來訓練和持久化ML.NET模型。最后,還有ASP.NET Core Web API,它還引用了類庫應用程序來加載由控制臺應用程序創建的預先訓練的模型,然后通過HTTP進行預測。此應用程序可以單獨使用和部署,但在本文中,它將打包到Docker鏡像中,然后將其部署到Azure Container Instances。
Class Library
可以在MLModel目錄中找到類庫。類庫定義觀察和預測數據類,它們分別可以在IrisData.cs和IrisPrediction.cs文件中找到。此外,Model該類包含輔助方法,用于訓練和保存機器學習模型,加載預先訓練的模型并使用這些模型進行預測。
控制臺應用
在解決方案目錄中,我們在目錄中也有一個控制臺應用程序ModelTrainer。此應用程序引用MLModel目錄中的類庫來訓練和持久化機器學習模型。
API
該ModelApi目錄包含一個ASP.NET Core Web API應用程序,該應用程序引用MLModel類庫項目以加載由ModelTrainer控制臺應用程序訓練并通過HTTP進行預測的預訓練模型??梢栽贛odelApi應用程序Controllers目錄中的PredictController.cs類中找到進行預測的邏輯。
CI / CD管道流程
從概念上講,當手動構建和部署應用程序時,機器學習模型在MLModel類庫中定義和開發。一旦對模型滿意,就會構建類庫。MLModel構建引用類庫的控制臺應用程序以及運行以在稱為的文件中訓練和持久化分類模型model.zip。該MLModel類庫也被引用的ModelApiASP.NET核心項目。因為ModelApi我們要部署的應用程序是為了公開我們預先訓練好的機器學習模型,所以我們需要找到一種方法來打包它以進行部署。我們將使用Azure Container Instances部署ModelApi意味著我們需要創建項目的Docker鏡像,然后將其推送到Docker注冊表,以供公眾使用??梢允褂肁zure DevOps標準化和自動化構建多個項目以及將Docker鏡像構建,發布和部署到Azure Container Instances。本文的其余部分將重點介紹如何使用Azure管道通過Azure DevOps中的CI / CD管道逐步操作此機器學習應用程序。
獲取代碼
在開始之前,您要做的第一件事就是將mlnetazdevopssample?GitHub存儲庫分成您自己的GitHub帳戶。
?
創建項目
導航到https://devops.azure.com,單擊Start Free并按照提示創建新帳戶或登錄現有帳戶。
?
登錄后,單擊Create Project。
?
輸入項目名稱以及簡短說明。然后,單擊Create。
?
持續集成(CI)管道
使用Azure管道,我們將為應用程序的構建和打包步驟配置CI管道。以下是我們的CI管道中涉及的所有步驟的說明:
?
CI管道設置
創建項目后,在主項目頁面中,將鼠標懸停在上Pipelines,然后單擊Builds。
?
在Builds管道頁面中,單擊New pipeline。
?
選擇GitHub作為源,并將您的GitHub帳戶與Azure DevOps連接。
?
一旦您授權Azure DevOps使用您的GitHub帳戶,請選擇將用于此構建管道的存儲庫和分支。在我們的例子中,我們將使用mlnetazdevopssample存儲庫的主分支。完成配置后,單擊Continue。
?下一步是選擇要在我們的管道中執行的作業。因為這個構建管道中有多個步驟,所以讓我們從一個開始,Empty Job并根據我們的需要進行自定義。
?在構建管道頁面內部,在我們開始添加作業之前,讓我們選擇將執行作業的代理。對于此管道,請Hosted Ubuntu 1604從下拉列表中選擇該選項。
?
1.構建類庫應用程序
我們的CI管道的第一步是構建我們的類庫,其中包含包含ML.NET框架和持久模型的訓練,加載和預測功能的方法。
為此,我們將向我們添加一個.NET Core任務Agent Job 1。
?添加到管道后,讓我們配置此任務。為了使其更具描述性,我們可以給它一個名稱,如Build Class Library。因為此任務將負責構建.NET Core類庫,所以我們將保留默認的build?Command設置。
?我們要配置的另一個設置是Working Directory。我們可以通過單擊Advanced選項卡來完成。
?對于此任務,我們將使用該MLModel目錄。
?完成配置后,單擊頂部工具欄上的Save & Queue- >?Save。
?輸入描述管道更改的詳細注釋,然后單擊Save。
?
2.構建控制臺應用程序
一旦我們構建了我們將從.NET Core控制臺和ASP.NET Core Web API應用程序引用的類庫應用程序,就可以構建控制臺應用程序,這將用于訓練和持久化ML.NET模型。
與上一步類似,將新的.NET Core?構建任務添加到管道。將為此任務更改的唯一設置是Working Directory具有值的值ModelTrainer。
?雖然不是必需的,但在完成任務配置后,單擊Save & Queue- >?Save以保存并注釋對管道的更改。
3.訓練并持久化ML.NET模型
現在我們的控制臺應用程序已經構建完畢,是時候運行它來訓練和持久化ML.NET模型了。為此,我們將添加另一個.NET Core任務。不同之處在于Command現在將使用該run值配置設置。
?在Working Directory將被設置為ModelTrainer在前面的任務一樣。
?請記住保存并注釋管道的新更改。
4.將ML.NET模型復制到Web API目錄
運行控制臺應用程序并訓練ML.NET模型后,它將保留model.zip在ModelTrainer調用目錄中。我們可以使用此持久化版本的模型從控制臺應用程序或我們選擇的任何其他應用程序進行預測。在這種情況下,我們將通過ASP.NET Core Web API進行預測。為了讓我們的API引用此文件,我們需要將其復制到我們ModelApi目錄的根目錄中。執行該任務的方法是通過bash腳本。要向我們的管道添加bash腳本,我們需要做的就是向它添加一個Bash任務。
?一旦添加到我們的管道,就可以配置任務了。我們將設置的Type設置Inline將顯示一個文本框,供我們輸入腳本。
?在文本框內,輸入以下內容:
# Write your commands herecp ../ModelTrainer/model.zip .# Use the environment variables input below to pass secret variables to this script我們可以Working Directory將此步驟設置為ModelApi。此命令將model.zip文件從ModelTrainer目錄復制到ModelApi目錄。
?完成后,將新更改保存并注釋到管道。
5.構建ASP.NET Core Web API應用程序
現在我們在ModelApi應用程序中有了必要的文件,是時候構建它了。我們將向我們的管道添加一個.NET Core任務并設置Command為build。這Working Directory將ModelApi像上一個任務一樣。
完成后,保存并注釋管道的新更改。
?
6.構建ASP.NET Core Web API Docker鏡像
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復選框以使每個構建都是最新的,而不是使用版本號標記它。
?請記住保存并注釋最近對管道的更改。
7.將Docker Image推送到Docker Hub
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部分下方。
?從列表中選擇第一個構建以獲取有關構建的更多詳細信息。
?這將帶您進入實時顯示管道狀態的日志。
?
確認CI管道成功
如果構建成功,請導航到https://hub.docker.com/以檢查Docker鏡像是否已推送到注冊表。
?
持續交付(CD)管道
現在我們已經建立了CI管道,它將構建和打包我們的應用程序,現在是時候部署它了。我們可以自己做或者使用CD管道自動化它。我們的應用程序將部署到Azure Container Instances,這是一項Azure服務,提供了一種快速運行容器的方法,而無需擔心虛擬機或業務流程服務的管理。我們的CD管道涉及的步驟如下:
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管道中配置任務了。
1.創建Azure資源組
開始向Azure CLI管道添加任務。在此任務中,我們將在Azure中創建一個資源組,我們將部署應用程序。
在執行任何其他操作之前,將DevOps鏈接到Azure訂閱,方法是從下拉列表中選擇一個,然后單擊Authorize該訂閱將提示您對訂閱進行身份驗證。
連接Azure訂閱后,讓我們將Script Location設置更改為Inline Script。
在Inline Script文本框中輸入以下內容:
az group create --name mlnetazdevopssampleresourcegroup --location eastus這個腳本會在Azure中創建位于eastus的資源組命名為mlnetazdevopssampleresourcegroup。這兩個配置項可以根據您的喜好進行調整。
2.將Docker鏡像部署到Azure Container Instances
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和CD管道。但是,我們仍然沒有完全自動化啟動這兩者的觸發器。
CI管道觸發器
首先,讓我們通過自動化CI管道開始。為此,請轉到項目的主頁面,將鼠標懸停在上面Pipelines并單擊Builds。
這將帶您進入CI管道頁面。在此頁面上,單擊Edit。
然后,單擊Triggers。
進入此頁面后,選中Enable continous integration復選框,然后單擊Save & Queue- >?保存并注釋您的更改Save。
?
CD管道觸發器
要自動化CD管道觸發器,請單擊頁面Releases下方Pipelines以自動化CD管道。
進入CD管道的頁面后,單擊Edit。
然后,單擊Artifacts部分中的閃電圖標,該圖標將顯示配置表單。在此表單中,將Continuous deployment trigger設置切換為Enabled。
完成后,保存并注釋您的更改。
運行CI / CD管道
雖然在將新更改簽入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可以靈活地配置所有這些任務和工作流以滿足您的要求。
轉載于:https://www.cnblogs.com/BeanHsiang/p/10061719.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的使用ML.NET + Azure DevOps + Azure Container Instances打造机器学习生产化的全部內容,希望文章能夠幫你解決所遇到的問題。