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 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 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ärderingsfunktionFunktionen
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
har lagts till . Vi antog den här funktionen från våra CNTK Eval-exempel (metodEvaluateImageClassificationModel
från CNTK-lagringsplatsen i filenExamples\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 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 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.
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
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
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 inbyggda 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 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.