For months our honest line was the same: the Atome inference engine passed bit-exact parity in Python and under QEMU, but we had not yet flashed a physical board. We said, in writing, that when we did we would publish it with the same candor as everything else. This is that post. The 944K Atome model now runs on a real, $5 ESP32-WROOM-32 — generating coherent text, fully offline, with nothing but the chip and a USB cable.Pendant des mois, notre ligne honnête était la même : le moteur d'inférence Atome passait la parité bit-exacte en Python et sous QEMU, mais nous n'avions pas encore flashé de carte physique. Nous avions écrit que, le jour venu, nous le publierions avec la même franchise que le reste. Voici ce billet. Le modèle Atome 944K tourne désormais sur un vrai ESP32-WROOM-32 à 5 $ — il génère du texte cohérent, entièrement hors ligne, avec seulement la puce et un câble USB.
What actually ranCe qui a réellement tourné
The board is a classic ESP32-WROOM-32 (the dual-core ESP32-D0WD-V3, 4 MB flash, no PSRAM). It boots, loads the 944K checkpoint straight from flash, and generates on the chip with no network and no cloud:La carte est un ESP32-WROOM-32 classique (le double cœur ESP32-D0WD-V3, 4 Mo de flash, sans PSRAM). Elle démarre, charge le checkpoint 944K directement depuis le flash, et génère sur la puce, sans réseau ni cloud :
config : d=256 layers=8 head=64 seq=24 state=159 KB (cpu 240 MHz, flash 80 MHz)
Once -> upon a time, there
The dog -> was so excited.
A girl -> was so happy to h
average : 1.0 tok/s (953 ms/token)
Coherent, on-distribution TinyStories text, produced entirely on a microcontroller. The full boot log — chip ID, clocks, memory, generations — is committed in the repository, and the exact binary that produced it is in the release.Du texte TinyStories cohérent et dans la distribution, produit entièrement sur un microcontrôleur. Le journal de démarrage complet — identifiant de puce, horloges, mémoire, générations — est versionné dans le dépôt, et le binaire exact qui l'a produit est dans la release.
Reproduce it yourself in two minutesReproduisez-le vous-même en deux minutes
A claim about hardware is only worth what someone else can check. Grab the prebuilt merged image from the release, verify it against the published SHA256SUMS, flash it with one command, and watch:Une affirmation sur le matériel ne vaut que ce qu'un tiers peut vérifier. Récupérez l'image fusionnée pré-compilée depuis la release, vérifiez-la avec le SHA256SUMS publié, flashez-la en une commande, et regardez :
pip install esptool pyserial
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash 0x0 atome_esp32_merged.bin
python3 -m serial.tools.miniterm /dev/ttyUSB0 115200 # press the board's EN button
No ESP-IDF, no build toolchain needed to verify. The firmware embeds the repository's own C99 engine — the same one with bit-exact Python parity — so what you flash is what we measured.Aucun ESP-IDF, aucune chaîne de compilation nécessaire pour vérifier. Le firmware embarque le moteur C99 du dépôt lui-même — celui à la parité bit-exacte avec Python — donc ce que vous flashez est ce que nous avons mesuré.
No PSRAM? A short window instead of a smaller brainPas de PSRAM ? Une fenêtre courte plutôt qu'un cerveau réduit
A bare ESP32 reports 369 KB of free RAM, but its largest contiguous block is only ~168 KB — classic ESP32 memory fragmentation. The 944K model's quality is independent of context length; only its RAM scales with it. So instead of swapping in a dumber model, we shrank the context window to 24 tokens, which brings the working state to 159 KB and fits. You get the full-quality model with shorter completions. A PSRAM board (ESP32-WROVER or ESP32-S3-R8) runs the full-length configuration; that is the next data point.Un ESP32 nu affiche 369 Ko de RAM libre, mais son plus grand bloc contigu ne fait que ~168 Ko — la fragmentation mémoire classique de l'ESP32. La qualité du modèle 944K est indépendante de la longueur de contexte ; seule sa RAM en dépend. Plutôt que de basculer sur un modèle plus bête, nous avons réduit la fenêtre de contexte à 24 tokens, ce qui ramène l'état de travail à 159 Ko et le fait tenir. Vous obtenez le modèle pleine qualité avec des complétions plus courtes. Une carte à PSRAM (ESP32-WROVER ou ESP32-S3-R8) exécute la configuration pleine longueur ; ce sera le prochain point de mesure.
What this is — and what it is notCe que c'est — et ce que ce n'est pas
This is a proof of execution: the model runs on real silicon, reproducibly, and you can check it. It is not a benchmark win and not a moat. About 1 token per second is in known territory — the throughput is flash-bound, since roughly 270 KB of ternary weights are streamed from SPI flash for every token. We have not run a same-chip, same-budget head-to-head against another microcontroller LM, and the favourable parts of Atome's story remain regime-dependent (they hold at the ~60K engine-default size, not at 944K). Calling this "the model runs on a chip" is true; calling it "fastest" or "best" would not be, and we are not.Il s'agit d'une preuve d'exécution : le modèle tourne sur du silicium réel, de façon reproductible, et vous pouvez le vérifier. Ce n'est pas une victoire de benchmark ni un avantage défendable. Environ 1 token par seconde est un terrain connu — le débit est limité par le flash, puisque ~270 Ko de poids ternaires sont lus depuis le flash SPI à chaque token. Nous n'avons pas mené de comparaison directe à puce et budget égaux contre un autre LLM sur microcontrôleur, et les parties favorables de l'histoire d'Atome restent dépendantes du régime (elles tiennent à la taille par défaut ~60K, pas à 944K). Dire « le modèle tourne sur une puce » est vrai ; dire « le plus rapide » ou « le meilleur » ne le serait pas, et nous ne le disons pas.
Why it still mattersPourquoi cela compte tout de même
It closes the one caveat that had hung over every number on this site: "QEMU only, no silicon." That sentence is now retired. A language model that lived as a simulation and a set of tests is, today, a thing you can hold, power from a phone charger, and watch write words with no internet attached. From here the work is concrete and measurable: the full-context configuration on a PSRAM board, energy per token on real hardware, and an honest same-chip comparison. We will publish each one the way we published this — with the binary, the log, and the caveats in the same breath.Cela referme la seule réserve qui planait sur chaque chiffre de ce site : « QEMU uniquement, pas de silicium ». Cette phrase est désormais retirée. Un modèle de langue qui n'existait que comme simulation et suite de tests est, aujourd'hui, un objet que l'on peut tenir, alimenter depuis un chargeur de téléphone, et regarder écrire des mots sans aucune connexion. À partir d'ici, le travail est concret et mesurable : la configuration pleine fenêtre sur une carte à PSRAM, l'énergie par token sur matériel réel, et une comparaison honnête à puce égale. Nous publierons chacun comme celui-ci — avec le binaire, le journal et les réserves dans la même phrase.
Frequently asked questionsQuestions fréquentes
Does Atome run on a real ESP32 now, not just QEMU?Atome tourne-t-il sur un vrai ESP32 maintenant, pas seulement sous QEMU ?
Yes. The 944K checkpoint runs on a physical ESP32-WROOM-32 (no PSRAM), generating coherent text fully offline at about 1 token per second. A prebuilt binary, the serial log, and a one-command flash are in the GitHub release so anyone can reproduce it.Oui. Le checkpoint 944K tourne sur un ESP32-WROOM-32 physique (sans PSRAM), générant du texte cohérent entièrement hors ligne à environ 1 token par seconde. Un binaire pré-compilé, le journal série et un flash en une commande sont dans la release GitHub pour que chacun puisse le reproduire.
How fast is Atome on a real ESP32?Quelle est la vitesse d'Atome sur un vrai ESP32 ?
About 1.0 token per second (~953 ms/token) at 240 MHz with 80 MHz flash. It is flash-bound — roughly 270 KB of weights are read per token. This is a proof-of-execution number, not a benchmark win.Environ 1,0 token par seconde (~953 ms/token) à 240 MHz avec un flash à 80 MHz. Le débit est limité par le flash — environ 270 Ko de poids lus par token. C'est un chiffre de preuve d'exécution, pas une victoire de benchmark.
← All posts← Tous les articles Get the binary & serial log →Binaire & journal série → Source on GitHubCode sur GitHub