Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Dans cet article, nous allons aborder la gestion des performances de votre application lors de l’utilisation de Windows Machine Learning.
Threading et concurrence
Chaque objet exposé à partir du runtime est agile, ce qui signifie qu’il est accessible à partir de n’importe quel thread. Pour plus d’informations sur l’agilité , consultez les objets Agile en C++/WinRT .
Un objet clé avec lequel vous allez travailler est LearningModelSession. Cet objet peut être appelé en toute sécurité à 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 processeur : l’objet ne verrouille pas et autorise les appels simultanés sur une seule 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 GPU modernes fonctionnent différemment des processeurs. Par exemple, si une faible latence est votre objectif, vous souhaiterez peut-être gérer la façon dont vous planifiez le travail sur vos moteurs processeur et GPU à l’aide de pipelining, et non de concurrence. Cet article sur la synchronisation multi-moteur est un endroit idéal pour commencer. Si l'optimisation de la vitesse de traitement est votre objectif, comme traiter autant d'images que possible, vous voudrez souvent utiliser plusieurs threads et le parallélisme pour saturer le processeur.
Dans le cas du threading et de la concurrence, vous devez effectuer des expériences et mesurer les minutages. Vos performances changeront considérablement en fonction de vos objectifs et scénarios.
Utilisation de la mémoire
Chaque instance de LearningModel et LearningModelSession a une copie du modèle en mémoire. Si vous travaillez avec de petits modèles, vous ne vous inquiétez peut-être pas, mais si vous travaillez avec 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 des garbage collections différées.
LearningModel conserve une copie en mémoire pour activer la création d’une nouvelle session. Lorsque vous supprimez LearningModel, toutes les sessions existantes continueront de fonctionner. Toutefois, vous ne pourrez plus créer de sessions avec cette instance LearningModel . Pour les grands modèles, vous pouvez créer un modèle et une session, puis supprimer le modèle. En utilisant une seule session pour tous les appels à Évaluer, vous aurez une seule copie du modèle volumineux en mémoire.
Prise en charge de float16
Pour améliorer les performances et réduire l’encombrement du modèle, vous pouvez utiliser ONNXMLTools pour convertir votre modèle en float16.
Une fois convertis, toutes les pondérations et entrées sont float16. Voici comment utiliser les entrées et sorties float16 :
-
- 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.
-
- Chemin avancé.
- Conversion 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.
-
- Chemin avancé.
- Vous devez convertir en float16 et passer les entrées en float32, celles-ci étant ensuite réduites à float16.
Remarque
La plupart du temps, l’opérateur effectue toujours des calculs 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 sous les couvertures pour simplifier et rendre le traitement des données d’entrée plus simple et plus efficace. Par exemple, les images d’entrée peuvent se trouver dans différents formats de couleurs et formes, et peuvent être différentes de ce que le modèle attend. WinML effectue des conversions sur les images pour les mettre en correspondance, ce qui réduit la charge sur le développeur.
WinML tire également parti de l’ensemble de la pile matérielle (PROCESSEUR, GPU, et ainsi de suite) pour fournir les conversions les plus efficaces pour un appareil et un scénario particuliers.
Toutefois, dans certains cas, vous souhaiterez peut-être censurer manuellement vos données d’entrée en raison de certaines exigences spécifiques que vous avez. Par exemple, vous ne souhaitez peut-être pas utiliser VideoFrame pour vos images, ou vous souhaitez normaliser les valeurs de pixels comprises entre 0 et 255 et 0-1. Dans ces cas, vous pouvez effectuer votre propre tensorisation personnalisée des données. Consultez l’exemple de tensorisation personnalisé pour obtenir un exemple de ceci.
Remarque
Utilisez les ressources suivantes pour obtenir de l’aide sur Windows ML :
- Pour poser ou répondre à des questions techniques sur Windows ML, utilisez la balise Windows-Machine Learning sur Stack Overflow.
- Pour signaler un bogue, veuillez signaler un problème sur notre GitHub.