Языковая модель с 28,9 млн параметров заработала на ESP32-S3

Разработчик Вячеслав Сербов, выступающий под псевдонимом slvDev, продемонстрировал полностью локальную генерацию текста на микроконтроллере ESP32-S3. Созданная им языковая модель содержит 28,9 млн параметров и выдаёт около 9,9 токена в секунду, не обращаясь к серверу или другим внешним вычислительным ресурсам. Сгенерированные короткие рассказы выводятся на подключённый OLED-дисплей.
Проект esp32-ai испытан на модуле ESP32-S3 N16R8, располагающем 512 КБ встроенной SRAM, 8 МБ PSRAM и 16 МБ флеш-памяти. Квантованная до четырёх бит модель занимает 14,9 МБ. В репозитории опубликованы исходный код среды исполнения на C, средства обучения и квантования модели, прошивка, тесты и сценарии её загрузки на плату.
Заявленные 28,9 млн параметров не следует напрямую сравнивать с числом параметров обычных настольных LLM. Согласно подробному отчёту разработчика, модель состоит из плотного вычислительного ядра примерно на 559 тысяч параметров, выходного слоя на 3,1 млн параметров и таблицы послойных векторных представлений примерно на 25 млн параметров. Именно последняя обеспечивает основную часть формального размера модели, но не обрабатывается целиком при генерации каждого токена.
Для размещения модели задействованы три уровня памяти. Наиболее часто используемые данные находятся во внутренней SRAM, выходной слой, KV-кеш и временные буферы — в PSRAM, а 25-миллионная таблица остаётся во флеш-памяти и доступна через отображение в адресное пространство. Для каждого токена из неё считывается лишь около шести строк общим объёмом примерно 450 байт.
Такое устройство основано на технологии Per-Layer Embeddings, применённой Google в Gemma 3n. Согласно документации Google, PLE-параметры могут храниться вне рабочей памяти модели и добавляться в процесс вывода по мере обработки отдельных слоёв. В esp32-ai этот подход перенесён на иерархию памяти микроконтроллера, где быстрая SRAM особенно ограничена.
Первая корректная версия написанной на C среды исполнения выдавала только 0,57 токена в секунду. После помещения выходного слоя в PSRAM, перехода к восьмибитным активациям, распределения вычислений между двумя ядрами Xtensa LX7 и других оптимизаций задержка была уменьшена до 94,9 мс на шаг модели. Итоговая измеренная скорость достигла 9,88 токена в секунду с учётом полного процесса генерации. Основным ограничением теперь стала пропускная способность PSRAM при чтении выходного слоя.
Модель обучена на синтетическом наборе данных TinyStories, состоящем из простых англоязычных рассказов с ограниченным словарём. Поэтому она способна продолжать фразы и сочинять небольшие связные истории, но не предназначена для ответов на вопросы, выполнения инструкций, программирования или воспроизведения фактических знаний. Разработчик рассматривает работу прежде всего как демонстрацию эффективного размещения модели в памяти микроконтроллера, а не как готового автономного чат-бота.
В актуальной документации автор отдельно подчёркивает, что esp32-ai является самостоятельной разработкой. Проекты llama2.c Андрея Карпати и более ранний запуск 260-тысячной модели на ESP32-S3 приводятся лишь как ориентиры и примеры предшествующих работ: код, контрольные точки и методика непосредственно из них не заимствованы. Исходный код esp32-ai распространяется под лицензией MIT.
>>> Источник
