LLM с 28,9 млн параметров работает локально на ESP32-S3 со скоростью 9 токенов/с

Slava S. (slvDev) оптимизировал LLM с 28,9 млн параметров, работающую локально на отладочной плате ESP32-S3, со скоростью около 9 токенов/с при генерации текста, а точнее, при написании коротких рассказов.

Ранее уже публиковались материалы о LLM и ESP32, но обычно эти платы используются как энергоэффективные шлюзы для взаимодействия с онлайн-LLM, размещенными на мощных серверах в дата-центрах. К таким продуктам или проектам относятся HiWonderLLM «умный чат-модуль» , а также Фреймворк ESP-Claw , или ESP32 Agent Dev Kit . Проект Славы «esp32-ai» совсем другой, поскольку всё работает на микроконтроллере ESP32-S3.

ESP32-S3 local LLM

Это будет работать не на всех ESP32-S3, так как потребуется достаточно памяти и хранилища для файла модели размером 14,9 МБ (4-бит), а Слава тестировал свой демонстрационный пример на плате ESP32-S3 стоимостью около $8 с 512 КБ SRAM+8 МБ SPRAM и 16 МБ флеш-памяти, подключённой к небольшому I2C-дисплею для отображения коротких рассказов.

Дэйв Беннетт уже сделал нечто подобное с проектом ESP32-LL, но она опиралась лишь на модель с 260 тысячами параметров, что значительно отличается от модели с 28,9 миллионами параметров, использованной в этом проекте. Секрет заключался в том, чтобы перестать размещать модель в «быстрой памяти» (512 КБ SRAM), поскольку большинство параметров языковой модели находятся в таблице встраивания, содержащей около 25 миллионов строк, которую можно считывать из медленной флэш-памяти. Таким образом, в SRAM необходимо загрузить и обработать лишь несколько строк, необходимых каждому токену, или около 450 байт.

Слава объясняет, что идея основана на технологии Google Per-Layer Embeddings, используемой в Gemma 3n и Gemma 4. Вот как выглядит структура памяти на ESP32-S3:

SRAM (fast, tiny) the "thinking" core, used on every token
PSRAM (medium) the output head and working memory 
FLASH (huge, slow) the 25M-param table, about 6 rows read per token (~450 B)

Это скорее инженерное достижение, чем полезный LLM-проект, поскольку модель была обучена на TinyStories для написания коротких простых историй. Она не отвечает на вопросы, не следует инструкциям, не пишет код и не делает ничего, что ожидается от типичной LLM. Ниже демонстрация.

Исходный код, инструкции и более подробные сведения о результатах можно найти на GitHub , немного дополнительных сведений можно найти на Reddit , а также в видео ниже для наглядного объяснения того, как всё это работает.

Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

5 1 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

2 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Михаил
Михаил
20 дней назад

Дэйв Беннетт уже сделал нечто подобное с проектом ESP32-LLM project , но оно основано на модели с 260K параметров, что далеко от 28,9M модели, использованной в этом проекте.
Секрет был в том, чтобы прекратить помещать модель в «быстрой памяти» (512KB SRAM), потому что большинство параметров модели находится в embedding table с примерно 25 миллионами строк, которые можно прочитать с медленной флешки.
Поэтому только несколько строк, нужных каждому токену или примерно 450 байт, требуется загружать и обрабатывать в SRAM.

Слава объясняет, что идею взял из Google Per-Layer Embeddings использующуюся в Gemma 3n и Gemma 4.
Вот как распределена память в проекте на ESP32-S3:

(Нехорошо, что Славу назвали рабом. Вычитывайте, пожалуйста)

but it only relied on a 260K-parameter model, far from the 28.9M-parameter model used in this project. The trick was to stop putting the model in “fast memory” (the 512KB SRAM),
as most of a language model’s parameters sit in an embedding table with around 25 million rows, which can be read from slow flash. So only the few rows each token needs,
or about 450 bytes, need to be loaded and processed in the SRAM.

Slave explains that the idea is Google’s Per-Layer Embeddings used in Gemma 3n and Gemma 4. This is what the memory layout on the ESP32-S3 looks like:

Alex
Администратор
20 дней назад
Reply to  Михаил

Спасибо за подсказку. Исправлено.