Faire tenir un réseau de neurones dans 128 Kio : quantification et IA embarquée sur Deepgreen

par Théo Taburet
Comment faire tourner un réseau de neurones sur un microcontrôleur qui ne dispose que de 128 Kio de mémoire vive ?
Dans le projet Deepgreen, l'objectif est de détecter automatiquement les premières signatures d'un défaut sur une machine tournante, à partir d'un capteur vibratoire. Le détecteur est un petit réseau de neurones, et le calculateur un microcontrôleur avec 128 Kio de mémoire vive. Pour faire tenir l'un dans l'autre, nous avons quantifié le réseau : ses nombres, des flottants sur 32 bits, deviennent des entiers sur 8 bits accompagnés d'une échelle. La valeur 0,37, par exemple, devient l'entier 47 à l'échelle 1/128. Le réseau occupe 4 fois moins de mémoire, et le processeur calcule en entiers, plus vite et pour moins d'énergie qu'en flottant.
La quantification a un second avantage, moins connu que le gain de place. Quand les échelles sont des puissances de 2, le réseau entier se calcule avec des multiplications entières, des additions sur 32 bits et des décalages de bits. Plus aucun arrondi flottant n'entre en jeu, et le programme donne exactement le même résultat, bit pour bit, sur un ordinateur de bureau et sur la carte. Nous pouvons donc vérifier le code embarqué à l'identique avant de le charger sur le MCU, et le comparer à sa référence sans tolérance : le moindre écart fait échouer l'export.
La difficulté tient dans une question : combien de valeurs distinctes faut-il pour représenter un signal ? Avec 8 bits, il y en a 256. L'échelle doit donc couvrir les valeurs extrêmes sans perdre le grain des valeurs courantes. Pour les poids, les paramètres appris du réseau, une échelle par canal suffit. Pour les activations, les valeurs calculées à chaque passage du signal, tout se joue à la calibration, le choix des plages à partir d'un flux de données représentatif. Deux écoles existent. La post-training quantization (PTQ) se contente de calibrer le réseau tel qu'il a été entraîné. Le quantization-aware training (QAT) le réentraîne avec l'arrondi simulé dans la boucle d'apprentissage. La seconde coûte plus cher, et elle ne rattrape jamais une plage mal choisie à l'entrée.
Sur Deepgreen, le réseau est un autoencodeur : il apprend à reconstruire le signal d'une machine saine, et l'erreur de reconstruction sert de score d'anomalie. Le seuil d'alarme d'une machine est le pire score observé pendant sa période saine, donc les fenêtres de signal les plus extrêmes décident de tout. Deux choix en découlent. Les activations restent sur 16 bits, ce qui garde à la fois la dynamique de ces fenêtres et la résolution des fenêtres ordinaires. Les poids passent sur 8 bits, d'où le nom de la variante, w8a16. Et les plages de calibration se calculent sur la totalité du flux d'entraînement, pour qu'aucune fenêtre extrême ne soit écrêtée(, le tout sans réentraînement : la calibration seule suffi).
Le résultat se juge sur les alarmes. Le réseau quantifié détecte les mêmes amorces que le réseau flottant et lève les mêmes fausses alarmes, aux mêmes mesures. Le détecteur validé en flottant reste donc valide en int8, sans nouvelle qualification. Sur la carte, le programme reproduit la simulation bit pour bit et traite chaque fenêtre de signal en une fraction de seconde, sans perte mesurable.