Le point de contrôle 944K d'Atome est livré sous forme d'un binaire de 271 Ko. Le même modèle stocké en flottants 32 bits pèse 3,7 Mo. Cette réduction d'environ 14× — près de 20× dans la configuration par défaut du moteur, plus petite — provient presque entièrement d'une décision : les poids ternaires. Si vous avez entendu l'expression « LLM 1,58 bit » sans savoir ce qu'elle recouvre, en voici la version courte et concrète.
Trois valeurs par poids
Dans un réseau de neurones classique, chaque poids est un nombre flottant 32 bits. Dans un réseau ternaire, chaque poids vaut l'une de trois valeurs seulement : −α, 0 ou +α, où α est un unique facteur d'échelle partagé sur tout un tenseur. C'est l'idée de BitNet b1.58. Comme trois états portent log₂(3) ≈ 1,58 bit d'information, on parle de « 1,58 bit ». Empaqueté efficacement en base 3 — le format ATOME01 d'Atome stocke quatre trits par octet — le modèle se réduit à une petite fraction de sa taille en flottant.
Pourquoi c'est rapide, pas seulement petit
La taille n'est que la moitié de l'histoire. Les poids ternaires éliminent aussi les multiplications du produit matriciel : multiplier une activation par −1, 0 ou +1 revient à un changement de signe, un saut ou une copie — aucune multiplication flottante. Sur un microcontrôleur sans unité de calcul flottant ni SIMD, c'est une économie énorme. La boucle interne coûteuse de l'inférence se réduit à des additions et des changements de signe, ce qu'un petit cœur Cortex-M exécute vite et de façon prévisible.
Ce que cela coûte
La quantification n'est jamais gratuite. Trois niveaux par poids constituent une vraie limite de capacité, et le résultat honnête est que le biais inductif ternaire compense la capacité à petite échelle et la contraint à grande échelle. Autour de 60K paramètres, le bloc ternaire routé d'Atome bat un transformeur FP32 à nombre de paramètres égal d'environ 22 % en perplexité. Mais portez la même recette à environ 944K paramètres et un modèle flottant classique l'emporte d'environ 11 %. Le ternaire est le bon outil quand le flash et la RAM sont la contrainte déterminante — pas quand l'objectif est la précision maximale à l'échelle.
Ternaire face aux autres quantifications
La plupart des quantifications embarquées s'arrêtent au 8 bits (int8), qui offre une réduction de taille de 4× et conserve les multiplications. Le ternaire va beaucoup plus loin en taille et supprime entièrement les multiplications, au prix d'un arrondi plus agressif. Atome propose aussi un quantificateur « spectre » optionnel en puissances de trois (niveaux {0, ±1, ±3, ±9}·α, environ 2,81 bits) qui récupère un peu de précision quand les octets supplémentaires en valent la peine — dans le run public à trois graines, il a devancé le ternaire simple, 7,40 contre 7,77 de perplexité. L'idée est que la quantification est un curseur, et le ternaire se situe à l'extrême où la mémoire compte le plus.
Tout ceci est reproductible depuis le dépôt public : le code d'empaquetage, les points de contrôle entraînés et les journaux d'entraînement pas à pas sont fournis, de sorte que chaque chiffre ci-dessus peut être vérifié et non simplement cru.
Comment l'entraînement garde les poids ternaires utilisables
Si vous arrondissiez simplement un modèle flottant entraîné à trois niveaux, vous le détruiriez — l'erreur d'arrondi par poids est énorme. Les modèles ternaires l'évitent en étant entraînés ternaires dès le départ, à l'aide d'un estimateur straight-through : la passe avant quantifie les poids vers {−α, 0, +α}, tandis que la passe arrière met à jour une copie fantôme cachée en pleine précision comme si la quantification était l'identité. Au fil de l'entraînement, le réseau apprend des poids robustes au fait d'être ramenés à trois niveaux, parce qu'il n'a jamais vu que les valeurs quantifiées dans sa propre passe avant. Le facteur d'échelle α par tenseur absorbe la magnitude globale, donc les trois niveaux portent le signe et la parcimonie tandis que α porte l'échelle.
Le bonus de parcimonie
Le niveau central — zéro — n'est pas qu'une valeur ; c'est de la compression gratuite et du calcul gratuit. Un poids exactement nul ne contribue en rien à la sortie, il peut donc être entièrement ignoré dans le produit matriciel. Les réseaux ternaires entraînés tendent à pousser une grande part des poids vers zéro, ce qui signifie qu'une part significative du travail de multiplication-accumulation disparaît tout simplement. Sur un microcontrôleur, où chaque cycle et chaque microampère compte, ignorer les connexions à poids nul est une économie directe et mesurable, en plus de l'empreinte flash réduite.
Rien de tout cela n'est magique, et le compromis de la section principale tient toujours : trois niveaux limitent la capacité, c'est pourquoi le ternaire brille à petite échelle et se fait dépasser par les modèles flottants quand la place existe. Mais cela explique pourquoi un modèle ternaire n'est pas simplement un modèle flottant compressé — c'est un objet différent, entraîné différemment, dont les caractéristiques de calcul et de mémoire conviennent à un microcontrôleur bien mieux qu'un modèle GPU arrondi ne le pourrait jamais.
Où le ternaire se situe dans le paysage de la quantification
Il est utile de placer le ternaire sur la même carte que les schémas de quantification que vous connaissez peut-être déjà. La virgule flottante 32 bits complète est le défaut d'entraînement et la plus précise, mais aussi la plus grande et la plus coûteuse à calculer. La quantification en entiers 8 bits, le cheval de trait de l'inférence mobile et embarquée, réduit la taille par quatre et conserve les multiplications entières, un compromis confortable quand on dispose de quelques mégaoctets. Le ternaire se situe à l'extrémité du spectre : environ vingt fois plus petit que le flottant, avec les multiplications entièrement supprimées, au prix de l'arrondi le plus agressif. Le bon choix dépend de l'emplacement de votre contrainte déterminante. Si vous avez des mégaoctets, le 8 bits est souvent le choix pragmatique. Si votre contrainte est des kilooctets de SRAM et de flash de microcontrôleur, le ternaire est la technique qui tient réellement, et Atome est construit autour de cette extrémité du curseur plutôt que de chercher à être optimal partout.
En résumé
Un LLM ternaire stocke chaque poids comme l'une de trois valeurs — environ 1,58 bit au lieu de 32 — ce qui permet à un modèle entraîné de passer de mégaoctets à des centaines de kilooctets et d'éliminer les multiplications de l'inférence. Il est entraîné ternaire dès le départ, pas arrondi après coup, et le niveau zéro apporte à la fois compression et calcul économisé. Le compromis est réel : trois niveaux aident à petite échelle et contraignent à grande échelle, donc le ternaire est le bon outil quand le flash et la RAM sont la contrainte déterminante. C'est précisément le régime pour lequel Atome est conçu.
Questions fréquentes
Que signifie 1,58 bit dans un LLM ?
Cela signifie que chaque poids prend l'une de trois valeurs (−α, 0, +α). Trois états portent log₂(3) ≈ 1,58 bit d'information, d'où « 1,58 bit », tel qu'introduit par BitNet b1.58.
Les poids ternaires rendent-ils un modèle moins précis ?
À très petite échelle, la structure ternaire peut même aider — Atome bat un modèle FP32 équivalent d'environ 22 % à 60K paramètres. À plus grande échelle, elle pénalise : un modèle flottant gagne d'environ 11 % à 944K. C'est un compromis mémoire/précision.