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 201x
fare 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 CNTKAggiunta della funzione
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Questa funzione è stata adottata dagli esempi di CNTK Eval (metodoEvaluateImageClassificationModel
dal repository CNTK nel fileExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
)Aggiunta del file
CNTKImageProcessing.cs
per aggiungere una funzionalità di ridimensionamento bitmap. Si tratta di origine dal repository CNTK inExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
allo spazio dei nomi e al nome della classeLa 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 inApplication_Start()
è stato aggiunto il codice seguente inglobal.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.*
).
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
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
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
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
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).
Dopo aver eseguito queste modifiche, sarà possibile chiamare WebApi in http://<yourwebapp>.azurewebsites.net/api/values
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.