Windows ML – Leistung und Arbeitsspeicher

In diesem Artikel erfahren Sie, wie Sie die Leistung Ihrer Anwendung bei der Verwendung von Windows Machine Learning verwalten.

Threading und Parallelität

Jedes Objekt, das von der Laufzeit verfügbar gemacht wird, ist ein Agile-Objekt, d.h., von jedem beliebigen Thread aus kann darauf zugegriffen werden. Weitere Informationen zu Agile finden Sie unter Agile-Objekte in C++/WinRT.

Ein Schlüsselobjekt, mit dem Sie arbeiten, ist die Klasse LearningModelSession. Dieses Objekt kann von einem beliebigen Thread aus immer sicher aufgerufen werden.

  • Für GPU-Sitzungen: Das Objekt sperrt und synchronisiert gleichzeitige Aufrufe. Wenn Sie Parallelität benötigen, erreichen Sie diese, indem Sie mehrere Sitzungen erstellen.

  • Für CPU-Sitzungen: Das Objekt wird nicht gesperrt und lässt gleichzeitige Aufrufe für eine einzelne Sitzung zu. Sie müssen ihre eigenen Status-, Puffer- und Bindungsobjekte verwalten.

Achten Sie darauf, dass Sie das Ziel für Ihr Szenario messen können. Moderne GPU-Architekturen funktionieren anders als CPUs. Wenn Sie beispielsweise eine geringe Latenzzeit anstreben, sollten Sie die Arbeitsplanung für Ihre CPU- und GPU-Module nicht durch Parallelität, sondern durch Pipelining steuern. Dieser Artikel zur Synchronisierung mehrerer Module ist ein idealer Ausgangspunkt für den Einstieg. Wenn Durchsatz Ihr Ziel ist (beispielsweise die Verarbeitung möglichst vieler Bilder gleichzeitig), ist es oft sinnvoll, mehrere Threads und Parallelität zu verwenden, um die CPU auszulasten.

Wenn es um Threading und Parallelität geht, möchten Sie Experimente ausführen und Zeiten messen. Ihre Leistung ändert sich basierend auf Ihren Zielen und Szenarien erheblich.

Arbeitsspeichernutzung

Jede Instanz von LearningModel und LearningModelSession verfügt über eine Kopie des Modells im Arbeitsspeicher. Wenn Sie mit kleinen Modellen arbeiten, ist dies möglicherweise nicht problematisch, aber wenn Sie mit sehr großen Modellen arbeiten, wird diese Tatsache wichtig.

Um den Arbeitsspeicher freizugeben, müssen Sie Dispose für das Modell oder für die Sitzung aufrufen. Löschen Sie diese Kopien nicht einfach, da in einigen Sprachen verzögerte Garbage Collection durchgeführt wird.

LearningModel speichert eine Kopie im Arbeitsspeicher, um die Erstellung neuer Sitzungen zu ermöglichen. Wenn Sie das LearningModel verwerfen, funktionieren alle vorhandenen Sitzungen weiterhin. Es ist jedoch nicht mehr möglich, neue Sitzungen mit dieser LearningModel-Instanz zu erstellen. Bei großen Modellen können Sie ein Modell und eine Sitzung erstellen und das Modell dann verwerfen. Indem Sie eine einzelne Sitzung für alle Aufrufe von Evaluate verwenden, verfügen Sie über eine einzelne Kopie des großen Modells im Arbeitsspeicher.

Float16-Unterstützung

Um eine bessere Leistung und einen geringeren Modellfußabdruck zu erzielen, können Sie ONNXMLTools verwenden, um das Modell in float16 zu konvertieren.

Nach der Konvertierung sind alle Gewichtungen und Eingaben vom Typ float16. Im Folgenden wird erläutert, wie Sie mit float16-Eingaben und -Ausgaben arbeiten können:

  • ImageFeatureValue

    • Empfohlene Verwendung.
    • Konvertiert Farben und tensorisiert in float16.
    • Unterstützt bgr8- und 8-Bit-Bildformate, die ohne Datenverlust sicher in float16 konvertiert werden können.
  • TensorFloat

    • Erweiterter Pfad.
    • Float32-Umwandlung in float16.
    • Für Bilder ist diese Umwandlung sicher, da bgr8 klein ist und passt.
    • Für Ressourcen, die keine Bilder sind, schlägt Bind fehl, und Sie müssen stattdessen ein TensorFloat16Bit-Element übergeben.
  • TensorFloat16Bit

    • Erweiterter Pfad.
    • Sie müssen in float16 konvertieren und die Eingaben als float32 übergeben, die dann in float16 umgewandelt werden.

Hinweis

In den meisten Fällen führt der Operator weiterhin 32-Bit-Berechnungen aus. Das Risiko für einen Überlauf ist geringer, und das Ergebnis wird auf float16 gekürzt. Wenn die Hardware jedoch float16-Unterstützung ankündigt, nutz die Laufzeit diese.

Vorverarbeitung von Eingabedaten

WinML führt einige Vorverarbeitungsschritte im Hintergrund aus, um die Verarbeitung von Eingabedaten einfacher und effizienter zu gestalten. Beispielsweise können sich Eingabebilder in verschiedenen Farbformaten und Formen vorliegen und sich möglicherweise von dem unterscheiden, was das Modell erwartet. WinML führt Konvertierungen der Bilder durch, um sie anzugleichen, um den Entwickler zu entlasten.

Außerdem nutzt WinML den gesamten Hardwarestapel (CPU, GPU usw.), um die effizientesten Konvertierungen für ein bestimmtes Gerät und Szenario bereitzustellen.

In bestimmten Fällen empfiehlt es sich jedoch, Ihre Eingabedaten aufgrund spezifischer Anforderungen manuell zu tensorisieren. Möglicherweise möchten Sie z. B. VideoFrame nicht für Ihre Bilder verwenden, oder Sie möchten die Pixelwerte aus dem Bereich 0 bis 255 in den Bereich 0 bis 1 normalisieren. In diesen Fällen können Sie Ihre eigene benutzerdefinierte Tensorisierung für die Daten durchführen. Ein Beispiel dazu finden Sie im Beispiel Benutzerdefinierte Tensorisierung.

Hinweis

Verwende die folgenden Ressourcen, wenn du Hilfe mit Windows ML benötigst:

  • Wenn du technische Fragen zu Windows ML stellen oder beantworten möchtest, verwende das Tag windows-machine-learning auf Stack Overflow.
  • Wenn du einen Fehler melden möchtest, erstelle eine Anfrage auf GitHub.