Condividi tramite


Valutare un modello in un WebApi di Azure usando l'API gestita della libreria CNTK

Distribuire tramite la riga di comando di Azure Machine Learning

Un modo per distribuire un modello CNTK in Azure e poter eseguire il modello distribuito tramite API Web è tramite un'interfaccia della riga di comando in Azure Machine Learning. Fare clic qui per informazioni su come.

Distribuire tramite ASP.NET

Verranno illustrati i passaggi necessari per distribuire un modello CNTK in Azure e inviare richieste Web all'endpoint di Azure per valutare i dati rispetto al modello distribuito. Si creerà questa funzionalità sotto forma di WebApi, ma si concentra sulla funzionalità di Azure più di base. Per informazioni su tutte le abilità avanzate, vedere la documentazione di Azure più avanzata, ad esempio il passaggio di parametri e così via.

Requisiti

Poiché attualmente si usa VS2017 per compilare CNTK, ci si concentra su questa versione di Visual Studio.

Funzionalità di sviluppo Web per Visual Studio

È necessario abilitare le funzionalità di Web-Development in Visual Studio. È possibile verificare se questa funzionalità è abilitata (e abilitare se necessario) eseguendo di nuovo il programma di installazione di VS (Control Panel -> Program and Features -> Microsoft Visual Studio 201xfare clic con il pulsante destro del mouse e selezionare Change per richiamare il programma di installazione di VS)

Azure SDK

Azure SDK per .NET deve essere installato nel computer di sviluppo. La pagina di download per questa operazione è: Download di Azure SDK

Account Azure

Poiché si ospiterà il modello CNTK in Azure, sarà necessario un account Azure. Se si dispone di una sottoscrizione MSDN o Visual Studio, tale account sarà sufficiente per ospitare il modello per questa esercitazione. CNTK richiede una macchina virtuale a 64 bit da ospitare, un account Azure gratuito non include questa funzionalità e non sarà sufficiente.

Inizialmente verrà sviluppato WebApi in locale e quindi caricato nell'istanza di Azure. Sarà quindi possibile seguire la maggior parte dei passaggi anche senza accesso ad Azure.

Iniziamo

È già stato creato un progetto di progetto denominato CNTKAzureTutorial01. Questo progetto fa parte del repository GitHub CNTK e può essere trovato nella cartella Examples\Evaluation\CNTKAzureTutorial01.

Si noti che il progetto di esempio usa l'API gestita della libreria CNTK. Per gli utenti che usano l'API EvalDll, per valutare il modello, usare l'API EvalDLL CNTK. L'esercitazione per l'uso di EvalDll è disponibile in Valutare un modello in Azure WebApi usando EvalDll

È consigliabile iniziare da questa soluzione, poiché è già stato aggiunto tutto il codice necessario. Per la completezza, ecco l'elenco delle operazioni per creare il progetto esercitazione:

  • È stata avviata la creazione di un nuovo progetto/soluzione in VisualStudio da File->New->Project->Visual C#->Web->ASP.NET WebApplication: CNTKAzureTutorial01. È stato selezionato un modello di app per le API di Azure, sono stati aggiunti riferimenti all'API Web e si è verificato che sia ospitato localmente (NON ospitato nel cloud).

  • Quindi sono state eseguite le modifiche al codice seguenti per compilare il progetto di esercitazione:

    • In ValueController.cs sono state aggiunte alcune direttive necessarie con le direttive

    • Sostituito il codice in public async Task<IEnumerable<string>> Get() per chiamare effettivamente la funzione di valutazione CNTK

    • Aggiunta della funzione public async Task<string[]> EvaluateCustomDNN(string imageUrl). Questa funzione è stata adottata dagli esempi CNTK Eval (metodo EvaluateImageClassificationModel dal repository CNTK nel file Examples\Evaluation\CSEvalClient\Program.cs)

    • Aggiunto il file CNTKImageProcessing.cs per aggiungere una funzionalità di ridimensionamento bitmap. Si tratta di origine dal repository CNTK nello Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs spazio dei nomi e nel nome della classe

    • La directory dei file binari creati nella soluzione deve essere aggiunta all'ambiente PATH dell'applicazione. Questa operazione è necessaria perché il progetto include DLL native e queste vengono caricate solo se sono raggiungibili nel percorso di ricerca standard. È stato aggiunto il codice seguente nel Application_Start() metodo in global.asax:

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

Hosting locale di WebApi

Queste sono le modifiche eseguite finora. È comunque necessario ottenere la funzionalità CNTK Eval inclusa nel progetto ed è necessario un modello da valutare.

Aggiungere la funzionalità CNTK Eval al progetto. Questa opzione è disponibile come pacchetto NuGet. In VS selezionare , selezionare Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...nuget.org come origine online, cercare CNTK e installare la versione più recente del pacchetto (CNTK.GPUo CNTK.CPUOnly) nel progetto.

NuGet

Ora è necessario un modello da valutare. Scaricare il ResNet20_CIFAR10_CNTK.model e salvarlo nella directory CNTK\Models nella cartella del progetto. Il file del modello deve essere incluso anche nella soluzione (Project -> Add existing Item)

CNTK richiede un ambiente di runtime a 64 bit. Assicurarsi che nel Configuration Manager che il progetto sia compilato per la piattaforma x64. Inoltre, il WebApi creato deve essere ospitato in un'istanza a 64 bit di IIS. È possibile applicare questa operazione selezionando "Usare la versione a 64 bit di IIS Express per siti Web e progetti" inTools -> Options -> Project and Solutions -> WebProjects

Project

A questo punto sono stati eseguiti tutti i passaggi necessari per eseguire il modello in locale nel computer. In Visual Studio premere F5 per eseguire il progetto. Verrà aperto un browser Internet nel sito Web predefinito e verrà visualizzato un messaggio di errore. Questo è previsto perché abbiamo creato un WebApi e non un sito Web. È possibile chiamare facilmente WebApi implementato modificando l'indirizzo nel browser in:

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

Questo chiamerà il Get() metodo nel ValuesController-Class che chiamerà il metodo EvaluateCustomDNN() e restituirà un risultato al Web browser

Locale

Hosting del WebApi in Azure

Con questa operazione è stata eseguita la prima parte della nostra missione, ora abbiamo bisogno di questa funzionalità ospitata in Azure! Nel menu Compila del progetto selezionare il Publish comando . Selezionare Microsoft Azure App Service come destinazione di pubblicazione

Azure

Nella finestra di dialogo AppService è necessario accedere con l'account e selezionare la sottoscrizione e il gruppo di risorse appropriato. Assicurarsi di selezionare un gruppo di risorse che supporta macchine virtuali a 64 bit (il gruppo di risorse "gratuito" non è sufficiente per questo). Durante i passaggi di pubblicazione finali è necessario selezionare una configurazione x64 nel menu Impostazioni. Questa operazione è necessaria anche per pubblicare i componenti binari nativi di CNTK in Azure

AzureSettings

Dopo aver pubblicato il modello e chiamare WebApi pubblicato nel browser, verrà visualizzato un messaggio di errore. Aprire il portale di Azure e assicurarsi che WebApi sia in esecuzione in una piattaforma a 64 bit (modificare e salvare l'impostazione se necessario, verrà riavviata anche l'istanza della macchina virtuale in Azure).

Azure64Settings

Dopo aver eseguito queste modifiche, sarà possibile chiamare WebApi in http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

Questo progetto ha illustrato come integrare la funzionalità CNTK Eval usando l'API gestita della libreria CNTK in un'api WebApi di Azure e configurare Azure per eseguire i file binari CNTK eval. In un passaggio successivo è ora possibile aggiungere nuove API per fornire dati in modo dinamico alla funzione eval-function o caricare la nuova versione del modello. Si tratta di attività di sviluppo WebApi/Azure e si dovrebbe fare riferimento alla documentazione di Azure per questa operazione.