Создание локальной LLM с реальным вводом на ESP32S3 и 16MB Flash
TuBrief 편집팀
2026년 8월 12일
0
Computing/Software원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
Если вы решите запустить языковую модель с 28,9 миллионами параметров на плате ESP32-S3 за 8 долларов, вы быстро столкнетесь с тупиком. Модель, которая отлично работает на презентационных видео, внезапно зависает при соприкосновении с вашими аппаратными периферийными устройствами. SRAM составляет всего 512 КБ, а необходимость прошивать новый раздел размером 15 МБ при каждом изменении предложения быстро начинает раздражать. Чтобы преодолеть эти ограничения и создать устройство, которое работает с реальным вводом с клавиатуры, вам придется полностью перепроектировать кэширование памяти и буферы ввода-вывода с нуля.
Перепрошивка платы каждый раз ради изменения одного тестового предложения — пустая трата времени. Связав асинхронные прерывания UART и семафоры FreeRTOS, вы избавитесь от необходимости перезагружать плату. Модель будет мгновенно обрабатывать предложения по мере их ввода через Serial-монитор или клавиатуру.
Такая конфигурация сокращает время на доработку и тестирование промптов более чем на 80%.
`
+------------------+ +-------------------+ +--------------------+
| External UART | ---> | HW FIFO Buffer | ---> | SW Ring Buffer |
| (Keypad/Monitor) | | (120 Bytes) | | (2048 Bytes) |
+------------------+ +-------------------+ +--------------------+
|
v
+------------------+ +-------------------+ +--------------------+
| LLM Forward Pass | <--- | xPromptSemaphore | <--- | BTK1 Tokenizer |
| (Inference Task) | | (Binary Lock) | | (43,056 B Library) |
+------------------+ +-------------------+ +--------------------+
`
Использование архитектуры Per-Layer Embeddings (PLE), предложенной исследователями Google Gemma 3n, позволяет разделить и разместить 4-битную модель размером 14,9 МБ. Таблица эмбеддингов объемом 25 миллионов параметров размещается во флеш-памяти SPI емкостью 16 МБ, а веса Output Head (3,1 миллиона параметров) и кэш KV помещаются в PSRAM емкостью 8 МБ. Самое часто используемое плотное вычислительное ядро (Dense Compute Core) на 559 КБ параметров и буфер HotActivation сохраняются прямо в SRAM на 512 КБ.
Поднять скорость до 14 токенов в секунду и выше оказалось сложнее, чем предполагалось.
__attribute__((noinline)) к функции вычислений matvec_i8_range. Если компилятор выполнит инлайнинг автоматически, возникнут промахи кэша I-RAM, и время вычислений не ускорится, а упадет с 94,9 мс до 155.2 мс.Простой перенос кода на язык C дает удручающую скорость в 0,57 токена в секунду. Однако после применения квантования INT8 и предвыборки в SRAM скорость превышает 14,0 токенов в секунду.
| Этап оптимизации | Задержка вычислений на токен | Генерация токенов в секунду | Основные применяемые технологии |
|---|---|---|---|
| Чистый порт на C (Baseline) | 1757,2 мс | 0,57 tok/s | Один корок, вычисления FP32 |
| PSRAM Head и скалярная оптимизация | 193,9 мс | 4,61 tok/s | Размещение Output Head в PSRAM |
| Применение двухъядерного FP32 | 139,4 мс | 6,22 tok/s | Двухъядерные вычисления послойного разделения |
| INT8 Staging + оптимизация SRAM | 94,9 мс | 9.88 tok/s | Квантование INT8, применение noinline |
| Расширение буфера предвыборки SRAM | ~71,4 мс | 14,0+ tok/s | Предвыборка начальных слоев в SRAM |
При непрерывной работе двух ядер на частоте 240 МГц потребляемый ток взмывает до 210 мА (777 мВт). Помимо того, что плата сильно нагревается, батарея разряжается в мгновение ока. Команда esp_pm_configure должна использоваться для снижения частоты до 40 МГц и включения автоматического режима легкого сна (Light Sleep) в периоды отсутствия инференса.
esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_ON). Питание флеш-памяти SPI и RAM должно сохраняться даже в состоянии сна, иначе данные будут потеряны.При непрерывных вычислениях от литий-полимерного аккумулятора 3,7 В емкостью 1000 мАч устройство проработает всего 4,7 часа. Однако в режиме ожидания Light Sleep ток падает до 0,24 мА (0,88 мВт). В реальных сценариях использования с чередованием периодов ожидания средний ток удерживается на уровне 15–30 мА, что увеличивает время автономной работы более чем в 3 раза.