28,9 millioner parametere kjører på en ESP32 med 512 KB SRAM
Flytt 25 av 28,9 millioner parametere til flash, og en språkmodell får plass på en mikrokontroller med 512 KB SRAM.
Prosjektet esp32-ai på GitHub setter to tall opp mot hverandre: 28,9 millioner parametere mot 512 KB SRAM. Modellen genererer tekst direkte på en ESP32-S3 uten å sende noe til en server, og skriver 9,88 tokens i sekundet ut på en liten skjerm koblet til brikken. Regnetiden er 94,9 millisekunder per token.
Løsningen ligger i hvor parameterne bor. 25 av de 28,9 millionene ligger i en oppslagstabell som modellen leser fra i stedet for å regne på, og den tabellen blir liggende i treg flash. Per token hentes rundt seks rader, omtrent 450 byte. Aktiveringer og norm-vekter, som berøres mange ganger per token, får plass i SRAM, mens den tette kjernen og output-hodet leses én gang per posisjon fra 8 MB PSRAM. Ideen heter Per-Layer Embeddings og kommer fra Googles Gemma 3n, her lagt på minnehierarkiet i en mikrokontroller i stedet for en telefon eller en GPU.
Repoet har to ferdigtrente modeller: TinyStories for historiegenerering og Barista for spørsmål om espresso. Brikken holder én av gangen, så utrulling erstatter den som allerede ligger der. TinyStories-modellen skriver korte, enkle historier som stort sett henger sammen, men den svarer ikke på spørsmål, følger ikke instruksjoner, skriver ikke kode og kan ingen fakta. Begrensningen sitter i den lille delen av modellen som faktisk resonnerer, og minnetrikset endrer ikke på det.
Verdien for deg som bygger ligger derfor i arkitekturen, ikke i hva 28,9 millioner parametere har å si. Datasettet TinyStories kommer fra Ronen Eldan og Yuanzhi Li ved Microsoft Research, og treningsoppsettet følger Andrej Karpathys llama2.c. Både treningskoden, ablasjonene og kvantiseringen som reproduserer de publiserte tallene ligger i repoet.
Hva bør du gjøre?
- Hent en av modellene med scripts/fetch_model.sh. Skriptet sjekker SHA-256 og byte-størrelse mot verdier som er låst i skriptet, kryssjekker utgivelsens egen metadata.json mot de samme verdiene, og installerer ingenting hvis en kontroll feiler.
- Kjør scripts/deploy.sh for å generere headere, kompilere og flashe. Det skriptet går aldri på nett, så nedlasting og utrulling er to adskilte operasjoner mot to ulike angrepsflater.
- Les RESULTS.md før du bygger videre på oppsettet. Målingene gjort på selve brikken og ablasjonene ligger der, og den gjenbrukbare arkitekturen ligger i src/.
KI-kuratert — innholdet er generert av KI-agenter basert på originalkilden.