Condividi tramite


Valutare un modello in un'api Web di Azure usando EvalDll

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

Requisiti

Poiché attualmente si usa VS2015 per compilare CNTK, ci concentriamo 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 abilitarla se necessario) eseguendo di nuovo il programma di installazione di Visual Studio (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 Visual Studio)

Azure SDK

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

Account Azure

Poiché il modello di CNTK verrà ospitato 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 per ospitare, un account Azure gratuito non include questa funzionalità e non sarà sufficiente.

Inizialmente si svilupperà WebApi in locale e quindi lo si caricherà nell'istanza di Azure. Sarà quindi possibile seguire la maggior parte dei passaggi anche senza accesso ad Azure.

Iniziamo

È già stato creato un progetto denominato EvalDll_AzureTutorial. Questo progetto fa parte del repository CNTK GitHub e si trova nella cartella Examples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial.

Si noti che il progetto di esempio usa CNTK'API EvalDll. Per gli utenti che usano un modello sottoposto a training con Python, usare l'API della libreria CNTK. L'esercitazione per l'uso di CNTK Library è disponibile in Evaluate a model in Azure WebApi using CNTK Library Managed API (Valutare un modello in Azure WebApi usando CNTK'API gestita della libreria)

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

  • È stata avviata la creazione di un nuovo progetto/soluzione in VisualStudio da File->New->Project->Visual C#->Web->ASP.NET WebApplication: EvalDll_AzureTutorial. È stato scelto 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).

  • Sono state quindi eseguite le modifiche di codice seguenti per compilare il progetto di esercitazione:

    • In ValueController.cs sono state aggiunte alcune direttive using necessarie

    • 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 di CNTK Eval (metodo EvaluateImageClassificationModel dal repository CNTK nel file Examples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs)

    • Aggiunta del file CNTKImageProcessing.cs per aggiungere una funzionalità di ridimensionamento bitmap. Si tratta di origine dal repository CNTK in Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs allo spazio dei nomi e al nome della classe

    • La directory dei file binari creati nella soluzione deve essere aggiunta all'ambiente PATH dell'applicazione. Ciò è necessario perché il progetto include DLL native e quelle vengono caricate solo se raggiungibili nel percorso di ricerca standard. Nel metodo in Application_Start() è stato aggiunto il codice seguente 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 apportate 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 Visual Studio 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 (Microsoft.Research.CNTK.*).

NuGet

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

CNTK richiede un ambiente di runtime a 64 bit. Assicurarsi nella Configuration Manager che il progetto sia compilato per la piattaforma x64. Inoltre, l'API Web creata deve essere ospitata 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. Questa operazione deve essere prevista perché è stata creata un'api Web e non un sito Web. È possibile chiamare facilmente WebApi implementato modificando l'indirizzo nel browser in:

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

Verrà chiamato il Get() metodo nel ValuesController-Class che a sua volta chiamerà il metodo EvaluateCustomDNN() e restituirà un risultato al Web browser

local

Hosting di WebApi in Azure

Con questa operazione è stata completata la prima parte della missione, ora è necessaria questa funzionalità ospitata in Azure. Dal 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 appropriati. 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 aver chiamato l'API Web pubblicata 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 EvalDll in un'api Web di Azure e configurare Azure per eseguire i file binari CNTK eval. In un passaggio successivo è ora possibile aggiungere nuove API per fornire dinamicamente dati alla funzione eval o caricare una nuova versione del modello. Si tratta di attività di sviluppo WebApi/Azure e per questa operazione è necessario fare riferimento alla documentazione di Azure.