Auswerten eines Modells in einer Azure WebApi mithilfe der verwalteten CNTK-Bibliotheks-API

Bereitstellen über die Befehlszeile von Azure Machine Learning

Eine Möglichkeit zum Bereitstellen eines CNTK-Modells in Azure und die Ausführung des bereitgestellten Modells über Web-APIs erfolgt über eine Befehlszeilenschnittstelle zu Azure Machine Learning. Klicken Sie hier , um zu erfahren, wie das geht.

Bereitstellen über ASP.NET

Wir führen Sie zu den erforderlichen Schritten zum Bereitstellen eines CNTK-Modells in Azure und senden Webanforderungen an den Azure-Endpunkt, um Daten für das bereitgestellte Modell auszuwerten. Wir erstellen diese Funktionalität in Form einer WebApi, konzentrieren uns jedoch auf die grundlegende Azure-Funktionalität. Weitere Informationen zu erweiterten Azure-Dokumentationen finden Sie in der erweiterten Azure-Dokumentation, z. B. zum Übergeben von Parametern usw.

Anforderungen

Da wir derzeit VS2017 zum Erstellen von CNTK verwenden, konzentrieren wir uns auf diese Version von Visual Studio.

Webentwicklungsfeature für Visual Studio

Sie müssen Web-Development Features in Visual Studio aktivieren. Sie können sehen, ob dieses Feature aktiviert ist (und ggf. aktiviert ist), indem Sie das VS-Installationsprogramm erneut ausführen (Control Panel -> Program and Features -> Microsoft Visual Studio 201xklicken Sie mit der rechten Maustaste, und wählen Sie aus Change , um das VS-Installationsprogramm aufzurufen)

Azure SDK

Das Azure SDK für .NET muss auf Ihrem Entwicklungscomputer installiert werden. Die Downloadseite für dies ist: Azure SDK Download

Azure-Konto

Da wir das CNTK-Modell in Azure hosten werden, benötigen Sie ein Azure-Konto. Wenn Sie über ein MSDN- oder Visual Studio-Abonnement verfügen, reicht dieses Konto aus, um Ihr Modell für dieses Lernprogramm zu hosten. CNTK erfordert einen virtuellen 64-Bit-Computer zum Hosten, ein kostenloses Azure-Konto enthält diese Funktion nicht und ist nicht ausreichend.

Zunächst entwickeln wir das WebApi lokal, und laden sie dann in unsere Azure-Instanz hoch. Daher können Sie den Großteil der Schritte auch ohne Zugriff auf Azure befolgen.

Fangen wir an

Wir haben bereits einen Projektplan namens CNTKAzureTutorial01 erstellt. Dieses Projekt ist Teil des CNTK GitHub-Repositorys und kann im Ordner Examples\Evaluation\CNTKAzureTutorial01gefunden werden.

Bitte beachten Sie, dass das Beispielprojekt die verwaltete CNTK-Bibliotheks-API verwendet. Für Benutzer, die die EvalDll-API verwenden, verwenden Sie zum Auswerten des Modells die CNTK EvalDLL-API. Das Lernprogramm für die Verwendung von EvalDll finden Sie unter "Auswerten eines Modells in Azure WebApi mit EvalDll"

Wir empfehlen, mit dieser Lösung zu beginnen, da wir bereits den benötigten Code hinzugefügt haben. Hier finden Sie die Liste der Vorgänge zum Erstellen des Lernprogrammprojekts:

  • Wir haben begonnen, ein neues Projekt/eine neue Lösung in VisualStudio aus File->New->Project->Visual C#->Web->ASP.NET WebApplication: CNTKAzureTutorial01 zu erstellen. Wir haben eine Azure-API-App-Vorlage ausgewählt, Verweise auf "Web-API" hinzugefügt und sichergestellt, dass sie lokal gehostet wird (NOCH NICHT in der Cloud gehostet).

  • Anschließend haben wir die folgenden Codeänderungen ausgeführt, um das Lernprogrammprojekt zu erstellen:

    • In der ValueController.cs haben wir einige erforderliche Direktiven hinzugefügt.

    • Ersetzt den Code, public async Task<IEnumerable<string>> Get() um tatsächlich unsere CNTK-Auswertungsfunktion aufzurufen.

    • Die Funktion public async Task<string[]> EvaluateCustomDNN(string imageUrl)wurde hinzugefügt. Wir haben diese Funktion aus unseren CNTK Eval-Beispielen (Methode EvaluateImageClassificationModel aus dem CNTK-Repository in der Datei Examples\Evaluation\CSEvalClient\Program.cs) übernommen.

    • Die Datei CNTKImageProcessing.cs wurde hinzugefügt, um eine Bitmap-Größenänderungsfunktion hinzuzufügen. Dies stammt aus dem CNTK-Repository in Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs Namespace und Klassenname

    • Das Verzeichnis der erstellten Binärdateien in unserer Lösung muss der PATH Umgebung der Anwendung hinzugefügt werden. Dies ist erforderlich, da unser Projekt native DLLs enthält und diese nur geladen werden, wenn sie im Standardsuchpfad erreichbar sind. Wir haben den folgenden Code in der 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);
      

Lokales Hosten der WebApi

Dies sind die bisher durchgeführten Änderungen. Wir müssen weiterhin die CNTK Eval-Funktionalität abrufen, die im Projekt enthalten ist und ein Modell zur Auswertung benötigen.

Fügen Sie dem Projekt die CNTK Eval-Funktionalität hinzu. Dies ist als NuGet-Paket verfügbar. Wählen Sie in VS die Option Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...nuget.org als Onlinequelle aus, suchen CNTK Und installieren Sie die neueste Paketversion (CNTK.GPU oder CNTK.CPUOnly) im Projekt.

NuGet

Jetzt benötigen wir ein Modell, das ausgewertet werden soll. Laden Sie die ResNet20_CIFAR10_CNTK.model herunter, und speichern Sie sie im Verzeichnis CNTK\Models unter dem Projektordner. Die Modelldatei muss auch in die Lösung einbezogen werden (Project -> Add existing Item)

CNTK erfordert eine 64-Bit-Laufzeitumgebung. Stellen Sie sicher, dass das Projekt in der Configuration Manager für die x64-Plattform kompiliert wird. Darüber hinaus muss die webApi, die wir erstellen, in einer 64-Bit-Instanz von IIS gehostet werden. Sie können dies erzwingen, indem Sie "64-Bit-Version von IIS Express für Websites und Projekte verwenden" inTools -> Options -> Project and Solutions -> WebProjects

Projekt

An diesem Punkt haben Sie alle erforderlichen Schritte ausgeführt, um das Modell lokal auf Ihrem Computer auszuführen. Drücken F5 Sie in Visual Studio, um das Projekt auszuführen. Dadurch wird ein Internetbrowser auf der Standardwebsite geöffnet und eine Fehlermeldung angezeigt. Dies ist zu erwarten, da wir ein WebApi erstellt haben und keine Website. Wir rufen die implementierte WebApi ganz einfach auf, indem wir die Adresse im Browser ändern in:

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

Dadurch wird die Get() Methode in der ValuesController-Class aufgerufen, die wiederum die Methode EvaluateCustomDNN() aufruft und ein Ergebnis an Ihren Webbrowser zurückgibt.

lokal

Hosten der WebApi auf Azure

Mit dieser Aufgabe haben wir den ersten Teil unserer Mission erreicht, jetzt benötigen wir diese Funktionalität, die in Azure gehostet wird! Wählen Sie im Menü "Erstellen" ihres Projekts den Publish Befehl aus. Als Veröffentlichungsziel auswählen Microsoft Azure App Service

Azure

Im Dialogfeld "AppService" müssen Sie sich mit Ihrem Konto anmelden und die entsprechende Abonnement- und Ressourcengruppe auswählen. Stellen Sie sicher, dass Sie eine Ressourcengruppe auswählen, die virtuelle 64-Bit-Computer unterstützt (die "kostenlose" Ressourcengruppe reicht dafür nicht aus). Während der letzten Veröffentlichungsschritte müssen Sie im Menü "Einstellung" eine x64-Konfiguration auswählen. Dies ist erforderlich, um auch die systemeigenen binären Komponenten von CNTK in Azure zu veröffentlichen.

AzureSettings

Sobald Sie das Modell veröffentlichen und Ihr veröffentlichtes WebApi im Browser aufrufen, wird eine Fehlermeldung angezeigt. Öffnen Sie die Azure-Portal, und stellen Sie sicher, dass Ihre WebApi auf einer 64-Bit-Plattform ausgeführt wird (Ändern und Speichern der Einstellung bei Bedarf, dies wird auch die Instanz Ihres virtuellen Computers in Azure neu gestartet).

Azure64Settings

Nachdem Sie diese Änderungen ausgeführt haben, können Sie WebApi unter http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

In diesem Projekt wurde gezeigt, wie Sie die CNTK Eval-Funktionalität mithilfe der verwalteten CNTK-Bibliotheks-API in eine Azure WebApi integrieren und Azure einrichten, um die CNTK eval binaries auszuführen. Im nächsten Schritt können Sie jetzt neue APIs hinzufügen, um Daten dynamisch zur eval-Funktion zu übermitteln oder neue Modellversion hochzuladen. Dies sind WebApi/Azure-Entwicklungsaufgaben, und Sie sollten sich auf die Azure-Dokumentation beziehen.