Delen via


Een model evalueren in een Azure WebApi met behulp van EvalDll

We begeleiden u naar de vereiste stappen voor het implementeren van een CNTK-model in Azure en het verzenden van webaanvragen naar het Azure-eindpunt om gegevens te evalueren op basis van het geïmplementeerde model. We bouwen deze functionaliteit in de vorm van een WebApi, maar richten ons op de meest eenvoudige Azure-functionaliteit. Raadpleeg de meer geavanceerde Azure-documentatie voor meer informatie over alle geavanceerde vaardigheden, d.w.w.v. het doorgeven van parameters, enzovoort.

Vereisten

Omdat we momenteel VS2015 gebruiken om CNTK te bouwen, richten we ons op deze versie van Visual Studio.

Webontwikkelingsfunctie voor Visual Studio

U moet Web-Development functies inschakelen in Visual Studio. U kunt zien of deze functie is ingeschakeld (en indien nodig inschakelen) door het VS-installatieprogramma opnieuw uit te voeren (Control Panel -> Program and Features -> Microsoft Visual Studio 201xklik met de rechtermuisknop en selecteer Change om het VS-installatieprogramma aan te roepen)

Azure SDK

De Azure SDK voor .NET moet worden geïnstalleerd op uw ontwikkelcomputer. De downloadpagina hiervoor is: Azure SDK Downloaden

Azure-account

Omdat we het CNTK-model in Azure gaan hosten, hebt u een Azure-account nodig. Als u een MSDN- of Visual Studio-abonnement hebt, is dat account voldoende om uw model voor deze zelfstudie te hosten. CNTK vereist dat een 64-bits virtuele machine wordt gehost, bevat een gratis Azure-account deze mogelijkheid niet en is niet voldoende.

In eerste instantie ontwikkelen we de WebApi lokaal en uploaden we deze vervolgens naar ons Azure-exemplaar. U kunt dus het merendeel van de stappen volgen, zelfs zonder toegang tot Azure.

Laten we aan de slag gaan

We hebben al een projectblauwdruk gemaakt met de naam EvalDll_AzureTutorial. Dit project maakt deel uit van de CNTK GitHub opslagplaats en vindt u in de mapExamples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial.

Houd er rekening mee dat het voorbeeldproject gebruikmaakt van CNTK EvalDll-API. Voor gebruikers die een model gebruiken dat is getraind met Python, gebruikt u CNTK Library-API. De zelfstudie voor het gebruik van CNTK Library vindt u in Evaluate a model in Azure WebApi met behulp van CNTK Library Managed API

We raden u aan om te beginnen met deze oplossing, omdat we al alle benodigde code hebben toegevoegd. Volledigheid hier is de lijst met bewerkingen voor het maken van het zelfstudieproject:

  • We zijn begonnen met het maken van een nieuw project/oplossing in VisualStudio vanaf File->New->Project->Visual C#->Web->ASP.NET WebApplication: EvalDll_AzureTutorial. We hebben een Azure API App-sjabloon gekozen, verwijzingen toegevoegd aan 'Web-API' en ervoor gezorgd dat deze lokaal wordt gehost (nog niet gehost in de cloud).

  • Vervolgens hebben we de volgende codewijzigingen uitgevoerd om het zelfstudieproject te bouwen:

    • In de ValueController.cs hebben we enkele vereiste richtlijnen toegevoegd

    • De code public async Task<IEnumerable<string>> Get() is vervangen om onze CNTK evaluatiefunctie daadwerkelijk aan te roepen

    • De functie public async Task<string[]> EvaluateCustomDNN(string imageUrl)is toegevoegd. We hebben deze functie overgenomen uit onze CNTK Eval-voorbeelden (methode EvaluateImageClassificationModel uit de CNTK opslagplaats in het bestandExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs)

    • Het bestand CNTKImageProcessing.cs toegevoegd om de functionaliteit bitmapgrootte toe te voegen. Dit is afkomstig van de CNTK opslagplaats in Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs naamruimte en klassenaam

    • De map met de gemaakte binaire bestanden in onze oplossing moet worden toegevoegd aan de PATH omgeving van de toepassing. Dit is vereist omdat ons project systeemeigen DLL's bevat en deze alleen worden geladen als ze bereikbaar zijn in het standaardzoekpad. We hebben de volgende code toegevoegd aan de Application_Start() methode in global.asax:

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

De WebApi lokaal hosten

Dit zijn de wijzigingen die we tot nu toe hebben uitgevoerd. We moeten nog steeds de CNTK Eval-functionaliteit in het project ophalen en een model nodig hebben om te evalueren.

Voeg de CNTK Eval-functionaliteit toe aan het project. Dit is beschikbaar als Een NuGet-pakket. Selecteer in VS de optie Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution..., kies nuget.org deze als de onlinebron, zoek CNTK en installeer de meest recente pakketversie (Microsoft.Research.CNTK.*).

NuGet

Nu hebben we een model nodig om te evalueren. Download het ResNet_18.model en sla het op in de map CNTK\Models in de oplossing. Het modelbestand moet ook worden opgenomen in de oplossing (Project -> Add existing Item)

CNTK vereist een 64-bits runtime-omgeving. Zorg ervoor dat in de Configuration Manager dat het project is gecompileerd voor het x64-platform. Daarnaast moet de WebApi die we maken, worden gehost in een 64-bits exemplaar van IIS. U kunt dit afdwingen door '64-bits versie van IIS Express gebruiken voor websites en projecten' te selecteren inTools -> Options -> Project and Solutions -> WebProjects

Project

Op dit moment hebt u alle benodigde stappen uitgevoerd om het model lokaal op uw computer uit te voeren. Druk in Visual Studio om F5 het project uit te voeren. Hiermee opent u een internetbrowser op de standaardwebsite en wordt er een foutbericht weergegeven. Dit is te verwachten omdat we een WebApi hebben gemaakt en geen website. We noemen de geïmplementeerde WebApi eenvoudig door het adres in de browser te wijzigen in:

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

Hiermee wordt de Get() methode aangeroepen in de ValuesController-Class die op zijn beurt de methode EvaluateCustomDNN() aanroept en een resultaat retourneert naar uw webbrowser

local

De WebApi hosten in Azure

Hiermee hebben we het eerste deel van onze missie bereikt, nu hebben we deze functionaliteit nodig die wordt gehost in Azure. Selecteer in het menu Opbouwen van uw project de Publish opdracht. Kiezen Microsoft Azure App Service als publicatiedoel

Azure

In het dialoogvenster AppService moet u zich aanmelden met uw account en het juiste abonnement en de juiste resourcegroep selecteren. Zorg ervoor dat u een resourcegroep kiest die ondersteuning biedt voor 64-bits virtuele machines (de gratis resourcegroep is hiervoor niet voldoende). Tijdens de laatste publicatiestappen moet u een x64-configuratie kiezen in het menu Instelling. Dit is vereist om ook de systeemeigen binaire onderdelen van CNTK te publiceren naar Azure

AzureSettings

Zodra u het model publiceert en u uw gepubliceerde WebApi in de browser aanroept, wordt er een foutbericht weergegeven. Open de Azure Portal en zorg ervoor dat uw WebApi wordt uitgevoerd op een 64-bits platform (wijzig en sla de instelling op indien nodig op, zodat uw exemplaar van de virtuele machine ook opnieuw wordt opgestart in Azure).

Azure64Settings

Zodra u deze wijzigingen hebt uitgevoerd, kunt u webapi aanroepen onder http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

In dit project hebt u laten zien hoe u de CNTK Eval-functionaliteit integreert met behulp van EvalDll in een Azure WebApi en Azure instelt om de binaire CNTK eval-bestanden uit te voeren. In een volgende stap kunt u nu nieuwe API's toevoegen om gegevens dynamisch aan de eval-functie te leveren of een nieuwe modelversie te uploaden. Dit zijn WebApi-/Azure-ontwikkelingstaken. Raadpleeg hiervoor de Azure-documentatie.