使用 EvalDll 評估 Azure WebApi 中的模型
我們將逐步引導您前往在 Azure 上部署CNTK模型所需的步驟,並將 Web 要求傳送至 Azure 端點,以針對已部署的模型評估資料。 我們將以 WebApi 的形式建置這項功能,但著重于最基本的 Azure 功能。 請參閱更進階的 Azure 檔,以瞭解所有進階功能,例如參數傳遞等。
規格需求
由於我們目前使用 VS2015 來建置CNTK,因此我們著重于此版本的Visual Studio。
Visual Studio的 Web 開發功能
您必須在 Visual Studio 中啟用Web-Development功能。 您可以查看此功能是否已啟用 (,並視需要再次執行 VS 安裝程式 Control Panel -> Program and Features -> Microsoft Visual Studio 201x
) (啟用,然後按一下滑鼠右鍵並選取 Change
以叫用 VS 安裝程式)
Azure SDK
您的開發電腦上必須安裝適用于 .NET 的 Azure SDK。 此下載頁面為: Azure SDK 下載
Azure 帳戶
由於我們會在 Azure 上裝載CNTK模型,因此您需要 Azure 帳戶。 如果您有 MSDN 或Visual Studio訂用帳戶,該帳戶就足以裝載您本教學課程的模型。 CNTK需要 64 位虛擬機器才能裝載,免費的 Azure 帳戶不包含這項功能,且將無法足夠。
一開始,我們會在本機開發 WebApi,然後將它上傳至我們的 Azure 實例。 因此,即使無法存取 Azure,您仍能夠遵循大部分的步驟。
讓我們開始使用
我們已建立名為 EvalDll_AzureTutorial的專案藍圖。 此專案是CNTK GitHub存放庫的一部分,可以在 資料夾中 Examples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
找到。
請注意,範例專案使用 CNTK EvalDll API。 對於使用以 Python 定型的模型的使用者,請使用CNTK 程式庫 API。 如需使用 CNTK 程式庫的教學課程,請參閱使用 CNTK 程式庫受控 API 評估 Azure WebApi 中的模型
建議您從此解決方案開始,因為我們已新增所需的所有程式碼。 如需完整性,以下是建立教學課程專案的作業清單:
我們從 在 VisualStudio 中從 建立新的專案/方案開始
File->New->Project->Visual C#->Web->ASP.NET WebApplication
:EvalDll_AzureTutorial。 我們挑選了 Azure API 應用程式範本、新增了「Web API」的參考,並確定其裝載在本機 (未 裝載于雲端中,但尚未) 。然後,我們會執行下列程式碼變更來建置教學課程專案:
在 ValueController.cs 中,我們新增了一些必要的 using 指示詞
已取代 中的
public async Task<IEnumerable<string>> Get()
程式碼,以實際呼叫我們的CNTK評估函式已新增 函式
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
。 我們已從檔案) 中CNTK存放庫Examples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
的 CNTK Eval 範例 (方法EvaluateImageClassificationModel
採用此函式新增檔案
CNTKImageProcessing.cs
以新增點陣圖調整大小功能。 這源自 中的Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs
CNTK存放庫到命名空間和類別名稱在我們的解決方案中建立的二進位檔目錄必須新增至
PATH
應用程式的環境。 這是必要的,因為我們的專案包含原生 DLL,而且只有在標準搜尋路徑中可連線時才會載入這些 DLL。 我們在 的 方法global.asax
中Application_Start()
新增了下列程式碼:string pathValue = Environment.GetEnvironmentVariable("PATH"); string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory; string cntkPath = domainBaseDir + @"bin\"; pathValue += ";" + cntkPath; Environment.SetEnvironmentVariable("PATH", pathValue);
在本機裝載 WebApi
這些是我們到目前為止執行的變更。 我們仍然需要取得專案中所包含的CNTK Eval 功能,而且需要評估模型。
將CNTK Eval 功能新增至專案。 這可做為NuGet套件。 在 VS 中,選擇 Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...
nuget.org
作為線上來源,搜尋 CNTK
並安裝最新的套件版本 (Microsoft.Research.CNTK.*
) 。
現在我們需要模型來評估。 下載 ResNet_18.model ,並將它儲存在方案中的目錄中 CNTK\Models
。 模型檔案也必須包含在解決方案中 () Project -> Add existing Item
CNTK需要 64 位執行時間環境。 請確定Configuration Manager已針對 x64 平臺編譯專案。 此外,我們要建立的 WebApi 必須裝載在 IIS 的 64 位實例中。 您可以在 中選取 [針對網站和專案使用 64 位版本的IIS Express] 來強制執行此動作Tools -> Options -> Project and Solutions -> WebProjects
此時,您已執行所有必要的步驟,以在本機電腦上執行模型。 在 Visual Studio按 F5
以執行專案。 這會在預設網站上開啟網際網路瀏覽器,並顯示錯誤訊息。 這是預期的行為,因為我們已建立 WebApi,而不是網站。 我們藉由將瀏覽器中的位址變更為,輕鬆地呼叫實作的 WebApi:
http://localhost:<portnumber>/api/values
這會在 ValuesController-Class中呼叫 Get()
方法,接著呼叫 方法 EvaluateCustomDNN()
,並將結果傳回至網頁瀏覽器
在 Azure 上裝載 WebApi
有了這個,我們已完成任務的第一個部分,現在我們需要裝載在 Azure 中的這項功能!
從專案的 [建置] 功能表中,選取 Publish
命令。 挑選 Microsoft Azure App Service
作為發佈目標
在 [AppService] 對話方塊中,您必須使用您的帳戶登入,然後選取適當的訂用帳戶和資源群組。 請務必挑選支援 64 位虛擬機器的資源群組, (「免費」資源群組不適用於此) 。 在最後的發佈步驟中,您必須在 [設定] 功能表中挑選 x64 組態。 這也需要將CNTK的原生二進位元件發佈至 Azure
當您發佈模型並在瀏覽器中呼叫已發佈的 WebApi 之後,您會看到錯誤訊息。 開啟 Azure 入口網站,並確定您的 WebApi 正在 64 位平臺上執行, (視需要變更並「儲存」設定,這也會在 Azure) 中重新開機您的虛擬機器實例。
執行這些變更之後,您就可以在 下呼叫 WebApi http://<yourwebapp>.azurewebsites.net/api/values
此專案示範如何在 Azure WebApi 中使用 EvalDll 整合CNTK Eval 功能,並設定 Azure 來執行CNTK eval 二進位檔。 在下一個步驟中,您現在可以新增 API,以動態提供資料給 eval-function 或上傳新的模型版本。 這些是 WebApi/Azure 開發工作,您應該參閱 Azure 檔。