« Combien de flash faut-il à un modèle TinyML » reçoit d'ordinaire pour réponse le nombre de poids, qui est le plus petit des trois nombres qui comptent. Voici l'arithmétique complète, pour dimensionner un composant avant d'entraîner quoi que ce soit.
Les trois postes qui consomment de la flash
| Poste | Ce que c'est | Taille typique |
|---|---|---|
| Poids | Les paramètres, quantifiés | paramètres × octets par poids |
| Runtime | Interpréteur, noyaux d'opérateurs, tables de dispatch | 0 à ~40 Ko |
| Description du modèle | Graphe, métadonnées de tenseurs | quelques Ko, ou zéro si compilé |
Le runtime est celui qu'on oublie, et c'est souvent le plus gros. Pour le même réseau de 6 567 paramètres, mesuré :
| Octets | Moteur compilé à forme fixe | TensorFlow Lite for Microcontrollers |
|---|---|---|
| Poids | 7 044 | 32 800 |
| Runtime en flash | 8 400 | 38 912 |
| Total | 15 444 | 71 712 |
L'interpréteur coûte plus de flash que le modèle. Ce n'est pas une critique de TensorFlow Lite — un interpréteur, c'est ce qui permet de changer de modèle sans reflasher. C'est une critique du dimensionnement fait sur le seul compte de poids.
Octets par poids, selon la quantification
| Schéma | Bits/poids | 10 000 paramètres | Multiplications ? |
|---|---|---|---|
| FP32 | 32 | 40 000 o | oui, flottantes |
| int8 | 8 | 10 000 o | oui, entières |
| int4 | 4 | 5 000 o | oui, entières |
| Ternaire, base 3 | ~1,6 | ~2 000 o | non — signe, saut ou copie |
C'est la RAM qui mord vraiment
La flash est bon marché et le devient de plus en plus. La SRAM, ni l'un ni l'autre. Un composant avec 512 Ko de flash et 20 Ko de SRAM est parfaitement ordinaire, et c'est la SRAM qui décide si votre modèle tourne.
Mesuré, pour la ligne modèle de langage, pic de RAM pile comprise sur une vraie compilation Cortex-M3 : 14,5 Ko pour nano, 27,5 Ko pour small, 52 Ko pour classifier, 104 Ko pour tinystories, 205 Ko pour mid, 411 Ko pour le modèle de production 944K. Le tableau complet est ici.
Une procédure de dimensionnement
- Notez la flash et la SRAM réellement disponibles après le reste du firmware.
- Retranchez le runtime. Zéro pour un moteur compilé, des dizaines de kilo-octets pour un interpréteur. Avant de choisir une taille de modèle, pas après.
- Divisez la flash restante par les octets par poids pour obtenir le plafond de paramètres.
- Confrontez ce plafond à la SRAM, pas à la flash. C'est là que la plupart des plans meurent.
- Alors seulement, choisissez une architecture — de préférence une dont l'état ne croît pas avec la longueur d'entrée.