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 201x
fare 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 CNTKAggiunta della funzione
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Questa funzione è stata adottata dagli esempi CNTK Eval (metodoEvaluateImageClassificationModel
dal repository CNTK nel fileExamples\Evaluation\CSEvalClient\Program.cs
)Aggiunto il file
CNTKImageProcessing.cs
per aggiungere una funzionalità di ridimensionamento bitmap. Si tratta di origine dal repository CNTK nelloExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
spazio dei nomi e nel nome della classeLa 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 nelApplication_Start()
metodo 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 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.GPU
o CNTK.CPUOnly
) nel progetto.
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
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
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
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
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).
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 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.