Ejecutando un LLM de 28.9M de Parámetros en un Microcontrolador ESP32-S3 de $8

Aprende cómo las Embeddings por Capa de los modelos Gemma de Google permiten que un modelo de lenguaje de 28.9M de parámetros se ejecute completamente en un chip ESP32-S3 de $8, generando texto a 9.5 tokens por segundo.

El Problema: Los LLM no Caben en Microcontroladores

Los microcontroladores tienen muy poca memoria rápida. El ESP32-S3, un chip popular que cuesta alrededor de $8, te da solo 512KB de SRAM. Normalmente, todo el modelo debe cargarse en esta memoria rápida para ejecutar inferencia, lo que limita severamente el tamaño del modelo. El estado del arte anterior en un chip similar era de apenas 260,000 parámetros.

El Avance: Embeddings por Capa

La idea clave proviene de los modelos Gemma 3n y Gemma 4 de Google: Embeddings por Capa (PLE). La mayoría de los parámetros de un modelo de lenguaje viven en la tabla de embeddings — una gran tabla de búsqueda que mapea tokens a vectores. El modelo lee de esta tabla pero no realiza cálculos en ella. Así que puedes dejar esa tabla de 25 millones de filas en la memoria flash lenta y extraer solo las pocas filas (aproximadamente 450 bytes) que necesita cada token. La pequeña parte que realiza el cálculo real permanece en la SRAM rápida.

Esto significa que el modelo grande cuesta casi nada de ejecutar — nunca cargas la mayor parte. Simplemente permanece en la flash y se muestrea poco a poco.

Los Números

Métrica Valor
Parámetros 28.9M almacenados (25M en tabla de búsqueda flash)
Chip ESP32-S3 (~$8) con 512KB SRAM, 8MB PSRAM, 16MB flash
Velocidad ~9.5 tok/s de extremo a extremo (9.7 tok/s de cómputo puro)
Conectividad Ninguna — todo se ejecuta en el dispositivo
Tamaño del modelo 14.9MB a 4 bits

Distribución de Memoria

El truco funciona gracias a una jerarquía de memoria cuidadosa:

  • SRAM (rápida, pequeña): El núcleo "pensante" — usado en cada token
  • PSRAM (media): La cabeza de salida y la memoria de trabajo
  • FLASH (enorme, lenta): La tabla de 25M de parámetros — aproximadamente 6 filas leídas por token (~450 bytes)

Qué Hace (y Qué No)

El modelo fue entrenado en TinyStories (Ronen Eldan y Yuanzhi Li, Microsoft Research), por lo que escribe historias cortas y simples y en su mayoría las mantiene coherentes. No responderá preguntas, seguirá instrucciones, escribirá código ni sabrá hechos. Ese límite proviene de la pequeña parte de razonamiento del modelo — el truco de memoria no cambia lo que un modelo de 28.9M de parámetros puede decir.

Ejecutarlo Tú Mismo

El firmware completo, los diagramas de cableado y los pasos de flasheo están en firmware/esp32_llm/README.md. El código de entrenamiento, ablación y cuantización está en src/ y experiments/. El método completo, las ablaciones y las mediciones en el chip están documentados en RESULTS.md.

Créditos

  • TinyStories: El conjunto de datos — historias sintéticas cortas lo suficientemente simples para que modelos pequeños aprendan escritura coherente (arXiv:2305.07759)
  • Embeddings por Capa: El diseño de Google a partir de los modelos Gemma, que permite modelos grandes en chips pequeños
  • llama2.c: El trabajo de Andrej Karpathy que inspiró la idea de que puedes entrenar un modelo de lenguaje pequeño y ejecutarlo en C puro

La Historia Desordenada

El repositorio preserva intencionalmente la historia desordenada, incluyendo un error en la contabilidad de parámetros que infló los números iniciales, y el resultado corregido. El historial de commits y RESULTS.md muestran dónde se movieron los números y por qué.

Este proyecto demuestra que con la arquitectura adecuada, incluso un microcontrolador de $8 puede ejecutar un modelo de lenguaje sorprendentemente capaz — abriendo posibilidades para aplicaciones de IA verdaderamente en el borde.

Fuente

slvDev/esp32-ai