NOUVEAU Atome tourne sur un ESP32 physique — texte cohérent, hors ligne, ~1 tok/s. Binaire & journal reproductibles.

Atome · lm · 2026

Pas de cloud.Pas d'internet.Pas de GPU.

Le modèle est le firmware.

Un modèle de langue en 271 Ko.

Un modèle de langue assez petit pour vivre à l'intérieur d'une puce à 5 $ — du genre déjà présent dans votre thermostat, un jouet d'enfant, une prothèse auditive. Modèle de langue ternaire 944K paramètres, parité bit-exacte Python ↔ C99 ↔ Cortex-M3. 2,6 Ko de moteur + 271 Ko de poids. Sur un MCU à 5 $.

Le projet

Une IA pour les objets, pas pour les chatbots.

L'IA quotidienne vit dans des datacenters. Les puces qui font tourner votre monde n'en ont aucune. Atome lm change ça. La classe MCU a une petite poignée de pairs : llama2.c sur MCU, TinyMaix, esp32-llm. La forme d'Atome lm : poids ternaires + moteur C99 zéro-heap + parité bit-exacte sous QEMU.

944K paramètres à 1,58 bit/poids → 271 Ko. Le même blob se charge dans un moteur C99 sur Cortex-M0/M3/M4/M4F/M7 en 2,6-2,8 Ko de .text.

Les piliers

Quatre choses qui tiennent ensemble.

La plupart des petits LM en touchent une ou deux. La revendication d'Atome lm, c'est la combinaison — chaque pilier est vérifiable depuis le dépôt.

01 · Prouvable

Bit-exact dans toute la pile

Python sur un portable, C sur un serveur, firmware sur une puce émulée — chaque couche produit la même réponse, octet par octet.

Max |Δ| = 3.7×10⁻⁷
48/48 sur 60K · 16/16 sur 944K

02 · Minuscule

Tient dans le budget firmware réel

Le moteur compile en 2,6 kilo-octets — plus petit que ce paragraphe.

2.6–2.8 KB .text
sur Cortex-M0/M3/M4/M4F/M7

03 · Étanche

Zéro heap · zéro syscall · zéro réseau

Pas d'allocateur, pas d'appel réseau, pas de télémétrie. Air-gappable par construction.

Pas de malloc · socket · fopen
absence d'exfiltration prouvable

04 · Reproductible

Chaque étape mesurée, pas estimée

De l'entraînement à l'exécution sur puce émulée — chaque mesure de cette page vient d'un script.

146 / 146 tests
chaque chiffre est généré par un outil du dépôt

Fonctionnement

Trois petits spécialistes. Un aiguilleur.

Trois spécialistes plus petits et un mini-aiguilleur qui choisit pour chaque caractère. Trois opérations en parallèle — conv depthwise (k=5), SSM diagonal, attention top-k=4 — combinées par routeur softmax.

01 · Local

Voit les 5 dernières lettres Conv causale depthwise, k=5

Un filtre courte portée pour les motifs entre lettres voisines. Noyau ternaire, sans biais. O(L·k) par token.

02 · État

Garde la phrase en mémoire SSM diagonal

Un chemin de mémoire longue. FP32 par canal. Récurrent O(1) à l'inférence.

03 · Sparse

Pointe vers un mot précédent Attention causale top-k=4

Pour les mots qui dépendent d'un mot précédent précis. Q/K/V ternaires. Softmax sur les 4 meilleures clés.

Applications

Ce pour quoi c'est conçu.

Atome lm n'est pas un chatbot généraliste. C'est un spécialiste étroit qu'on fine-tune sur les données qui comptent pour votre produit — puis il se livre dans le firmware.

Ampoules connectées

Commandes vocales locales

Jouets & poupées

Aucun enregistrement

Conteurs pour dormir

Génération hors-ligne

Distributeurs animaux

Messages de statut

Automobile

Détection d'intention vocale

Montres & wearables

Compréhension au poignet

Agriculture

Reconnaissance terrain

Wearables médicaux

Classification ECG / vitaux

Capteurs industriels

Détection d'anomalie

Compteurs énergie & eau

Parseur de relevés on-device

Prothèses auditives

Complétion sur appareil

Radios de secours

Aide texte hors-réseau

Prototypes qui marchent

Trois choses qu'elle fait déjà.

Au-delà d'écrire des histoires, le moteur tourne comme classifieur texte étroit — le genre qu'un vrai produit embarqué livre. Trois prototypes internes, entraînés, exportés et exécutés sur l'émulateur Cortex-M3. Les scripts d'entraînement ne sont pas dans le kit public ; le chemin moteur l'est.

01 · Mot-clé / intention

Choisit la bonne commande

Classifieur 6 classes sur chaînes byte-tokenisées, 1800 échantillons synthétiques.

précision hold-out 100 %
02 · Lecture suspecte

Repère les lectures suspectes

Classifieur binaire sur chaînes capteur synthétiques. 1000 échantillons, 30 epochs.

précision hold-out 91.7 %
03 · Bucket d'intention

Range une phrase dans 5 buckets

Classifieur 5 voies (commande / question / statut / alerte / salutation), 1500 échantillons.

précision hold-out 100 %

Compatibilité matérielle

Vrais chiffres, vraies puces.

RAM crête = .bss + high-water stack mesuré sur build Cortex-M3 sous QEMU MPS2-AN385.

Taille Sert à RAM STM32F103$2-4 RP2040$4 STM32F411$15 STM32F7$15-30 ESP32-S3$5-10
nano Prouve que le moteur tient sur les plus petites puces 14.5 KB
small Routage de mots-clés courts 27.5 KB no RAM
classifier Têtes de classification on-device 52 KB no
tinystories Écriture façon histoire pour enfants 104 KB no RAM
mid Écriture sur un sujet précis 205 KB no no RAM
prod (944K) Prose complète — le modèle qui écrit en haut 411 KB no no RAM no

La preuve

Trois environnements. Une réponse.

Le même modèle, exécuté sur un portable, un serveur et un microcontrôleur émulé, retourne les mêmes mots octet par octet. Pas « proche » — identique. C'est ce qui rend le modèle auditable pour tout produit qui doit être certifié.

Python · PyTorch
Forward de référence
C99 · zero-heap
Moteur d'inférence
Cortex-M3 · QEMU MPS2-AN385
Silicium émulé
3.7×10⁻⁷
Max |Δ| sur les 3 étapes
48 / 48
Parité multi-token, démo 60K
16 / 16
Parité multi-token, 944K
146 / 146
pytest, verts à HEAD

Vérifié par tests/test_parity_with_c.py + tests/test_parity_multitoken.py — chaque run reproductible depuis un checkout vierge.

Le résultat

Une victoire mesurée, et une défaite mesurée.

Sur TinyStories : Atome 6,31 ppl vs vanilla 8,12 à params égaux ; 6,31 vs 13,10 à flash égal. S'inverse à 944K paramètres où vanilla gagne d'environ 11 %.

60K · params égaux
−22 %
Atome 6,31 ppl · vanilla 8,12 ppl
60K · flash égal
−52 %
Atome 6,31 ppl · vanilla-6K 13,10 ppl
944K · params égaux
+11 %
vanilla 2,54 ppl · Atome 2,87 ppl
944K · disque
20×
Atome 271 Ko · vanilla 3,7 Mo

Seed unique ; multi-seed à venir. Lecture complète : HONEST_RESULTS.md.

Par rapport au reste

Une revendication plus étroite mais vérifiable.

D'autres LM de classe MCU existent. Combinaison plus étroite d'Atome lm : ternaires + zéro-heap + parité bit-exacte sous QEMU.

BitNet b1.58

Plus petit
700M – 3B
Poids
ternaires
Tourne sur
serveur / téléphone

llama2.cStories260K

Plus petit
260K – 110M
Poids
FP32 / Q8
Tourne sur
classe MCU possible

TinyMaixesp32-llm

Plus petit
~15M
Poids
Q8 / FP32
Tourne sur
ESP32-S3 (PSRAM)

Atome lm

Taille
60K · 944K
Poids
ternaires, zéro-heap
Vérifié
Cortex-M3 (QEMU) · bit-exact

Pas encore : on n'a pas encore flashé sur une puce physique ni mesuré les Joules par token. Tant que ce n'est pas fait, la promesse « boote sur silicium » reste sous QEMU.

Ce que vous pouvez construire

Une brique, pas un produit.

Le kit public livre l'architecture + le moteur + un LM TinyStories 944K. Trois classes de tâches s'adaptent :

LM étroit, sur un seul domaine

Entraîné sur un seul domaine, le modèle parle couramment dans ce périmètre.

Classifieurs texte on-device

Une tête de classification se branche sur le backbone. Scripts d'entraînement non inclus dans le kit public ; le chemin moteur l'est.

Signal de routeur par token

L'entropie du routeur est observable gratuitement à chaque position. Calibration à 60K non mesurée.

Filiation

Issu de la recherche interne.

Atome lm est le visage embarqué d'un projet de recherche plus large. L'architecture 3-chemins et le moteur C99 sont publics sur GitHub sous Apache 2.0. Variantes plus élaborées internes. Intégration production : bonjour@atomelm.com.

Ce qu'on en dit

Elle est partie dans la nature.

Voici ce que certains en pensent — de vraies réactions de la communauté r/esp32, sourcées.

aq u/aquoad l'a exécuté sur sa carte

Plutôt cool. Le modèle complet tourne (lentement, c'en est comique) sur une carte ESP32-S2 de 6 ans avec PSRAM SPI externe — j'ai dû désactiver le watchdog de la tâche idle.

==================== ATOME on SILICON ====================
chip   : ESP32-S2 rev v0.0   cores=1   flash : 4 MB
PSRAM  : 2048 KB (detected)
model  : 276655 bytes embedded in flash
config : d=256 layers=8 head=64 seq=128 state=811 KB
---------------------------------------------------------
prompt: Once  >>> upon a time, there was a little girl named Lily
average: 0.1 tok/s | heap low-water: 243 KB internal
reproduction indépendante · journal série publié
Ic u/IcestormsEdr/esp32

Je vais clairement essayer. Merci beaucoup.

24
ur u/urgeekyduder/esp32

En tant qu'étudiant en systèmes embarqués, merci pour ce beau travail, continuez 🔥

15
Mo u/MossiGuyr/esp32

wow je dois essayer ça, c'est franchement impressionnant qu'un LLM tourne sur un microcontrôleur

8
We u/Wemos_D1r/esp32

Qu'il détecte les lectures de capteur erronées est un super cas d'usage pour un si petit modèle. Beau boulot :p

6
sh u/shisohanr/esp32

Imaginez un cluster beowulf : 64 ESP32 et vous avez vos 60 t/s pour 300 $ !

3

Les citations proviennent du fil public r/esp32, avec le pseudo et le score de chaque auteur. Tout lire à la source ↓