Les appareils mobiles et embarqués disposent de ressources de calcul limitées. Il est donc important de veiller à ce que votre application soit économe en ressources. Nous avons compilé une liste de bonnes pratiques et de stratégies que vous pouvez utiliser pour améliorer les performances de votre modèle TensorFlow Lite.
Choisir le meilleur modèle pour la tâche
Selon la tâche, vous devrez faire un compromis entre la complexité et la taille du modèle. Si votre tâche nécessite une haute précision, vous devrez peut-être utiliser un modèle volumineux et complexe. Pour les tâches qui nécessitent moins de précision, il est préférable d'utiliser un modèle plus petit, car il utilise moins d'espace disque et de mémoire, mais il est également généralement plus rapide et plus économe en énergie. Par exemple, les graphiques ci-dessous montrent les compromis entre précision et latence pour certains modèles courants de classification d'images.


Les modèles MobileNets sont un exemple de modèles optimisés pour les appareils mobiles. Ils sont optimisés pour les applications de vision mobile. Kaggle Models liste plusieurs autres modèles qui ont été optimisés spécifiquement pour les appareils mobiles et embarqués.
Vous pouvez réentraîner les modèles listés sur votre propre ensemble de données à l'aide du transfert d'apprentissage.
Profiler votre modèle
Une fois que vous avez sélectionné un modèle candidat adapté à votre tâche, il est recommandé de profiler et de comparer votre modèle. L'outil de benchmarking LiteRT dispose d'un profileur intégré qui affiche les statistiques de profilage par opérateur. Cela peut vous aider à comprendre les goulots d'étranglement des performances et les opérateurs qui dominent le temps de calcul.
Vous pouvez également utiliser le traçage LiteRT pour profiler le modèle dans votre application Android, à l'aide du traçage système Android standard, et pour visualiser les appels d'opérateur par heure avec des outils de profilage basés sur l'interface utilisateur.
Profiler et optimiser les opérateurs dans le graphique
Si un opérateur particulier apparaît fréquemment dans le modèle et que, d'après le profilage, vous constatez qu'il consomme le plus de temps, vous pouvez envisager de l'optimiser. Ce scénario devrait être rare, car TensorFlow Lite propose des versions optimisées pour la plupart des opérateurs. Toutefois, vous pouvez écrire une version plus rapide d'une opération personnalisée si vous connaissez les contraintes dans lesquelles l'opérateur est exécuté. Consultez le guide sur les opérateurs personnalisés.
Optimiser votre modèle
L'optimisation des modèles vise à créer des modèles plus petits, généralement plus rapides et plus économes en énergie, afin qu'ils puissent être déployés sur des appareils mobiles. LiteRT est compatible avec plusieurs techniques d'optimisation, comme la quantification.
Pour en savoir plus, consultez la documentation sur l'optimisation des modèles.
Ajuster le nombre de threads
LiteRT est compatible avec les noyaux multithread pour de nombreux opérateurs. Vous pouvez augmenter le nombre de threads et accélérer l'exécution des opérateurs. Cependant, augmenter le nombre de threads entraînera une utilisation accrue des ressources et de la puissance de votre modèle.
Pour certaines applications, la latence peut être plus importante que l'efficacité énergétique. Vous pouvez augmenter le nombre de threads en définissant le nombre de threads de l'interpréteur. Toutefois, l'exécution multithread entraîne une variabilité accrue des performances en fonction des autres éléments exécutés simultanément. C'est particulièrement le cas pour les applications mobiles. Par exemple, des tests isolés peuvent montrer une accélération de 2x par rapport à un seul thread, mais si une autre application s'exécute en même temps, les performances peuvent être moins bonnes qu'avec un seul thread.
Éliminer les copies redondantes
Si votre application n'est pas conçue avec soin, des copies redondantes peuvent exister lors de l'alimentation de l'entrée et de la lecture de la sortie du modèle. Veillez à éliminer les copies redondantes. Si vous utilisez des API de niveau supérieur, comme Java, veillez à consulter attentivement la documentation pour connaître les mises en garde concernant les performances. Par exemple, l'API Java est beaucoup plus rapide si des ByteBuffers sont utilisés comme entrées.
Profiler votre application avec des outils spécifiques à la plate-forme
Les outils spécifiques à la plate-forme, tels que le profiler Android et Instruments, fournissent une multitude d'informations de profilage qui peuvent être utilisées pour déboguer votre application. Parfois, le bug de performances ne se trouve pas dans le modèle, mais dans des parties du code de l'application qui interagissent avec le modèle. Assurez-vous de vous familiariser avec les outils de profilage et les bonnes pratiques spécifiques à votre plate-forme.
Évaluer si votre modèle bénéficie de l'utilisation d'accélérateurs matériels disponibles sur l'appareil
LiteRT a ajouté de nouvelles façons d'accélérer les modèles avec du matériel plus rapide comme les GPU, les DSP et les accélérateurs neuronaux. En règle générale, ces accélérateurs sont exposés via des sous-modules delegate qui prennent en charge des parties de l'exécution de l'interpréteur. LiteRT peut utiliser des délégués en :
- Le délégué GPU est disponible sur Android et iOS, à l'aide d'OpenGL/OpenCL et de Metal, respectivement. Pour les essayer, consultez le délégué GPU.
- Vous pouvez créer votre propre délégué si vous avez accès à du matériel non standard. Pour en savoir plus, consultez Délégués LiteRT.
Sachez que certains accélérateurs fonctionnent mieux pour différents types de modèles. Certains délégués ne sont compatibles qu'avec les modèles flottants ou les modèles optimisés d'une manière spécifique. Il est important de comparer chaque délégué pour voir s'il constitue un bon choix pour votre application. Par exemple, si votre modèle est très petit, il peut ne pas être intéressant de le déléguer au GPU. À l'inverse, les accélérateurs sont un excellent choix pour les grands modèles à forte intensité arithmétique.