Cet article vous présentera "L'inférence au bord et "Techniques d'optimisation de l'inférence" en apprentissage automatique. À la fin de cet article, vous connaîtrez les techniques d'optimisation les plus pertinentes pour réduire la taille des modèles et augmenter leur vitesse d'inférence en vision par ordinateur. Vous découvrirez également les outils open-source que vous pouvez utiliser pour réaliser ces optimisations. Enfin, nous vous conseillerons sur les techniques d'optimisation du déploiement que vous devriez utiliser dans vos projets de vision par ordinateur, en fonction de votre matériel de déploiement .
Qu'est-ce que l'inférence à la périphérie et quand en avez-vous besoin ?
Vous avez peut-être entendu les expressions "AI at the Edge", "Edge ML" ou "Inference at the edge". Ces termes font référence à des modèles d'apprentissage automatique formés qui exécutent des tâches d'inférence à proximité du point de collecte des données de production, généralement en temps réel. L'inférence est exécutée sur des périphériques (micro-ordinateurs, accélérateurs, mobiles, IoT, etc.). Les voitures à conduite autonome en sont un exemple typique. Elles recueillent des informations sur les environs grâce à de multiples capteurs et les traitent en temps réel dans le matériel local. Le temps réel fait référence au délai maximal de prédiction que nous pouvons nous permettre et qui varie de quelques millisecondes à quelques secondes selon l'application.
Inference at the Edge offre de nombreux avantages et constitue parfois la seule façon viable de concevoir votre système de vision par ordinateur. En bref, Inference at the Edge offre :
- Capacités d'inférence à distance (les données de production se trouvent sur le terrain, loin d'un serveur)
- Prédictions en temps réel
- Indépendance par rapport à la connexion au réseau
- Réduction du stockage des données (vous ne conservez que les prédictions et éliminez les données de production).
- la sécurité des données, car le besoin de transférer des données (sensibles) à travers un réseau est limité
Cependant, elle est soumise à de nombreuses contraintes telles que la puissance de traitement limitée du matériel, les limites de la mémoire, l'autonomie limitée de la batterie si elle n'est pas connectée à une prise électrique, des coûts éventuellement plus élevés et une phase de déploiement du modèle légèrement plus complexe. Par conséquent, vous devez décider avec soin si l'inférence à la périphérie est nécessaire pour votre projet. En résumé, si aucun des points ci-dessus ne constitue une exigence stricte, vous pouvez probablement vous contenter de transférer les données collectées vers un serveur en nuage pour l'inférence, et inversement si nécessaire.
Si vous avez décidé que l'inférence à la périphérie est la meilleure conception pour votre application, vous devrez respecter les contraintes de traitement. Lorsque vous exécutez l'inférence dans du matériel local à faible puissance, vous n'avez pas le luxe de traiter des données avec des modèles d'apprentissage profond très volumineux, car la latence pourrait dépasser les contraintes de temps réel. Heureusement, il existe des techniques d'optimisation permettant de réduire la taille d'un réseau et son délai d'inférence.
Techniques d'optimisation de la vitesse et de la mémoire
Les appareils périphériques ont souvent une mémoire ou une puissance de calcul limitées. Vous pouvez appliquer diverses optimisations à vos modèles pour les exécuter en respectant ces contraintes. L'optimisation des modèles est particulièrement utile pour :
- Réduire la latence d'inférence pour les dispositifs en nuage et en périphérie.
- Déploiement de modèles sur des dispositifs périphériques avec des restrictions en matière de traitement, de mémoire et/ou de consommation d'énergie.
- Permettre l'exécution sur du matériel restreint ou optimisé pour les opérations en virgule fixe (nombres entiers).
- Optimisation des modèles pour les accélérateurs matériels à usage spécifique.
- Réduction des coûts de stockage des modèles et des charges utiles de mise à jour des modèles (pour les mises à jour par voie hertzienne).
Nous allons passer en revue certaines des techniques les plus cruciales d'optimisation de la taille et de la vitesse.
1. Choisir le meilleur modèle pour l'application
L'étape suivante n'est pas une technique d'optimisation, mais c'est l'étape la plus pertinente pour commencer. Avant d'entraîner votre modèle, prenez en compte la précision et la vitesse d'inférence que vous devez atteindre. Vous devez faire un compromis entre la complexité et la taille du modèle. Les modèles plus petits sont souvent suffisants pour la plupart des tâches, ils nécessitent moins d'espace disque et de mémoire, et sont beaucoup plus rapides et économes en énergie. Les graphiques ci-dessous permettent de mieux comprendre ce compromis. En regardant le graphique de la précision par rapport à la latence, vous devez décider si un Mobilenet v2 a une précision suffisante pour vos besoins ou si vous devez passer à un modèle plus complexe comme le NASNet mobile ou Inception v3 (quantifié). Dans tous les cas, Inception v4 n'est probablement pas une option pour l'inférence en temps réel.

2. Quantification des poids après la formation
La quantification est la technique qui consiste à contraindre un grand ensemble de valeurs (continues) à un plus petit ensemble de valeurs (discrètes). Dans les réseaux neuronaux, la quantification post-formation est une technique qui réduit le nombre de bits nécessaires pour représenter les poids, les biais et les fonctions d'activation d'un réseau [1]. La quantification post-formation consiste à prendre un modèle formé, à quantifier ses poids, puis éventuellement à ré-optimiser le modèle.
Le processus standard consiste à représenter les paramètres d'un réseau sous forme de valeurs à virgule flottante de 32 bits, ce qui permet une grande précision numérique et, en fin de compte, la précision du réseau neuronal. En convertissant les représentations en virgule flottante 32 bits en types numériques de précision réduite, nous pouvons effectivement réduire la taille d'un paramètre de 2x à 4x, selon le type de quantification. Cela se traduirait par un modèle d'une taille initiale de 128 Mo réduite à environ 64 Mo, voire 32 Mo !
Les techniques de quantification les plus courantes convertissent le type numérique en nombres à virgule flottante de 16 bits (demi-quantification) ou en nombres entiers de 8 bits (quantification complète). La quantification en nombres entiers de 8 bits offre deux options : la quantification en nombres entiers complets et la quantification de la plage dynamique. La première quantifie les poids, les biais, les activations, les entrées et les sorties (pour un ensemble de données représentatif), tandis que la seconde ne quantifie que les poids. En fonction de votre matériel, certaines techniques fonctionnent mieux que d'autres, mais nous nous pencherons sur ce point dans la prochaine section.

Cependant, en informatique, un lancement gratuit existe rarement. En réduisant la précision numérique, vous pouvez dégrader la précision globale de votre modèle. En fonction de la sévérité de la quantification, nous percevons généralement une baisse de précision d'environ 0-2%. Cependant, pour une baisse de précision de 2 %, nous pouvons réaliser jusqu'à 84 % d'économie d'énergie [2] et 3x ou plus d'accélération. Dans la plupart des cas, la dégradation de la précision est inférieure à 1 %, tandis que dans certains cas rares, nous pouvons même constater une légère augmentation de la précision, généralement un modèle surajusté et complexe régularisé en raison de la quantification.
3. Élagage du modèle
L'élagage supprime les paramètres redondants ou des neurones entiers qui ne contribuent pas de manière significative à la précision des résultats. Cette situation peut se produire lorsque les coefficients de poids sont nuls, proches de zéro ou répliqués. Par conséquent, vous pouvez réduire la complexité de calcul tout en maintenant les augmentations de vitesse d'inférence et la précision à des niveaux stables. Les réseaux élagués peuvent également être réentraînés par la suite, ce qui permet d'échapper aux minima locaux précédents et d'améliorer encore la précision [3].
4. Classification par poids
Le clustering, ou partage de poids, réduit le nombre de valeurs de poids uniques dans un modèle, ce qui présente des avantages pour le déploiement. Elle regroupe d'abord les poids de chaque couche en N clusters, puis partage la valeur centroïde du cluster pour tous les poids appartenant à ce cluster. Vous pouvez regrouper les couches de manière sélective. Plus le nombre de clusters est faible, plus le niveau de compression est élevé, et vice-versa.
Dans le tableau 1, nous voyons qu'une compression de près de 3,5x peut être réalisée avec une perte minimale de 1,6% de la précision lors du regroupement de toutes les couches convolutionnelles avec 32 clusters. Une compression de 2x peut être réalisée en regroupant seulement 3 couches Convolutionnelles avec une réduction de précision inférieure à 0,3%.

Outils open source pour l'optimisation des inférences
Nous avons discuté des techniques, nous allons maintenant aborder les outils qui les appliquent. Dans le tableau 2, vous pouvez voir une liste complète mais non exhaustive d'outils open source pour l'optimisation de l'inférence des réseaux neuronaux.
Parmi eux, TensorFlow Lite est probablement le plus complet et le plus flexible. Il propose de nombreuses techniques de quantification différentes, l'élagage, le regroupement de poids et une fonction expérimentale pour l'apprentissage conscient de la quantification. Il prend en charge un large éventail de dispositifs matériels pendant l'inférence et est facile à utiliser. Cependant, il ne supporte directement que les modèles TensorFlow. Mais vous pouvez optimiser les modèles écrits dans d'autres frameworks en exploitant un format de réseau neuronal global appelé ONNX.
Un autre SDK important, lié aux GPU NVidia, est la bibliothèque TensorRT. Il s'agit d'une bibliothèque créée par NVidia spécifiquement pour son matériel. Elle offre des optimisations spécifiques au système qui permettent une inférence très performante. En outre, elle prend en charge les modèles TensorFlow et PyTorch. Si l'objectif est une latence très faible et un débit élevé, TensorRT est l'outil optimal. Cependant, il est limité au matériel NVidia et il peut être un peu frustrant de travailler avec lui sur leurs appareils embarqués(série Jetson).

Comment trouver la bonne technique d'optimisation pour votre matériel
Maintenant que nous avons expliqué les techniques et outils d'optimisation clés, nous allons nous plonger dans les détails du choix de l'optimisation la plus adaptée à votre matériel. Parfois, les choix sont limités en raison de l'architecture matérielle, mais parfois vous pouvez choisir.
Déploiement sur des CPU de faible puissance: Il peut s'agir du CPU d'un micro-ordinateur (par exemple Raspberry Pi), du CPU d'un téléphone portable ou même du CPU d'un ordinateur portable commercial. La quantification sur 16 bits est possible, mais dans ce scénario, vous devez préférer la quantification sur 8 bits. Les raisons en sont les suivantes :
- Les CPU sont très rapides lorsqu'ils travaillent avec des nombres entiers.
- Par défaut, un modèle quantifié en float16 "déquantifie" les valeurs des poids en float32 lorsqu'il est exécuté sur le CPU [4].
Avec TF-Lite, vous pouvez opter pour une gamme dynamique ou une quantification entière. Vous pouvez effectivement réduire la taille d'un modèle de 4x et obtenir une accélération de 2-3x, généralement avec une faible perte de précision. Mais, assurez-vous de vérifier que la précision du modèle optimisé se situe toujours dans la plage souhaitée.
Déploiement sur un GPU android : Pour les GPU android, TF-Lite supporte les mêmes techniques de quantification que celles listées ci-dessus. Nous suggérons de suivre les mêmes directives.
Déploiement sur du matériel uniquement composé d'entiers : De nombreux microcontrôleurs et de nombreux TPU de périphérie ne prennent en charge que les opérations sur les entiers. Si votre matériel entre dans cette catégorie, votre seule option est d'utiliser une quantification entière. L'accélération sera énorme, surtout pour les TPU, mais assurez-vous d'évaluer le modèle quantifié pour vérifier que la précision se situe toujours dans la plage souhaitée.
Déploiementsur les GPU NVidia : Cette catégorie comprend les GPU commerciaux de calcul haut de gamme et les GPU embarqués comme la série NVidia Jetson. Dans ce scénario, vous avez la possibilité de travailler avec Tensor RT. TensorRT se chargera des détails d'optimisation et peut vous aider à obtenir des FPS en temps réel (20-60 fps).
L'architecture d'un GPU est optimisée pour les opérations avec des nombres à virgule flottante. La quantification jusqu'aux nombres à virgule flottante de 16 bits est généralement un bon point de départ. Si la réduction de la taille de 2x n'est toujours pas suffisante pour atteindre la vitesse d'inférence optimale, alors un élagage conservateur ou un regroupement de poids peut également être appliqué. TF-Lite ne prend en charge que la quantification en flottant 16 bits pour ces GPU. Cependant, TensorRT fournit également une quantification complète sur 8 bits.
Puis-je utiliser des modèles optimisés dans le nuage pour atteindre le temps réel ?
Déploiement sur le cloud : Lorsque vous déployez votre solution sur le cloud, vous avez accès à du matériel puissant, ce qui vous permet d'opter pour un modèle plus grand et plus complexe au départ. Cependant, vous pouvez toujours trouver nécessaire de réduire le délai entre l'entrée et la prédiction, pour atteindre le temps réel.
Dans ce cas, votre principal ennemi est la vitesse et la bande passante du réseau. Puisque vous devez transférer des données dans les deux sens, une grande partie du retard global est due aux coûts de transfert des données. Si le délai de transfert des données dépasse les contraintes en temps réel de l'application, il n'est pas nécessaire d'optimiser la vitesse d'inférence. Optez plutôt pour un dispositif périphérique.
D'autre part, si les délais de transfert de données ne constituent pas un goulot d'étranglement, nous conseillons d'optimiser votre modèle pour la vitesse d'inférence. En supposant que l'inférence soit exécutée sur un GPU haut de gamme, une compression légère vers des flottants de 16 bits, un regroupement de poids de couches cachées spécifiques ou une combinaison de ces éléments devraient vous permettre d'obtenir une vitesse suffisante pour répondre à vos restrictions en temps réel sans sacrifier beaucoup de précision.
Références
[1] Élagage et quantification pour l'accélération des réseaux neuronaux profonds : A Survey.Tailin Liang, John Glossner, Lei Wang, Shaobo Shi, and Xiaotong Zhang
[2] Comprendre l'impact de la quantification de précision sur la précision et l'énergie des réseaux neuronaux. Soheil Hashemi, Nicholas Anthony, Hokchhay Tann, R. Iris Bahar, Sherief Reda.
[3] Où en est l'élagage des réseaux neuronaux ? Davis Blalock, Jose Javier Gonzalez Ortiz, Jonathan Frankle, John Guttag.
[4] https://www.tensorflow.org/lite/performance/model_optimization