← На главную

На ESP32-S3 за $8 с нуля обучили трансформер клингонскому

05.08.2026 04:07 · hackernews

На ESP32-S3 за восемь долларов можно обучить трансформер с нуля. Не запустить готовую модель, а обучить: прямой проход, backprop и обновление весов происходят внутри чипа. Это проект Qapla' — с клингонского «успех». На экране OLED при этом написано KlinGPT.

Обычно периферийный AI — это инференс: esp32-ai от Славы С., порты llama2.c и другие подобные проекты запускают на микроконтроллерах модель, которую обучили где-то на GPU и заранее скачали. Здесь всё иначе. Данные для обучения могут не существовать, пока устройство не окажется на месте: датчик на сельхозмашине должен выучить вибрацию именно этой машины, сенсор в поле — особенности просыхания именно этой почвы. Интернета нет, значит, учиться нужно на месте.

Для теста авторы взяли клингонский язык. Это не выдуманный шум, а сконструированный Марком Окрандом язык с системной грамматикой и морфологией. У него компактный алфавит — около 31 символа, и свободный корпус boQwI' под лицензией Apache 2.0. Маленькой модели такой корпус как раз по зубам.

Внутри ESP32-S3 происходит полный цикл: случайная инициализация весов, токенизация корпуса, forward pass, вычисление cross-entropy loss, backprop с выведенными вручную градиентами, обновление весов через SGD с momentum и cosine LR, сохранение чекпоинта во flash (LittleFS) и генерация текста. Модель крошечная: один блок трансформера, single-head causal attention, tied weights, ReLU FFN, LayerNorm, всего ~319 000 параметров. Всё написано на C, без PyTorch. Градиенты проверены конечными разностями: максимальная относительная ошибка 1.07e-08 при пороге 1e-4. До реального железа код гоняли в QEMU с эмуляцией xtensa.

Сложность — в памяти. Веса занимают ~1.3 МБ, но для обучения нужны ещё градиенты, momentum, копия лучшей модели, промежуточные активации и корпус: в сумме несколько мегабайт в PSRAM.

Тренировка шла около двух дней от зарядки телефона. За 5000 шагов средний loss опустился до 1.871. Генерация даёт не полностью осмысленный клингонский, но морфология видна: SuvwI' — «воин» (Suv + суффикс -wI'), DujDaq — «на корабле» (Duj + -Daq), qarghtaHvIS несёт суффикс -taHvIS. Модель сама, без правил и разметки, выучила, как склеивать корни и суффиксы. Это не карманный ChatGPT: чат не ведёт, смысла не понимает. И не быстро: обучение длится часы или дни.

Для повторения нужны ESP32-S3 N16R8 с PSRAM, SH1106 OLED по I2C и PlatformIO. Сначала запускаешь python tools/gen_header.py, затем pio run -t upload, loss смотришь через pio device monitor. Корпус — в corpus/klingon.txt, его можно перегенерировать или подставить свой текст. Код открыт под Apache 2.0. Сид генератора случайных чисел — 1701.

Читать оригинал →