Dela via


Utvärdera en modell i en Azure WebApi med hjälp av CNTK Library Managed API

Distribuera via Azure Machine Learning-kommandoraden

Ett sätt att distribuera en CNTK-modell på Azure och köra den distribuerade modellen via webb-API:er är via ett kommandoradsgränssnitt till Azure Machine Learning. Klicka här om du vill veta mer.

Distribuera via ASP.NET

Vi går igenom de steg som krävs för att distribuera en CNTK-modell i Azure och skicka webbförfrågningar till Azure-slutpunkten för att utvärdera data mot den distribuerade modellen. Vi kommer att skapa den här funktionen i form av en WebApi, men fokusera på de mest grundläggande Azure-funktionerna. Läs mer i mer avancerad Azure-dokumentation om du vill veta mer om alla avancerade funktioner, t.ex. parameteröverföring osv.

Krav

Eftersom vi för närvarande använder VS2017 för att skapa CNTK fokuserar vi på den här versionen av Visual Studio.

Webbutvecklingsfunktion för Visual Studio

Du måste aktivera Web-Development funktioner i Visual Studio. Du kan se om den här funktionen är aktiverad (och aktivera vid behov) genom att köra VS-installationsprogrammet igen (Control Panel -> Program and Features -> Microsoft Visual Studio 201xhögerklicka och välj Change för att anropa VS-installationsprogrammet)

Azure SDK

Azure SDK för .NET måste installeras på utvecklingsdatorn. Nedladdningssidan för detta är: Azure SDK Download

Azure-konto

Eftersom vi ska vara värd för CNTK-modellen i Azure behöver du ett Azure-konto. Om du har en MSDN- eller Visual Studio-prenumeration räcker det kontot för att vara värd för din modell för den här självstudien. CNTK kräver en 64-bitars virtuell dator som värd, ett kostnadsfritt Azure-konto innehåller inte den här funktionen och räcker inte.

Först utvecklar vi WebApi lokalt och laddar sedan upp det till vår Azure-instans. Så du kommer att kunna följa de flesta av stegen även utan åtkomst till Azure.

Nu ska vi komma igång

Vi har redan skapat en projektskiss med namnet CNTKAzureTutorial01. Det här projektet är en del av CNTK GitHub-lagringsplatsen och finns i mappen Examples\Evaluation\CNTKAzureTutorial01.

Observera att exempelprojektet använder CNTK Library Managed API. För användare som använder EvalDll-API:et för att utvärdera modellen använder du CNTK EvalDLL API. Självstudien för att använda EvalDll finns i Utvärdera en modell i Azure WebApi med hjälp av EvalDll

Vi rekommenderar att du börjar med den här lösningen eftersom vi redan har lagt till all kod vi behöver. För fullständighet här är listan över åtgärder för att skapa självstudieprojektet:

  • Vi började med att skapa ett nytt projekt/en ny lösning i VisualStudio från File->New->Project->Visual C#->Web->ASP.NET WebApplication: CNTKAzureTutorial01. Vi valde en Azure API App-mall, lade till referenser till "Webb-API" och såg till att den finns lokalt (finns INTE i molnet – ännu).

  • Sedan utförde vi följande kodändringar för att skapa självstudieprojektet:

    • I ValueController.cs har vi lagt till några nödvändiga med hjälp av direktiv

    • Ersatte koden i public async Task<IEnumerable<string>> Get() för att faktiskt anropa vår CNTK-utvärderingsfunktion

    • Funktionen public async Task<string[]> EvaluateCustomDNN(string imageUrl)har lagts till . Vi antog den här funktionen från våra CNTK Eval-exempel (metod EvaluateImageClassificationModel från CNTK-lagringsplatsen i filen Examples\Evaluation\CSEvalClient\Program.cs)

    • CNTKImageProcessing.cs Filen har lagts till för att lägga till en bitmappsändringsfunktion. Detta kommer från CNTK-lagringsplatsen i Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs till namnområdet och klassnamnet

    • Katalogen med de skapade binärfilerna i vår lösning måste läggas till i PATH programmets miljö. Detta krävs eftersom vårt projekt innehåller interna DLL:er, och de läses bara in om de kan nås i standardsökvägen. Vi har lagt till följande kod i Application_Start() -metoden i global.asax:

         string pathValue = Environment.GetEnvironmentVariable("PATH");
         string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory;
         string cntkPath = domainBaseDir + @"bin\";
         pathValue += ";" + cntkPath;
         Environment.SetEnvironmentVariable("PATH", pathValue);
      

Vara värd för WebApi lokalt

Det här är de ändringar som vi har utfört hittills. Vi behöver fortfarande få CNTK Eval-funktionen inkluderad i projektet och behöver en modell för att utvärdera.

Lägg till CNTK Eval-funktionen i projektet. Detta är tillgängligt som ett NuGet-paket. I VS väljer du Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution..., väljer nuget.org som onlinekälla, söker CNTK efter och installerar den senaste paketversionen (CNTK.GPU eller CNTK.CPUOnly) i projektet.

NuGet

Nu behöver vi en modell för att utvärdera. Ladda ned ResNet20_CIFAR10_CNTK.model och spara den i katalogen CNTK\Models under projektmappen. Modellfilen måste också ingå i lösningen (Project -> Add existing Item)

CNTK kräver en 64-bitars körningsmiljö. Kontrollera i Configuration Manager att projektet har kompilerats för x64-plattformen. Dessutom måste den WebApi som vi skapar finnas i en 64-bitars instans av IIS. Du kan framtvinga detta genom att välja "Använd 64-bitarsversion av IIS Express för webbplatser och projekt" iTools -> Options -> Project and Solutions -> WebProjects

Project

Nu har du utfört alla nödvändiga steg för att köra modellen lokalt på datorn. I Visual Studio trycker du F5 på för att köra projektet. Då öppnas en webbläsare på standardwebbplatsen och ett felmeddelande visas. Detta är förväntat eftersom vi har skapat en WebApi och inte en webbplats. Vi anropar enkelt den implementerade WebApi genom att ändra adressen i webbläsaren till:

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

Då anropas Get() metoden i ValuesController-Class som i sin tur anropar metoden EvaluateCustomDNN() och returnerar ett resultat till webbläsaren

Lokala

Vara värd för WebApi på Azure

Med detta har vi slutfört den första delen av vårt uppdrag, nu behöver vi den här funktionen i Azure! På menyn Skapa i projektet väljer du kommandot Publish . Välj Microsoft Azure App Service som publiceringsmål

Azure

I dialogrutan AppService måste du logga in med ditt konto och välja lämplig prenumeration och resursgrupp. Se till att välja en resursgrupp som stöder 64-bitars virtuella datorer (den kostnadsfria resursgruppen räcker inte för detta). Under de sista publiceringsstegen måste du välja en x64-konfiguration på inställningsmenyn. Detta krävs för att även publicera de inbyggda binära komponenterna i CNTK till Azure

AzureSettings

När du publicerar din modell och anropar din publicerade WebApi i webbläsaren visas ett felmeddelande. Öppna Azure Portal och se till att din WebApi körs på en 64-bitarsplattform (ändra och "spara" inställningen om det behövs. Detta startar även om din virtuella datorinstans i Azure).

Azure64Inställningar

När du har utfört ändringarna kan du anropa webapi under http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

Det här projektet visade hur du integrerar CNTK Eval-funktionen med hjälp av CNTK Library Managed API i en Azure WebApi och konfigurerar Azure för att köra CNTK eval binärfiler. I nästa steg kan du nu lägga till nya API:er för att dynamiskt tillhandahålla data till eval-funktionen eller ladda upp en ny modellversion. Det här är webapi-/Azure-utvecklingsuppgifter och du bör läsa Azure-dokumentationen för detta.