Freigeben über


WinMLRunner

WinMLRunner ist ein Tool, mit dem getestet werden kann, ob ein Modell erfolgreich ausgeführt wird, wenn es mit den Windows ML-APIs ausgewertet wird. Sie können auch die Evaluierungszeit und die Speicherauslastung auf der GPU und/oder CPU erfassen. Modelle im .onnx- oder .pb-Format können ausgewertet werden, bei denen die Ein- und Ausgabevariablen Tensoren oder Bilder sind. Es gibt 2 Möglichkeiten, wie Sie WinMLRunner verwenden können:

Ausführen eines Modells

Öffnen Sie zunächst das heruntergeladene Python-Tool. Navigieren Sie zu dem Ordner, der WinMLRunner.exeenthält, und führen Sie die ausführbare Datei wie unten gezeigt aus. Stellen Sie sicher, dass Sie den Installationsort durch einen Speicherort ersetzen, der Ihrem entspricht:

.\WinMLRunner.exe -model SqueezeNet.onnx

Sie können auch einen Ordner mit Modellen mit einem Befehl wie dem folgenden ausführen.

WinMLRunner.exe -folder c:\data -perf -iterations 3 -CPU`\

Ausführen eines guten Modells

Im Folgenden finden Sie ein Beispiel für das erfolgreiche Ausführen eines Modells. Beachten Sie, wie das Modell zuerst Modellmetadaten lädt und ausgibt. Anschließend wird das Modell separat auf der CPU und der GPU ausgeführt, wobei der Bindungserfolg, der Auswertungserfolg und die Modellausgabe ausgegeben werden.

Beispielausgabe des Ablaufverfolgungsprotokolls zum Ausführen eines guten Modells

Ausführen eines fehlerhaften Modells

Im Folgenden finden Sie ein Beispiel für das Ausführen eines Modells mit falschen Parametern. Beachten Sie die FAILED-Ausgabe bei der Auswertung auf der GPU.

Beispielausgabe des Ablaufverfolgungsprotokolls zum Ausführen eines fehlerhaften Modells

Geräteauswahl und -optimierung

Standardmäßig wird das Modell auf CPU und GPU separat ausgeführt, Sie können jedoch ein Gerät mit einem -CPU- oder -GPU Flag angeben. Hier ist ein Beispiel für die 3-malige Ausführung eines Modells nur mit der CPU:

WinMLRunner.exe -model c:\data\concat.onnx -iterations 3 -CPU

Protokollieren von Leistungsdaten

Verwenden Sie das Flag -perf, um Leistungsdaten zu erfassen. Hier ist ein Beispiel für das 3-malige Ausführen aller Modelle im Datenordner auf der CPU und GPU separat und das Erfassen von Leistungsdaten:

WinMLRunner.exe -folder c:\data iterations 3 -perf

Leistungsmessungen

Die folgenden Leistungsmessungen werden für jeden Lade-, Bindungs- und Auswertungsvorgang in die Befehlszeile und .csv Datei ausgegeben:

  • Wall-Clock-Zeit (ms): Die verstrichene Echtzeit zwischen dem Beginn und dem Ende eines Vorgangs.
  • GPU-Zeit (ms): Zeit für eine Operation, die von der CPU an die GPU übergeben und auf der GPU ausgeführt wird (Hinweis: Load() wird nicht auf der GPU ausgeführt).
  • CPU-Zeit (ms): Zeit, die benötigt wird, bis ein Vorgang auf der CPU ausgeführt wird.
  • Auslastung des dedizierten und gemeinsam genutzten Speichers (MB): Durchschnittliche Speicherauslastung auf Kernel- und Benutzerebene (in MB) während der Auswertung auf der CPU oder GPU.
  • Arbeitsspeicher (MB): Die Menge an DRAM-Speicher, die der Prozess auf der CPU während der Evaluierung benötigt hat. Dedizierter Arbeitsspeicher (MB) - Die Menge an Arbeitsspeicher, die auf dem VRAM der dedizierten GPU verwendet wurde.
  • Gemeinsamer Speicher (MB): Die Menge an Arbeitsspeicher, die von der GPU auf dem DRAM verwendet wurde.

Beispiel für die Leistungsausgabe:

Ausgabe der Beispielleistung

Testmuster-Eingaben

Führen Sie ein Modell separat auf der CPU und GPU aus, und binden Sie die Eingabe separat an die CPU und die GPU (insgesamt 4 Durchläufe):

WinMLRunner.exe -model c:\data\SqueezeNet.onnx -CPU -GPU -CPUBoundInput -GPUBoundInput

Führen Sie ein Modell auf der CPU aus, wobei die Eingabe an die GPU gebunden und als RGB-Bild geladen wird:

WinMLRunner.exe -model c:\data\SqueezeNet.onnx -CPU -GPUBoundInput -RGB

Erfassen von Ablaufverfolgungsprotokollen

Wenn Sie Ablaufverfolgungsprotokolle mit dem Tool erfassen möchten, können Sie logman-Befehle in Verbindung mit dem debug-Flag verwenden:

logman start winml -ets -o winmllog.etl -nb 128 640 -bs 128logman update trace  winml -p {BCAD6AEE-C08D-4F66-828C-4C43461A033D} 0xffffffffffffffff 0xff -ets         WinMLRunner.exe -model C:\Repos\Windows-Machine-Learning\SharedContent\models\SqueezeNet.onnx -debuglogman stop winml -ets

Die Datei winmllog.etl wird im selben Verzeichnis wie die WinMLRunner.exeangezeigt.

Lesen der Trace-Protokolle

Führen Sie mit dem traceprt.exeden folgenden Befehl über die Befehlszeile aus.

tracerpt.exe winmllog.etl -o logdump.csv -of CSV

Öffnen Sie als Nächstes die logdump.csv Datei.

Alternativ können Sie die Windows-Leistungsanalyse (aus Visual Studio) verwenden. Starten Sie die Windows-Leistungsanalyse, und öffnen Sie winmllog.etl.

Beispiel für die Ausgabe des Ablaufverfolgungsprotokolls mit der Windows-Leistungsanalyse

Beachten Sie, dass -CPU, -GPU, -GPUHighPerformance, -GPUMinPower -BGR, -RGB, -tensor, -CPUBoundInput -GPUBoundInput sich nicht gegenseitig ausschließen (d. h. Sie können so viele kombinieren, wie Sie möchten, um das Modell mit unterschiedlichen Konfigurationen auszuführen).

Dynamisches Laden von DLL

Wenn Sie WinMLRunner mit einer anderen Version von WinML ausführen möchten (z.B. um die Leistung mit einer älteren Version zu vergleichen oder eine neuere Version zu testen), legen Sie einfach die windows.ai.machinelearning.dll und directml.dll Dateien im selben Ordner wie WinMLRunner.exeab. WinMLRunner sucht zuerst nach diesen DLLs und greift auf C:/Windows/System32 zurück, wenn sie nicht gefunden werden.

Bekannte Probleme

  • Sequenz-/Map-Eingaben werden noch nicht unterstützt (das Modell wird einfach übersprungen, so dass es keine anderen Modelle in einem Ordner blockiert);
  • Wir können nicht zuverlässig mehrere Modelle mit dem Argument -folder mit echten Daten ausführen lassen. Da wir nur 1 Eingabe angeben können, würde die Größe der Eingabe nicht mit den meisten Modellen übereinstimmen. Im Moment funktioniert die Verwendung des Arguments -folder nur mit Garbage-Daten gut.
  • Das Generieren von Garbage Input als Grau oder YUV wird derzeit nicht unterstützt. Im Idealfall sollte die Garbage-Data-Pipeline von WinMLRunner alle Eingabetypen unterstützen, die wir an winml übergeben können.