Как запустить языковую модель на микроконтроллере: пример с ESP32-S3
Разработчик Слава Сербов запустил языковую модель на 28,9 млн параметров на чипе ESP32-S3 за $10. Разбираем, как 4-битная квантизация и распределение памяти позволили уместить LLM в микроконтроллер, и почему это важно для будущего локального AI.
Разработчик Слава Сербов запустил языковую модель с 28,9 миллиона параметров на микроконтроллере ESP32-S3. Чип стоит около $10. Модель генерирует простые тексты со скоростью примерно 9,5 токенов в секунду. Она обучена на синтетических детских рассказах TinyStories и не умеет отвечать на вопросы или писать код. Результат достигнут с помощью трёх технических решений: 4-битной квантизации, распределения весов между быстрой и медленной памятью, а также таблицы послойных эмбеддингов, похожей на подход в моделях Google Gemma.
Что произошло: языковая модель на чипе за $10
Эксперимент Славы Сербова показывает, что полноценная языковая модель способна работать на устройстве, которое по вычислительной мощности уступает смартфону десятилетней давности. ESP32-S3 - это микроконтроллер с двухъядерным процессором Xtensa LX7, 512 КБ оперативной памяти SRAM и поддержкой внешней флеш-памяти. Его розничная цена колеблется в районе $10. Для сравнения: предыдущие попытки запустить LLM на ESP32 ограничивались моделями с 260 тысячами параметров. Сербов увеличил этот показатель более чем в 100 раз.
Модель обучена на датасете TinyStories - это синтетические короткие рассказы, сгенерированные GPT-3.5 и GPT-4. Они используют словарный запас, понятный трёх-четырёхлетним детям. Такой выбор данных - осознанный компромисс. Простые грамматические конструкции и ограниченный словарь позволяют модели работать с приемлемым качеством даже после сильного сжатия. Результат: устройство за $10 связно продолжает фразу вроде «Жил-был маленький робот» и выдаёт историю на несколько абзацев. Скорость - 9,5 токенов в секунду - комфортна для чтения, текст появляется почти без задержки.
Зачем это нужно: локальный AI без интернета и облаков
Запуск языковой модели на микроконтроллере - шаг к устройствам, которые понимают человеческую речь без подключения к интернету. Локальный AI решает три проблемы. Первая - конфиденциальность: голосовой помощник в умной колонке или детской игрушке обрабатывает речь прямо на устройстве, данные не уходят в облако. Вторая - автономность: датчик в поле или носимое устройство продолжают работать при отсутствии связи. Третья - энергоэффективность: ESP32-S3 потребляет менее 1 Вт, тогда как даже скромный сервер с GPU требует десятки ватт.
Прогресс налицо. Год назад запуск LLM на микроконтроллере означал модель с 260 тысячами параметров, способную лишь классифицировать текст или выделять ключевые слова. Сегодня 28,9 миллиона параметров - это уже уровень простого, но связного повествования. Гонка за гигантскими моделями с сотнями миллиардов параметров продолжается, но параллельно развивается направление эффективных компактных решений. Они открывают AI для устройств интернета вещей, носимой электроники и умных датчиков - там, где важны милливатты и миллиметры, а не петафлопсы.
Как удалось уместить модель в памяти: три ключевых решения
4-битная квантизация: сжатие без фатальных потерь
Нейросеть хранит знания в числах с плавающей точкой - весах. Обычно под каждый вес отводится 16 или 32 бита. 28,9 миллиона параметров по 16 бит занимают около 58 мегабайт - это значительно больше, чем доступно на ESP32-S3. Квантизация снижает точность представления чисел. Вместо 16 бит на вес используется 4 бита. Модель сжимается примерно в четыре раза.
Представьте фотографию. Исходный снимок в RAW занимает 30 мегабайт и хранит мельчайшие детали. JPEG с высоким сжатием весит 500 килобайт, детали теряются, но сюжет остаётся узнаваемым. 4-битная квантизация работает похоже: модель «округляет» свои знания, теряя точность, но сохраняя способность строить грамматически верные предложения. Для детских рассказов с простым сюжетом этого достаточно. Для кода или точных ответов на вопросы - уже нет.
Распределение весов: что хранить в быстрой, а что в медленной памяти
ESP32-S3 имеет два типа памяти. SRAM - быстрая, объёмом 512 КБ, прямой доступ процессора. Flash - медленная, объёмом до 16 МБ, подключается внешне. Проблема: даже сжатая модель не помещается в SRAM целиком. Решение - распределить веса по частоте использования. Слои, которые активируются при обработке каждого токена, загружаются в SRAM. Редко используемые части модели лежат во флеш-памяти и подгружаются по мере необходимости.
Аналогия - рабочий стол и шкаф с документами. Часто нужные бумаги лежат на столе, до них можно дотянуться мгновенно. Остальные папки хранятся в шкафу, достать их - несколько секунд. Сербов настроил «рабочий стол» ESP32-S3 так, чтобы наиболее востребованные веса всегда были под рукой. Это компромисс между скоростью и объёмом, позволивший уложиться в аппаратные ограничения.
Таблица послойных эмбеддингов: трюк из арсенала Google Gemma
Эмбеддинги - это векторные представления слов, с которых начинается обработка текста. Стандартный подход: одна таблица эмбеддингов для всех слоёв модели. Она занимает много памяти, потому что хранит соответствие между каждым словом и его числовым вектором. Сербов применил таблицу послойных эмбеддингов - разные эмбеддинги для разных слоёв. Каждый слой получает собственное, более компактное представление входных данных, адаптированное под его задачу.
Идея заимствована из архитектуры Google Gemma. Там послойные эмбеддинги помогают модели эффективнее расходовать параметры. На ESP32-S3 этот приём дал дополнительную экономию памяти без заметного ухудшения качества текста. Слой, отвечающий за локальную грамматику, работает с одними эмбеддингами, слой, отслеживающий сюжетную линию, - с другими. Каждый использует ровно ту информацию, которая нужна для его функции.
Что умеет и чего не умеет модель: честный взгляд на результат
Модель обучена на TinyStories - наборе синтетических детских рассказов. Она генерирует тексты вроде: «Жил-был маленький робот по имени Бип. Бип любил собирать цветы на лугу. Однажды он нашёл цветок, который светился в темноте». Сюжеты простые, язык примитивный, логика на уровне сказки для дошкольников. Для устройства за $10 это впечатляющий результат.
Ограничения жёсткие. Модель не отвечает на вопросы - спросите «Сколько будет два плюс два?», и получите бессвязный набор слов. Она не пишет код, не следует инструкциям, не поддерживает диалог. Её единственная функция - продолжить начатый текст в стиле детской истории. Скорость 9,5 токенов в секунду означает, что небольшой рассказ генерируется за несколько секунд. Это медленно по сравнению с серверными LLM, но достаточно для комфортного чтения в реальном времени.
Эксперимент Сербова - демонстрация возможности, а не готовый продукт. Маленькие специализированные модели показывают, что узкая задача часто решается эффективнее, чем общая. TinyStories-модель на ESP32-S3 - крайний случай такой специализации.
Что это значит для будущего: AI в каждом устройстве
Запуск 28,9 миллиона параметров на чипе за $10 - индикатор тренда. Микроконтроллеры становятся мощнее, методы сжатия - изощрённее. Через несколько лет появятся устройства, которые сегодня кажутся фантастикой: дверной звонок, понимающий речь посетителя и отвечающий без облака; фитнес-браслет, анализирующий дневник питания по голосовому описанию; датчик на заводе, который читает документацию и предупреждает об ошибках монтажа.
Эволюция напоминает путь мобильных процессоров. Десять лет назад смартфоны едва справлялись с распознаванием речи, отправляя аудио на сервер. Сегодня они делают это локально и мгновенно. Микроконтроллеры проходят тот же путь, но с задержкой в несколько лет. Эксперимент Сербова сокращает эту задержку. Оптимизация инференса на слабом железе - один из главных инженерных вызовов ближайших лет. Решения, найденные для ESP32-S3, пригодятся для всего класса устройств с жёсткими ограничениями по памяти и энергии.
Коротко: главные цифры и факты
- Разработчик - Слава Сербов.
- Устройство - микроконтроллер ESP32-S3.
- Цена чипа - около $10.
- Параметры модели - 28,9 миллиона.
- Метод сжатия - 4-битная квантизация.
- Дополнительные приёмы - распределение весов между SRAM и Flash, таблица послойных эмбеддингов.
- Данные для обучения - синтетические детские рассказы TinyStories.
- Скорость генерации - 9,5 токенов в секунду.
- Возможности - генерация простых текстов в стиле детских историй.
- Ограничения - не отвечает на вопросы, не пишет код, не следует инструкциям.