Freigeben über


Modellbewertung auf Windows

Derzeit bietet CNTK Bibliotheken in C++, C#/.NET, Python und Java zum Laden und Bewerten von Modellen auf Windows. Ab v2.1 unterstützt CNTK auch Universelle Windows-Plattform (UWP).

Verwenden der verwalteten C#/.NET-API

Die CNTK Bibliothek bietet eine verwaltete Bibliothek (.NET) für die Auswertung von CNTK Modellen auf CPU und GPU mithilfe von C# und anderen .NET-Sprachen. Das NuGet Paket CNTK. CPUOnly ist für die Ausführung auf CPU und den CNTK konzipiert. GPU ist für die Ausführung auf Geräten mit NVIDIA GPU konzipiert. Weitere Informationen zum Installieren CNTK Bibliothek NuGet Pakete finden Sie auf der Seite NuGet Paketen. Bitte beachten Sie, dass Visual Studio 2017 erforderlich ist und die Zielplattform in der Projekteigenschaft X64 sein sollte.

Mit der verwalteten CNTK Bibliotheks-API können Sie vorab trainierte Modelle auf angegebenen Geräten (CPU oder GPU) laden und auswerten. Darüber hinaus bietet es verschiedene Möglichkeiten, um Eingabe- und Ausgabedaten im dichten, einmaligen Vektor- oder sparse CSC-Format vorzubereiten. Die Eingabedaten können ein einzelnes Beispiel, eine Batch von mehreren Beispielen, eine Sequenz von Beispielen oder eine Reihe von Sequenzen mit variablen Längen sein. Eine detaillierte Beschreibung des Batch- und Sequenzformats finden Sie auf der Seite CNTK Konzepte. Nach der Auswertung bietet die API praktische Methoden zum Abrufen von Ergebnissen.

C#/.NET-Programmierhandbuch

Die üblichen Schritte für die Modellbewertung mithilfe CNTK verwalteten Bibliotheks-API umfassen:

  1. Installieren Sie das entsprechende NuGet-Paket (CPU oder GPU je nach Nutzung) auf Ihre Person. Details werden im CNTK NuGet Paket beschrieben.
  2. Laden Sie das Modell nach Function.Load(). Der zurückgegebene Wert ist eine Function Instanz, die auf das geladene Modell verweist.
  3. Wenn erforderlich, rufen Sie Eingaben und Ausgabe des geladenen Modells ab, indem Sie die Eigenschaften ArgumentsOutput aufrufen oder Outputs die Funktionsinstanz, die von Load(zurückgegeben wird) aufrufen. Die Eingaben und Ausgabe werden als Variabledargestellt. Weitere Informationen zu jeder einzelnen Eingabe oder Ausgabe, z. B. Name oder Shape können durch Aufrufen entsprechender Eigenschaften der Variable gefunden werden.
  4. Bereiten Sie für jede Eingabedaten für die Auswertung vor. Je nach Verwendung können Eingabedaten aus einem einzelnen Beispiel, einem Batch mehrerer Beispiele, einer Sequenz von Beispielen oder einer Reihe von Sequenzen mit variabler Länge bestehen. In Bezug auf den Speicher kann die Eingabedaten im dichten Format, einem einzigen Hot Vector oder im sparse CSC-Format enthalten sein. Das Value Objekt wird verwendet, um die Eingabedaten mit unterschiedlichen Inhalten und Formaten darzustellen. Die CNTK-API bietet verschiedene Methoden zum einfachen Erstellen des Value-Objekts aus einfachen Benutzerdaten.
    • CreateBatch() erstellt ein Value-Objekt, das einen Batch von einzelnen oder mehreren Beispielen enthält.
    • CreateSequence() erstellt ein Value-Objekt, das eine Sequenz mit mehreren Beispielen enthält. Es ist möglich, anzugeben, ob diese Sequenz eine neue Sequenz oder Fortsetzung einer vorherigen Sequenz in der Liste der Sequenzen aus einem vorherigen Aufruf dieser Methode ist.
    • CreateBatchOfSequences() erstellt ein Value-Objekt, das einen Batch von Sequenzen enthält. Jede Sequenz verfügt über eine variable Länge von Beispielen. Alle oben genannten Methoden unterstützen sowohl das dichte, one-hot Vector- oder sparse CSC-Format.
  5. Rufen Sie die Methode auf, um die Evaluate() Auswertung auszuführen. Der Parameter arguments definiert Eingabevariablen und deren zugeordnete Werte und outputs definiert Ausgabevariablen. Wenn das Value-Objekt einer Ausgabevariable istnull, CNTK Library den tatsächlichen Speicher für den Ausgabewert zuordnet. Zur Rückgabe speichertValu() die Auswertungsergebnisse in den Wertobjekten, die den Ausgabevariablen zugeordnet sind.
  6. Rufen Sie die GetDenseData()/GetOneHotData() Methode des Ausgabewerts auf, um die Ergebnisse im einfachen Datenformat abzurufen. Es kopiert die in dem Value-Objekt gespeicherten Daten in den Puffer als Liste der Sequenzen mit variablen Längenbeispielen, entweder im dichten Format oder im 1-Hot-Vector-Format (Unterstützung für das Sparseformat wird bald hinzugefügt).

Die CNTK verwaltete Bibliotheks-API wird auf der CNTK Library C#/.NET Managed API-Seite beschrieben.

Auswertung mehrerer Anforderungen parallel

CNTK unterstützt die Auswertung mehrerer Anforderungen parallel. Da die Ausführung der Auswertung auf derselben Modellinstanz nicht threadsicher ist, ist es zuerst erforderlich, mehrere Modellinstanzen zu erstellen, indem Sie Clone() mit ParameterCloningMethod.Shareaufrufen, und dann verwendet jeder Thread eine separate Modellinstanz für die Auswertung. Die EvaluateMultipleImagesInParallelAsync() veranschaulicht, wie gleichzeitige Anforderungen mithilfe CNTK C#/.NET Managed API ausgewertet werden.

Asynchrone Auswertung ausführen

CNTK C#-API verfügt nicht über eine asynchrone Methode für Evaluate(), da die Auswertung ein CPU-gebundener Vorgang ist (Bitte verweisen Sie auf [diesen Artikel] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) für detaillierte Erläuterungen). Es ist jedoch gewünscht, die Auswertung asynchron in einigen Anwendungsfällen auszuführen, z. B. Offloading für Reaktionsfähigkeit, wir zeigen im Beispiel EvaluationSingleImageAsync() , wie dies mithilfe der Erweiterungsmethode EvaluateAsync()erreicht wird.

Auswerten von Zwischenebenen

CNTK C#-API kann eine Zwischenschicht in einem Modelldiagramm auswerten. Zu diesem Zweck kann die gewünschte Ebene durch seinen Namen gefunden werden, und die Zwischenschicht kann ausgewertet werden. Das Beispiel "ValuIntermediateLayer() " in C# veranschaulicht, wie eine Zwischenschicht in einem Modell ausgewertet wird.

Auswerten von Ausgaben aus mehreren Knoten

CNTK können mehrere Knoten in einem Modelldiagramm auswerten, indem sie ihre Ausgabe in einen einzelnen Knoten kombinieren. Das Beispiel "ValuCombinedOutputs() " in C# veranschaulicht, wie mehrere Ausgabe ausgewertet werden.

C#-Beispiele

Das CNTKLibraryCSEvalExamples zeigt, wie ein Modell in C# mithilfe von CNTK Library-NuGet-Paketen ausgewertet wird. Weitere Informationen finden Sie auf der Seite "Eval-Beispiele " für das Erstellen und Ausführen von Beispielen.

Wenn Sie NuGet Package nicht verwenden möchten, können Sie als Verweis auf Ihr Projekt hinzufügenCntk.Core.Managed-<VERSION>.dll. Die Cntk.Core.Managed DLL und alle abhängigen DLLs finden Sie im CNTK binärversionspaket auf der Seite CNTK Versionen. Stellen Sie sicher, dass der Pfad zu Cntk.Core.Managed DLL und deren Abhängigkeiten (siehe Liste am Ende dieser Seite) im Suchpfad von DLLs für Ihre Anwendung enthalten sind.

Verwenden von C++

Die CNTK Library C++-API unterstützt die Modellbewertung in C++-Anwendungen. Sowohl Standarddesktopanwendungen als auch Universelle Windows-Plattform Anwendungen werden unterstützt. Visual Studio 2017 ist erforderlich, und die Zielplattform in der Projekteigenschaft sollte X64 sein.

Das CNTK NuGet Paket CNTK. CPUOnly und CNTK. GPU enthält C++ CNTK Library für die Verwendung CNTK in Desktopanwendungen. Um CNTK auf Universelle Windows-Plattform zu verwenden, installieren Sie CNTK. UWP. CPUOnly. Durch die Verwendung von NuGet Paketen wird die Konfiguration zu Deneinschließ- und Bibliotheksverzeichnissen automatisch ihrer Projekteigenschaft hinzugefügt. Sowohl Debug- als auch Release-Build werden unterstützt. Auf der NuGet Paketseite wird erläutert, wie Sie CNTK NuGet Pakete abrufen und installieren.

C++-Programmierhandbuch

In den folgenden Schritten wird beschrieben, wie Sie die C++-CNTK-Bibliothek für die Modellbewertung verwenden.

  1. Verknüpfen Sie die Cntk.Core-<VERSION>.lib Importbibliothek in die Anwendung. Dieser Schritt kann nicht angegeben werden, wenn Sie das NuGet Paket verwenden. Für UWP-Anwendung ist der Bibliotheksname Cnkt.Core_app-<Version>.lib.
  2. Fügen Sie die Auswertungsheaderdatei "CNTKLibrary.h" ein.
  3. Laden Sie das Modell nach CNTK::Function::Load(). Das zurückgegebene Function-Objekt stellt das Berechnungsdiagramm des Modells dar.
  4. Vorbereiten von Daten für jede Eingabevariable. Sie können ein Value-Objekt aus Ihren Eingabedaten verwenden CNTK::Value::CreateBatch()CNTK::Value::CreateSequence()oder CNTK::Value::CreateBatchOfSequences() erstellen, die einen Batch von Beispielen, eine Sequenz von Beispielen oder einen Batch von Sequenzen von Beispielen darstellen.
  5. Rufen Sie CNTK::Function::Evaluate() die Bewertung auf. Die Evaluate() erwartet als Eingabe eine unordered_map für Eingabevariablen und Eingabewerte sowie eine unordered_map für Ausgabevariablen und Ausgabewerte. Das Ausgabewertobjekt könnte null sein, was bedeutet, dass CNTK Library den tatsächlichen Speicher für diesen Ausgabewert zuordnet. Zur Rückgabe enthalten die Wertobjekte, die den Ausgabevariablen zugeordnet sind, die Ergebnisse der Auswertung.
  6. Abrufen von Ausgabedaten aus Auswertungsergebnissen. Kopieren Sie CNTK::Value::CopyVariableValueTo() die daten, die im Value-Objekt gespeichert sind, in den Puffer als Liste der Sequenzen mit variabler Länge von Beispielen.

Für die gleichzeitige Auswertung mehrerer Anforderungen CNTK::Function::Clone() sollte vor "Valu(") aufgerufen werden. Das ParallelEvaluationExample() veranschaulicht, wie mehrere Anforderungen parallel mit CNTK C++-Bibliotheks-API ausgewertet werden.

Details zu C++ CNTK Bibliotheks-API zur Auswertung finden Sie auf der Seite CNTK Library C++ Evaluation Interface.

C++-Beispiele

Die C++-Beispiele CNTKLibraryCPPEvalCPUOnlyExamples und CNTKLibraryCPPEvalGPUExamples veranschaulichen das oben genannte Verwendungsmuster. Die UWPImageRecognition enthält ein Beispiel mit CNTK UWP-Bibliothek für die Modellbewertung. Auf der Seite "Eval Beispiele " finden Sie detaillierte Schritte zum Erstellen und Ausführen von Beispielen.

Alternativ können Sie C++ CNTK Library ohne das NuGet Package verwenden. Sie können entweder (oder ) und alle abhängigen DLLs auf der CNTK Release-Seite abrufen Cntk.Core-<VERSION>.lib oder Cntk.Core_app-<Version>.libaus CNTK Quellcode erstellen. Außerdem müssen Sie den Pfad "Einschließen" und "Bibliothek" konfigurieren, um auf das richtige Verzeichnis zu verweisen, und stellen Sie sicher, dass die Buildkonfiguration (Debug oder Release) der CNTK Bibliothek identisch ist wie die der Projekteinstellung (Andernfalls erhalten Sie unerwartete Ausnahmen). Das CNTK Releasepaket enthält nur den Release-Build von Binärdateien.

Versand CNTK Bibliothek mit Ihrer Windows Anwendung

CNTK Bibliothek erfordert das Visual C++ Redistributable Paket für Visual Studio 2017 auf dem System, auf dem Ihre Anwendung ausgeführt wird. Und die Zielplattform in der Projekteigenschaft sollte X64 sein.

Auf dieser Seite wird beschrieben, wie CNTK binärdateien benannt werden.

Für Desktop-C++-Anwendungen müssen die folgenden DLLs mit Ihrer Anwendung verteilt werden.

  • Cntk.Core-<VERSION>.dll
  • Cntk.Math-<VERSION>.dll
  • libiomp5md.dll
  • mklml.dll

Wenn Sie die verwaltete C#/.NET-Bibliothek verwenden, müssen Sie neben den oben genannten DLLs zusätzlich die folgenden DLLs einschließen:

  • Cntk.Core.Managed-<VERSION>.dll
  • Cntk.Core.CSBinding-<VERSION>.dll

Für die Verwendung von GPU müssen Sie zusätzlich die folgenden NVIDIA CUDA-verwandten DLLs einschließen:

  • cublas64_90.dll
  • cudart64_90.dll
  • cudnn64_7.dll
  • curand64_90.dll
  • cusparse64_90.dll
  • nvml.dll

Hinweis

Geändert in CNTK Version 2.1.

CNTK NuGet Pakete werden mit cuDNN 6 (cudnn64_6.dll) ausgeliefert.

Alle diese DLLs finden Sie auf der CNTK binärversion, finden Sie auf der Seite CNTK Versionen.

Für UWP-Anwendungen müssen die folgenden DLLs mit Ihrer Anwendung verteilt werden. Diese DLLs finden Sie im Nuget-Paket CNTK.UWP.CPUOnly.

  • Cntk.Core_app-<VERSION>.dll
  • Cntk.Math_app-<VERSION>.dll
  • libopenblas.dll

Verwenden von Python

Sie können Python verwenden, um ein vorab trainiertes Modell zu bewerten. Beispiele finden Sie hier.

Verwenden von Java

CNTK bietet auch APIs für die Auswertung des Modells in Java-Anwendung. Bitte beachten Sie, dass die CNTK Java-API noch experimentell ist und änderungen unterliegen.

Das Java-Beispiel zeigt, wie ein CNN-Modell mithilfe der Java-API ausgewertet wird.

Um CNTK Java-Bibliothek zu verwenden, fügen Sie der classpath Java-Projekt die cntk.jar Datei hinzu. Wenn Sie mit einer IDE arbeiten, sollten Sie dies als nicht verwaltetes Jar hinzufügen. Die Datei "cntk.jar" finden Sie im CNTK binärversionspaket (im Ordner cntk\cntk\java). Sie können auch cntk.jar aus CNTK Quelle erstellen. Legen Sie auch java.library.path auf das Verzeichnis fest, das enthält, und stellen Sie sicher, dass das VerzeichnisCntk.Core.JavaBinding-<Version>.dll, das CNTK binäre DLLs enthält, im DLL-Suchpfad Ihres Systems befindet, z. B. indem Sie das Verzeichnis zur PATH-Umgebungsvariable hinzufügen. Bitte beachten Sie, dass Sie auch Visual C++ Redistributable Package für Visual Studio 2017 installieren müssen. Wenn Sie sich in Java befinden UnsatisfiedLinkErrors , liegt es in der Regel daran, dass sich das Verzeichnis nicht im DLL-Suchpfad befindet (oder in der falschen Reihenfolge).

Die Java-Bibliothek wird derzeit mit 64-Bit-Oracle JDK 8 erstellt und getestet.