使用 CNTK 程式庫受控 API 評估 Azure WebApi 中的模型

透過 Azure Machine Learning 命令列部署

在 Azure 上部署 CNTK 模型,並能夠透過 Web API 執行已部署模型的方法之一,是透過命令列介面對 Azure Machine Learning 執行。 按一下 這裡 以瞭解如何。

透過 ASP.NET 部署

我們將逐步引導您前往在 Azure 上部署 CNTK 模型所需的步驟,並將 Web 要求傳送至 Azure 端點,以針對已部署的模型評估資料。 我們將以 WebApi 的形式建置這項功能,但著重于最基本的 Azure 功能。 請參閱更進階的 Azure 檔,以瞭解所有進階功能,例如參數傳遞等。

規格需求

由於我們目前使用 VS2017 來建置 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,您仍能夠遵循大部分的步驟。

讓我們開始使用

我們已建立名為 CNTKAzureTutorial01的專案藍圖。 此專案是 CNTK GitHub 存放庫的一部分,可以在 資料夾中 Examples\Evaluation\CNTKAzureTutorial01 找到。

請注意,範例專案使用 CNTK 程式庫受控 API。 對於使用 EvalDll API 的使用者,若要評估模型,請使用 CNTK EvalDLL API。 使用 EvalDll 的教學課程位於 使用 EvalDll 評估 Azure WebApi 中的模型

建議您從此解決方案開始,因為我們已新增所需的所有程式碼。 如需完整性,以下是建立教學課程專案的作業清單:

  • 我們一開始從 : CNTKAzureTutorial01 在 File->New->Project->Visual C#->Web->ASP.NET WebApplication VisualStudio 中建立新的專案/方案。 我們挑選了 Azure API 應用程式範本、新增了「Web API」的參考,並確定其裝載在本機 ( 裝載于雲端中,但尚未) 。

  • 然後,我們會執行下列程式碼變更來建置教學課程專案:

    • 在 ValueController.cs 中,我們新增了一些必要的 using 指示詞

    • 已取代 中的 public async Task<IEnumerable<string>> Get() 程式碼,以實際呼叫 CNTK 評估函式

    • 已新增 函式 public async Task<string[]> EvaluateCustomDNN(string imageUrl) 。 我們已從 CNTK Eval 範例中採用此函式, (檔案中的 Examples\Evaluation\CSEvalClient\Program.cs CNTK 存放庫方法 EvaluateImageClassificationModel)

    • 新增檔案 CNTKImageProcessing.cs 以新增點陣圖調整大小功能。 這是源自 中的 Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs CNTK 存放庫到命名空間和類別名稱

    • 在我們的解決方案中建立的二進位檔目錄必須新增至 PATH 應用程式的環境。 這是必要的,因為我們的專案包含原生 DLL,而且只有在標準搜尋路徑中可連線時才會載入這些 DLL。 我們在 的 方法 global.asaxApplication_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 中,選取 nuget.org 作為 Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution... 線上來源,搜尋 CNTK 並安裝最新的套件版本 (CNTK.GPUCNTK.CPUOnly) 至專案。

NuGet

現在我們需要模型來評估。 下載 ResNet20_CIFAR10_CNTK.model ,並將它儲存在專案資料夾下的目錄中 CNTK\Models 。 模型檔案也必須包含在解決方案中 () Project -> Add existing Item

CNTK 需要 64 位執行時間環境。 請確定Configuration Manager已針對 x64 平臺編譯專案。 此外,我們要建立的 WebApi 必須裝載在 IIS 的 64 位實例中。 您可以在 中選取 [針對網站和專案使用 64 位版本的IIS Express] 來強制執行此動作Tools -> Options -> Project and Solutions -> WebProjects

Project

此時,您已執行所有必要的步驟,以在本機電腦上執行模型。 在 Visual Studio 中,按 F5 以執行專案。 這會在預設網站上開啟網際網路瀏覽器,並顯示錯誤訊息。 這是預期的行為,因為我們已建立 WebApi,而不是網站。 我們藉由將瀏覽器中的位址變更為,輕鬆地呼叫實作的 WebApi:

http://localhost:<portnumber>/api/values

這會在 ValuesController-Class中呼叫 Get() 方法,接著呼叫 方法 EvaluateCustomDNN() ,並將結果傳回至網頁瀏覽器

當地

在 Azure 上裝載 WebApi

有了這個,我們已完成任務的第一個部分,現在我們需要裝載在 Azure 中的這項功能! 從專案的 [建置] 功能表中,選取 Publish 命令。 挑選 Microsoft Azure App Service 作為發佈目標

Azure

在 [AppService] 對話方塊中,您必須使用您的帳戶登入,然後選取適當的訂用帳戶和資源群組。 請務必挑選支援 64 位虛擬機器的資源群組, (「免費」資源群組不適用於此) 。 在最後的發佈步驟中,您必須在 [設定] 功能表中挑選 x64 組態。 這也需要將 CNTK 的原生二進位元件發佈至 Azure

AzureSettings

當您發佈模型並在瀏覽器中呼叫已發佈的 WebApi 之後,您會看到錯誤訊息。 開啟 Azure 入口網站,並確定您的 WebApi 正在 64 位平臺上執行, (視需要變更並「儲存」設定,這也會在 Azure) 中重新開機您的虛擬機器實例。

Azure64Settings

執行這些變更之後,您就可以在 下呼叫 WebApi http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

此專案示範如何在 Azure WebApi 中使用 CNTK 程式庫受控 API 整合 CNTK Eval 功能,並設定 Azure 來執行 CNTK eval 二進位檔。 在下一個步驟中,您現在可以新增 API,以動態提供資料給 eval-function 或上傳新的模型版本。 這些是 WebApi/Azure 開發工作,您應該參閱 Azure 檔。