Bewerten eines Modells in einem Azure WebApi mithilfe von EvalDll

Wir führen Sie zu den erforderlichen Schritten zum Bereitstellen eines CNTK Modells in Azure und senden Webanforderungen an den Azure-Endpunkt, um Daten gegen das bereitgestellte Modell zu bewerten. Wir erstellen diese Funktionalität in Form einer WebApi, konzentrieren uns jedoch auf die einfachste Azure-Funktionalität. Weitere Erweiterte Azure-Dokumentation finden Sie in der Informationen zu allen erweiterten Fähigkeiten, d. h. zum Übergeben von Parametern usw.

Anforderungen

Da wir derzeit VS2015 verwenden, um CNTK zu erstellen, 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 bei Bedarf 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 Change Sie aus, 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 diese dann in unsere Azure-Instanz hoch. Daher können Sie die Mehrheit der Schritte auch ohne Zugriff auf Azure ausführen.

Fangen wir an

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

Bitte beachten Sie, dass das Beispielprojekt CNTK EvalDll-API verwendet. Für Benutzer, die ein Modell verwenden, das mit Python trainiert wurde, verwenden Sie bitte CNTK Bibliotheks-API. Das Lernprogramm für die Verwendung CNTK Bibliothek finden Sie unter "Auswerten eines Modells" in Azure WebApi mithilfe CNTK verwalteten Bibliotheks-API

Wir empfehlen Ihnen, mit dieser Lösung zu beginnen, da wir bereits alle 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: EvalDll_AzureTutorial 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:

    • Im ValueController.cs haben wir einige erforderliche Richtlinien hinzugefügt.

    • Ersetzen Sie den Codepublic async Task<IEnumerable<string>> Get(), um unsere CNTK Auswertungsfunktion tatsächlich aufrufen zu können.

    • 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\LegacyEvalDll\CSEvalClient\Program.cs) angenommen.

    • Die Datei CNTKImageProcessing.cs wurde hinzugefügt, um eine Bitmap-Resize-Funktionalität hinzuzufügen. Dies stammt aus dem CNTK-Repository in Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs den Namespace- und Klassennamen

    • Das Verzeichnis der erstellten Binärdateien in unserer Lösung muss zur Umgebung der Anwendung hinzugefügt PATH werden. Dies ist erforderlich, da unser Projekt native DLLs enthält und diese nur geladen werden, wenn sie im Standardsuchepfad erreichbar sind. Wir haben den folgenden Code in der Application_Start() Methode hinzugefügt:global.asax

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

Hosten des WebApi lokal

Dies sind die änderungen, die wir bisher durchgeführt haben. Wir müssen weiterhin die CNTK Eval-Funktionalität im Projekt abrufen 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 Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...in VS die Option als Onlinequelle aus, suchen CNTK Und installieren Sie die neueste Paketversion (Microsoft.Research.CNTK.*).nuget.org

NuGet

Jetzt benötigen wir ein Modell, das ausgewertet werden soll. Laden Sie das ResNet_18.model herunter, und speichern Sie sie im Verzeichnis CNTK\Models in der Lösung. 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

Project

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

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

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

local

Hosten des 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" des Projekts den Publish Befehl aus. Wählen Sie als Veröffentlichungsziel aus 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 64-Bit-virtuelle Computer unterstützt (die Ressourcengruppe "Frei" ist für dies nicht ausreichend). Während der letzten Veröffentlichungsschritte müssen Sie eine x64-Konfiguration im Menü "Einstellung" 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, falls erforderlich, dies wird auch ihre virtuelle Computerinstanz in Azure neu gestartet).

Azure64Settings

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

AzureSettings

In diesem Projekt wurde gezeigt, wie Sie die CNTK Eval-Funktionalität mithilfe von EvalDll in einer 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 liefern oder neue Modellversion hochzuladen. Dies sind WebApi/Azure-Entwicklungsaufgaben, und Sie sollten sich auf die Azure-Dokumentation hierzu beziehen.