Partager via


WinMLRunner

WinMLRunner est un outil permettant de tester si un modèle s’exécute correctement lorsqu’il est évalué avec les API Windows ML. Vous pouvez également capturer le temps d’évaluation et l’utilisation de la mémoire sur le GPU et/ou l’UC. Les modèles au format .onnx ou .pb peuvent être évalués où les variables d’entrée et de sortie sont des tenseurs ou des images. Il existe 2 façons d’utiliser WinMLRunner :

Exécuter un modèle

Tout d’abord, ouvrez l’outil Python téléchargé. Accédez au dossier contenant WinMLRunner.exe, puis exécutez l’exécutable comme indiqué ci-dessous. Veillez à remplacer l’emplacement d’installation par ce qui correspond à la vôtre :

.\WinMLRunner.exe -model SqueezeNet.onnx

Vous pouvez également exécuter un dossier de modèles, avec une commande telle que la suivante.

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

Exécution d’un bon modèle

Vous trouverez ci-dessous un exemple d’exécution réussie d’un modèle. Notez comment le modèle charge et génère d’abord les métadonnées du modèle. Ensuite, le modèle s’exécute séparément sur le processeur et le GPU, produisant le succès de la liaison, le succès de l’évaluation et le succès du modèle.

Exemple de sortie du journal de trace pour l’exécution d’un bon modèle

Exécution d’un modèle incorrect

Voici un exemple d’exécution d’un modèle avec des paramètres incorrects. Notez la sortie Échec lors de l’évaluation sur le GPU.

Exemple de sortie du journal de trace pour l’exécution d’un modèle incorrect

Sélection et optimisation de l’appareil

Par défaut, le modèle s’exécute séparément sur l’UC et le GPU, mais vous pouvez spécifier un appareil avec un indicateur -CPU ou -GPU. Voici un exemple d’exécution d’un modèle 3 fois en utilisant uniquement le processeur :

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

Enregistrer les données de performance

Utilisez l’indicateur -perf pour capturer les données de performances. Voici un exemple d’exécution de tous les modèles dans le dossier de données sur le processeur et le GPU séparément 3 fois et la capture des données de performances :

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

Mesures de performances

Les mesures de performances suivantes seront générées dans la ligne de commande et dans le fichier .csv pour chaque opération de chargement, de liaison et d’évaluation :

  • Temps d’horloge murale (ms) : temps réel écoulé entre le début et la fin d’une opération.
  • Temps GPU (ms) : heure d’une opération à passer du processeur au GPU et à l’exécution sur le GPU (remarque : Load() n’est pas exécutée sur le GPU).
  • Temps processeur (ms) : heure d’exécution d’une opération sur l’UC.
  • Utilisation de la mémoire dédiée et partagée (Mo) : Utilisation moyenne du noyau et de la mémoire au niveau de l’utilisateur (en Mo) pendant l’évaluation sur le processeur ou le GPU.
  • Mémoire de l'ensemble de travail (Mo) : Quantité de mémoire DRAM requise par le processus sur le processeur pendant l’évaluation. Mémoire dédiée (Mo) : quantité de mémoire utilisée sur la mémoire virtuelle du GPU dédié.
  • Mémoire partagée (Mo) : Quantité de mémoire utilisée sur la DRAM par le GPU.

Exemple de résultats de performance :

Exemple de sortie des performances

Tester des exemples d’entrées

Exécutez un modèle sur l’UC et le GPU séparément, et en liant l’entrée à l’UC et au GPU séparément (4 exécutions totales) :

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

Exécutez un modèle sur l’UC avec l’entrée liée au GPU et chargée en tant qu’image RVB :

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

Capture des journaux de suivi

Si vous souhaitez capturer des journaux de suivi à l’aide de l’outil, vous pouvez utiliser les commandes logman avec l’indicateur de débogage :

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

Le fichier winmllog.etl apparaît dans le même répertoire que le WinMLRunner.exe.

Lecture des journaux de suivi

À l’aide de la traceprt.exe, exécutez la commande suivante à partir de la ligne de commande.

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

Ensuite, ouvrez le logdump.csv fichier.

Vous pouvez également utiliser l’analyseur de performances Windows (à partir de Visual Studio). Lancez l’Analyseur de performances Windows, puis ouvrez winmllog.etl.

Exemple de sortie du journal de trace à l’aide de Windows Performance Analyzer

Notez que -CPU, -GPU, -GPUHighPerformance, -GPUMinPower -BGR, -RGB, -tensor, -CPUBoundInput, -GPUBoundInput ne sont pas mutuellement exclusifs (c’est-à-dire que vous pouvez combiner autant que vous souhaitez exécuter le modèle avec différentes configurations).

Chargement dynamique de DLL

Si vous souhaitez exécuter WinMLRunner avec une autre version de WinML (par exemple, comparer les performances à une version antérieure ou tester une version plus récente), placez simplement les fichiers windows.ai.machinelearning.dll et directml.dll dans le même dossier que WinMLRunner.exe. WinMLRunner recherche d’abord ces DLL et revient à C :/Windows/System32 s’il ne les trouve pas.

Problèmes connus

  • Les entrées sequence/map ne sont pas encore prises en charge (le modèle est simplement ignoré, il ne bloque donc pas d’autres modèles dans un dossier) ;
  • Nous ne pouvons pas exécuter de manière fiable plusieurs modèles avec l’argument -folder avec des données réelles. Étant donné que nous ne pouvons spécifier qu’une entrée, la taille de l’entrée ne correspondrait pas à la plupart des modèles. À l’heure actuelle, l’utilisation de l’argument -folder fonctionne correctement avec les données de garbage ;
  • La génération de l’entrée Garbage en gris ou YUV n’est pas prise en charge actuellement. Dans l’idéal, le pipeline de données indésirables de WinMLRunner doit prendre en charge tous les types d’entrées que nous pouvons donner à WinML.