Разработчик slvDev запустил языковую модель на 28,9 миллиона параметров на микроконтроллере ESP32-S3, который стоит около $8. Модель генерирует текст прямо на чипе — без сервера, без интернета — и выводит слова на небольшой экран со скоростью примерно 9,5 токенов в секунду. Для сравнения, предыдущая модель на таком же чипе вмещала всего 260 тысяч параметров. Здесь их почти в сто раз больше.
Весь секрет в том, что модель почти целиком живёт во flash-памяти, а не в оперативке. Идею подсмотрели у Google — это Per-Layer Embeddings из архитектуры Gemma. У микроконтроллера ESP32-S3 есть 512KB быстрой SRAM, 8MB PSRAM и 16MB медленной flash. Обычно модель приходится держать там, где процессор может быстро до неё дотянуться, поэтому размер упирается в жалкие килобайты. Но таблица эмбеддингов — самая жирная часть — здесь не вычисляется, а просто читается. Поэтому 25 миллионов строк этой таблицы спокойно лежат во flash, а для каждого токена оттуда подтягиваются лишь несколько нужных строк — около 450 байт. Крошечное вычислительное ядро модели остаётся в SRAM и работает быстро, а всё «тяжёлое» хранилище почти не влияет на производительность. Такой трюк раньше применяли на телефонах и GPU, но на столь дешёвом чипе его опробовали впервые.
Модель обучена на датасете TinyStories — синтетических коротких историях, придуманных Роненом Элданом и Юаньжи Ли из Microsoft Research специально, чтобы даже крошечная сеть могла выдавать связный текст. Она пишет простые, в основном осмысленные рассказы, но не отвечает на вопросы, не следует инструкциям, не пишет код и не знает фактов. Это ограничение вычислительной части, а не памяти, и уловка с flash его не снимает. Интересен здесь не сам филлер, а архитектурный ход — огромная таблица параметров на копеечном чипе без внешней помощи.
Файлы прошивки, схемы и инструкции лежат в firmware/esp32_llm/README.md репозитория, а код обучения, квантизации и экспериментов — в src/ и experiments/. Все замеры, абляции и полное описание метода собраны в RESULTS.md. Автор не стесняется показывать даже ошибки — в истории коммитов видно, как неправильный подсчёт параметров когда-то завысил ранние цифры, а затем их скорректировали. Проект вырос из идеи, которую вложил в сообщество Андрей Карпатый своим llama2.c, доказав, что крошечную языковую модель можно обучить и запустить в чистом C на чём угодно.