Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird erläutert, wie Sie die Leistung Ihrer Anwendung bei Verwendung von Windows Machine Learning verwalten.
Threading und Parallelität
Jedes Objekt, das über die Laufzeit verfügbar gemacht wird, ist agil, d. h., sie können von jedem Thread aus aufgerufen werden. Weitere Informationen zu Agile-Objekten finden Sie in C++/WinRT .
Ein wichtiges Objekt, mit dem Sie arbeiten, ist die LearningModelSession. Dieses Objekt ist immer sicher, von einem beliebigen Thread aus aufzurufen.
Für GPU-Sitzungen: Das Objekt sperrt und synchronisiert gleichzeitige Aufrufe. Wenn Sie Parallelität benötigen, müssen Sie mehrere Sitzungen erstellen, um sie zu erreichen.
Für CPU-Sitzungen: Das Objekt wird nicht gesperrt und lässt gleichzeitige Anrufe in einer einzelnen Sitzung zu. Sie müssen ihre eigenen Status-, Puffer- und Bindungsobjekte verwalten.
Sie sollten sorgfältig vorgehen und Ihr Ziel für Ihr Szenario messen. Moderne GPU-Architekturen funktionieren anders als CPUs. Wenn geringe Latenz Ihr Ziel ist, sollten Sie steuern, wie Sie die Arbeit über Ihre CPU- und GPU-Engines mithilfe von Pipelining und nicht durch Parallelität planen. Dieser Artikel zur Synchronisierung mit mehreren Motoren ist ein großartiger Ort für die ersten Schritte. Wenn der Durchsatz Ihr Ziel ist (z. B. so viele Bilder wie möglich parallel verarbeiten), möchten Sie häufig mehrere Threads und Parallelität verwenden, um die CPU auszulasten.
Wenn es um Threading und Parallelität geht, möchten Sie Experimente ausführen und Timings messen. Ihre Leistung ändert sich erheblich basierend auf Ihren Zielen und Szenarien.
Arbeitsspeichernutzung
Jede Instanz von LearningModel und LearningModelSession verfügt über eine Kopie des Modells im Arbeitsspeicher. Wenn Sie mit kleinen Modellen arbeiten, sind Sie möglicherweise nicht besorgt, aber wenn Sie mit sehr großen Modellen arbeiten, wird dies wichtig.
Rufen Sie "Dispose " entweder für das Modell oder die Sitzung auf, um den Speicher freizugeben. Löschen Sie diese Kopien nicht einfach, da in einigen Sprachen verzögerte Garbage Collection durchgeführt wird.
LearningModel behält eine Kopie im Arbeitsspeicher bei, um die erstellung neuer Sitzungen zu ermöglichen. Wenn Sie das LearningModel verwerfen, funktionieren alle vorhandenen Sitzungen weiterhin. Sie können jedoch keine neuen Sitzungen mehr mit dieser LearningModel-Instanz erstellen. Bei großen Modellen können Sie ein Modell und eine Sitzung erstellen und dann das Modell löschen. Wenn Sie eine einzelne Sitzung für alle Aufrufe zum Auswerten verwenden, verfügen Sie über eine einzige Kopie des großen Modells im Arbeitsspeicher.
Float16-Unterstützung
Für eine bessere Leistung und einen reduzierten Modellbedarf können Sie ONNXMLTools verwenden, um Ihr Modell in float16 zu konvertieren.
Nach der Konvertierung werden alle Gewichtungen und Eingaben float16. Hier erfahren Sie, wie Sie mit float16-Eingaben und -Ausgaben arbeiten können:
-
- 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.
-
- Erweiterter Pfad.
- Float32 wird in float16 umgewandelt.
- 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.
-
- Erweiterter Pfad.
- Sie müssen in float16 konvertieren und die Eingaben als float32 übergeben, die dann in float16 umgewandelt werden.
Hinweis
Meistens führt der Operator noch 32-Bit-Mathematik durch. Es besteht ein geringeres Risiko für Überlauf, und das Ergebnis wird auf float16 gekürzt. Wenn die Hardware jedoch die Float16-Unterstützung anbietet, nutzt die Laufzeit sie.
Vorabverarbeitung von Eingabedaten
WinML führt einige Vorverarbeitungsschritte unter den Deckeln durch, um die Verarbeitung von Eingabedaten zu vereinfachen und effizienter zu gestalten. Beispielsweise könnten eingabebilder in verschiedenen Farbformaten und Formen vorliegen und können anders sein als das, was das Modell erwartet. WinML führt Konvertierungen für die Bilder aus, um sie abzugleichen, wodurch die Auslastung des Entwicklers reduziert wird.
WinML nutzt auch den gesamten Hardwarestapel (CPU, GPU usw.), um die effizientesten Konvertierungen für ein bestimmtes Gerät und Szenario bereitzustellen.
In bestimmten Fällen möchten Sie Ihre Eingabedaten jedoch aufgrund einiger spezifischer Anforderungen manuell tensorisieren. Angenommen, Sie möchten VideoFrame nicht für Ihre Bilder verwenden, oder Sie möchten die Pixelwerte zwischen dem Bereich 0-255 und dem Bereich 0-1 normalisieren. In diesen Fällen können Sie eigene benutzerdefinierte Tensorisierungen für die Daten durchführen. Ein Beispiel hierfür finden Sie im Custom Tensorization-Beispiel .
Hinweis
Verwenden Sie die folgenden Ressourcen für Hilfe zu Windows ML:
- Um technische Fragen zu Windows ML zu stellen oder zu beantworten, verwenden Sie bitte das Windows-Machine-Learning--Tag auf Stack Overflow-.
- Um einen Fehler zu melden, melden Sie bitte ein Problem in unserem GitHub.