Architecture

Trois spécialistes et un routeur

Pourquoi trois petits mécanismes battent un gros quand la SRAM est le mur.

La plupart des modèles de langage utilisent un seul mécanisme pour tout : empiler des blocs d'attention, les élargir, les approfondir. Cela marche quand la mémoire est bon marché. Sur un composant à 20 Ko de SRAM, non — parce que ce qui vous tue n'est pas l'arithmétique, c'est l'état qu'il faut conserver pendant qu'on la fait.

Le bloc d'Atome LM exécute trois opérations structurellement différentes en parallèle et laisse un petit routeur décider, jeton par jeton, de la part de chacune. Trois petits spécialistes coûtent moins de mémoire qu'un gros généraliste à qualité égale : c'est tout l'argument architectural.

Les trois voies

1 · Locale — convolution causale profonde, k=5

Un filtre à courte portée sur les cinq dernières positions. Noyau ternaire, sans biais, O(L·k) par jeton. C'est la voie qui traite les petites régularités entre caractères voisins. Elle est bon marché parce qu'elle est locale, et elle est locale parce que l'essentiel du signal dans un texte au niveau de l'octet l'est aussi.

2 · État — modèle d'espace d'états diagonal

La mémoire longue. Elle transporte l'information depuis le début de la phrase et — c'est là que ça compte sur un microcontrôleur — elle est récurrente à l'inférence, O(1) par jeton en état. Elle ne fait pas grossir de cache. Ses paramètres a, b et c_out restent en FP32 par canal, parce que la récurrence est le seul endroit où l'arrondi ternaire se compose sur la longueur de la séquence.

3 · Parcimonieuse — attention causale top-k=4

Pour les cas où un jeton dépend d'un jeton antérieur précis plutôt que d'un résumé lisse du passé. Projections Q/K/V ternaires, softmax sur les quatre meilleures clés seulement. Une attention complète donnerait une meilleure réponse et aussi un cache clé-valeur dont la taille croît avec le contexte — précisément ce qui fait franchir le mur de la SRAM à un transformeur sur cette classe de composant.

Le routeur

Un softmax par jeton sur les trois sorties. Petit, entraîné conjointement, et doté d'un effet de bord utile : son entropie est observable gratuitement à chaque position. Un routeur confiant signifie que le bloc sait de quel mécanisme le jeton courant a besoin ; un routeur plat signifie que l'entrée ne ressemble à rien de ce qu'il a vu. Sa calibration comme estimateur d'incertitude à l'échelle 60K n'a pas été mesurée ici : c'est un diagnostic, pas une garantie.

Pourquoi ternaire, et où cela cesse d'aider

Chaque poids de projection vaut −α, 0 ou +α, avec α une échelle unique par tenseur. Trois états portent log₂(3) ≈ 1,58 bit. Deux conséquences :

Et le coût, dit clairement : trois niveaux par poids sont une vraie limite de capacité. Le biais inductif ternaire remplace la capacité à petite échelle et la contraint à grande échelle. Sur TinyStories, 3 000 pas, une seule graine : 6,31 contre 8,12 de perplexité à 60 000 paramètres, et 2,87 contre 2,54 à 944 000 — soit une défaite d'environ 11 %.

Ce que le moteur n'a pas

Pas de malloc, pas de socket, pas de fopen, aucun appel système. L'absence est vérifiable dans la table des symboles de l'objet compilé, ce qui est plus fort qu'une politique de confidentialité. Il compile en 2,6–2,8 Ko de .text sur Cortex-M0, M3, M4, M4F et M7, sans supposer d'unité flottante, de cache ou de MMU.