Performances et mémoire Windows ML

Dans cet article, nous allons vous expliquer comment gérer le niveau de performance de votre application lorsque vous utilisez Windows Machine Learning.

Threading et concurrence

Chaque objet exposé à partir du runtime est dit agile, ce qui signifie qu’il est possible d’y accéder à partir de n’importe quel thread. Pour plus d’informations sur l’agilité, consultez Objets agiles avec C++/WinRT.

Un des objets clés que vous êtes amené à utiliser est LearningModelSession. Cet objet peut toujours être appelé sans risque à partir de n’importe quel thread.

  • Pour les sessions GPU : l’objet verrouille et synchronise les appels simultanés. Si vous avez besoin de la concurrence, vous devez pour cela créer plusieurs sessions.

  • Pour les sessions CPU: l’objet n’est pas verrouillé et autorise les appels simultanés dans une même session. Vous devez veiller à gérer vos propres état, mémoires tampons et objets de liaison.

Vous devez prendre soin de bien évaluer l’objectif de votre scénario. Les architectures de GPU modernes ne fonctionnent pas de la même manière que les processeurs. Par exemple, si vous avez pour objectif une faible latence, vous avez tout intérêt à planifier le travail avec les moteurs de processeur et de GPU via le traitement en pipeline et non la concurrence. Cet article sur la synchronisation multimoteur est l’endroit idéal pour commencer. Si votre objectif est le débit (par exemple, pour traiter le plus d’images possible à la fois), il est souvent possible d’utiliser plusieurs threads et la concurrence de façon à saturer le processeur.

Dans le cas du threading et de la concurrence, vous devez effectuer des expériences et mesurer les minutages. Les performances varient considérablement selon les objectifs et le scénario.

Utilisation de la mémoire

Chaque instance de LearningModel et LearningModelSession a une copie du modèle en mémoire. Cela ne vous posera sans doute pas de problème si vous utilisez des petits modèles, mais si vous utilisez des modèles très volumineux, cela devient important.

Pour libérer la mémoire, appelez Dispose sur le modèle ou la session. Ne vous contentez pas de les supprimer, car certains langages exécutent un garbage collection différé.

LearningModel conserve une copie en mémoire pour permettre la création d’une nouvelle session. Si vous supprimez le LearningModel, toutes les sessions existantes continueront à fonctionner. Toutefois, vous ne serez plus en mesure de créer de nouvelles sessions avec cette instance de LearningModel. Pour les modèles volumineux, vous pouvez créer un modèle et une session, puis supprimer le modèle. En utilisant une seule session pour tous les appels à Evaluate, vous disposez d’une copie unique du grand modèle en mémoire.

Prise en charge de float16

Pour obtenir de meilleures performances et une réduction de l’encombrement du modèle, vous pouvez utiliser ONNXMLTools pour convertir votre modèle en float16.

Une fois le modèle converti, tous les poids et les entrées sont float16. Voici comment travailler avec des entrées et des sorties float16 :

  • ImageFeatureValue

    • Utilisation recommandée.
    • Convertit les couleurs et tenseurise en float16.
    • Prend en charge les formats d’image bgr8 et 8 bits, qui peuvent être convertis en toute sécurité en float16 sans perte de données.
  • TensorFloat

    • Chemin avancé.
    • Cast de float32 en float16.
    • Pour les images, vous pouvez caster sans problème, car bgr8 est petit et adapté.
    • Pour les non-images, Bind échoue et vous devez passer un TensorFloat16Bit à la place.
  • TensorFloat16Bit

    • Chemin avancé.
    • Vous devez convertir en float16 et transmettre les entrées en tant que float32, qui seront recastées en float16.

Remarque

La plupart du temps, l’opérateur continue à effectuer des calculs mathématiques 32 bits. Il y a moins de risques de dépassement de capacité, et le résultat est tronqué en float16. Toutefois, si le matériel annonce la prise en charge de float16, le runtime en tirera parti.

Prétraitement des données d’entrée

WinML effectue certaines étapes de prétraitement en coulisses pour simplifier et améliorer l’efficacité du traitement des données d’entrée. Par exemple, les images d’entrée peuvent être dans différents formats de couleurs et formes, et peuvent être différentes de celles attendues par le modèle. WinML effectue des conversions sur les images pour les faire correspondre, réduisant ainsi la charge sur le développeur.

WinML tire également parti de la pile matérielle complète (processeur, GPU, et ainsi de suite) afin de fournir les conversions les plus efficaces pour un appareil et un scénario donnés.

Toutefois, dans certains cas, vous souhaiterez peut-être tenseuriser manuellement vos données d’entrée en raison de certaines exigences spécifiques. Par exemple, vous ne souhaiterez peut-être pas utiliser VideoFrame pour vos images, ou vous souhaiterez normaliser les valeurs de pixels de la plage 0-255 à la plage 0-1. Dans ce cas, vous pouvez effectuer votre propre tenseurisation personnalisée sur les données. Pour obtenir un exemple, consultez Custom Tensorization Sample.

Remarque

Utilisez les ressources suivantes pour obtenir de l’aide sur Windows ML :

  • Pour poser des questions techniques ou apporter des réponses à des questions techniques sur Windows ML, veuillez utiliser le mot clé windows-machine-learning sur Stack Overflow.
  • Pour signaler un bogue, veuillez signaler un problème dans notre plateforme GitHub.