Utvärdera en modell i en Azure WebApi med hjälp av EvalDll
Vi vägleder dig till 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 VS2015 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 201x
hö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 den 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, inkluderar inte ett kostnadsfritt Azure-konto 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 projektritning med namnet EvalDll_AzureTutorial. Det här projektet är en del av CNTK GitHub-lagringsplatsen och finns i mappen Examples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
.
Observera att exempelprojektet använder CNTK EvalDll API. För användare som använder en modell som tränats med Python använder du CNTK Library API. Självstudien för att använda CNTK-bibliotek finns i Utvärdera en modell i Azure WebApi med hjälp av hanterat API för CNTK-bibliotek
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
: EvalDll_AzureTutorial. 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ärderingsfunktionFunktionen
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
har lagts till . Vi har implementerat den här funktionen från våra CNTK Eval-exempel (metodEvaluateImageClassificationModel
från CNTK-lagringsplatsen i filenExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
)CNTKImageProcessing.cs
Filen har lagts till för att lägga till en bitmappsändringsfunktion. Detta kommer från den CNTK lagringsplatsen iExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
till namnområdet och klassnamnetKatalogen 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 iApplication_Start()
-metoden iglobal.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 som ingår i projektet och behöver en modell för att utvärdera.
Lägg till funktionen CNTK Eval i projektet. Detta är tillgängligt som ett NuGet-paket. I VS väljer du , väljer nuget.org
som onlinekälla, söker CNTK
efter och installerar den senaste paketversionen (Microsoft.Research.CNTK.*
).Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...
Nu behöver vi en modell för att utvärdera. Ladda ned ResNet_18.model och spara den i katalogen CNTK\Models
i lösningen. 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
Nu har du utfört alla nödvändiga steg för att köra modellen lokalt på datorn. Tryck på Visual Studio F5
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
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
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 interna binära komponenterna i CNTK till Azure
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).
När du har utfört ändringarna kan du anropa webapi under http://<yourwebapp>.azurewebsites.net/api/values
Det här projektet visade hur du integrerar funktionen CNTK Eval med hjälp av EvalDll 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.