Нейросеть в 25 КБ завелась на Commodore 64 1982 года с одной дискеты
На Hacker News вышел Soul Player C64 — работающий 2-слойный трансформер, вручную написанный на ассемблере 6502. Разбираем, что внутри, как он укладывается в 64 КБ памяти и почему это лучший учебный стенд по LLM.
Новости TprogerЕсли вы хотели увидеть, как устроен трансформер изнутри — без PyTorch, GPU и 500-строчных абстракций — посмотрите на Soul Player C64. Это настоящий decoder-only трансформер (та же архитектура, что у ChatGPT и Claude), реализованный вручную на ассемблере 6502 и запускающийся на немодифицированном Commodore 64 с частотой 1 МГц. Модель занимает 25 КБ, помещается на одной гибкой дискете 5,25″ и генерирует примерно один токен за 60 секунд.
20 апреля 2026 года проект soulplayer-c64 попал в топ Hacker News (агрегатор технических новостей). Автор — gizmo64k — выложил в открытый доступ не только дискету с готовой моделью, но и Python-пайплайн для обучения своего «соула»: корпус реплик, тренировка квантованной сети, сборка .d64-образа для эмулятора VICE или реальной железки. Код — под лицензией GPL-3.0, README подробный.
Ключевые выводы
Soul Player C64 — что важно
Что это, как работает, зачем смотреть
Что это: рабочий 2-слойный decoder-only трансформер на ~25 000 параметров (int8), написанный вручную на ассемблере 6502/6510. Запускается на немодифицированном Commodore 64 с 1 МГц CPU и 64 КБ RAM.
Архитектура как у современных LLM: стандартный набор блоков трансформера — RMSNorm, multi-head causal self-attention, softmax, ReLU MLP, residual connections (как в «Attention Is All You Need»). Та же математика, просто в 70 миллионов раз меньше параметров, чем у GPT-4 (~1,8 трлн по слухам).
Скорость: ~60 секунд на токен, полный ответ — несколько минут. Пока C64 «думает», мигает рамка экрана и пикает звуковой чип SID на каждом токене — это честный индикатор прогресса.
Главный инженерный трюк: в softmax-нормализации scores сдвинуты на 14 бит вместо формально ожидаемых 17. Это оставляет 128-элементной exp-таблице достаточный динамический диапазон. Без этого фикса attention-веса получались равномерными — модель была «слепой» независимо от архитектуры.
Зачем смотреть: если вы преподаёте LLM или учитесь сами — здесь трансформер виден насквозь. Каждое умножение, каждая квантизация, каждая адресация памяти — руками, без чёрных ящиков PyTorch или CUDA.
Что именно в репозитории
Репозиторий soulplayer-c64 делится на три чётких слоя: референсный пайплайн на Python, ассемблерный рантайм на 6502 и сборщик .d64-образа. Структура:
- train.py — обучает BPE-токенизатор (128 токенов), прогоняет QAT-тренировку трансформера, экспортирует
models/soul.bin. Занимает несколько минут на GPU. - build.py — собирает все 6502-рутины, встраивает веса, пишет
disk/soulplayer.d64— готовый образ для VICE или прошивки на физический флоппи. - soulchat.py — чат в терминале с той же целочисленной арифметикой, что и на C64, но без пикающей SID-микросхемы.
- test.py — около 90 тестов, проверяющих всю цепочку «float reference → integer reference → memory-faithful Python-shadow 6502 → реальный ассемблерный код → round-trip сборки». Прогон — ~30 секунд.
- src/ — сам движок: ассемблерные реализации matvec, RMSNorm (через целочисленный sqrt и деление), attention head с LUT-softmax, embed/residual/relu/argmax.
Архитектура: такая же, как у современных LLM
Soul Player — 2-слойный decoder-only трансформер. Каждый слой: RMSNorm (нормализация активаций по среднеквадратичному значению) → multi-head causal self-attention (4 головы по 8 измерений, каждая позиция смотрит только назад по последовательности) → residual → RMSNorm → ReLU MLP (64 скрытых юнита) → residual. Финальный RMSNorm, output projection, argmax. Декодирование жадное: на каждом шаге берётся токен с максимальной вероятностью, без sampling и temperature. Это та же схема, которую в 2017 году ввели Vaswani и соавторы в «Attention Is All You Need» и на которой стоят все современные LLM — разница только в масштабе.
- Словарь: 128 токенов. 4 служебных + 34 символа ASCII и пунктуации + 90 BPE-merge (Byte-Pair Encoding — алгоритм разбиения текста на подслова, используется в GPT-2, GPT-3, LLaMA и практически любой современной LLM).
- Embedding: 32 измерения.
- Контекст: 20 токенов. Да, двадцать.
- Параметры: ~25 000 — все int8.
- Размер весов: 25 КБ. Целиком помещаются в адреса
$2100-$85A0памяти C64.
Как это вообще считается на 6502
У процессора 6502 нет инструкции умножения — только сложение, вычитание и сдвиги. Поэтому каждое умножение в коде — это развёртка в shift-and-add. Все активации — Q8.8 fixed-point (int16, где старшие 8 бит — целая часть, младшие 8 — дробная; то есть диапазон ±128 с шагом 1/256). Веса — int8 с пер-тензорными сдвигами степени двойки. Смещения (biases) — int16, предварительно отмасштабированные в аккумулятор matmul-а.
Главный трюк автора — в softmax. На 6502 нет вычислимой экспоненты, поэтому exp(x) заменяется на 128-элементную lookup-таблицу. Attention-scores приходят в Q16.16, формально до Q8.8 нужен сдвиг >>17 — но тогда почти все значения схлопываются в один бакет из 128, и softmax получается равномерным. Автор нашёл рабочий сдвиг: >>14 сохраняет достаточно точности, чтобы веса внимания реально отличали одну позицию от другой.
Без этого фикса целочисленное внимание было по сути равномерным по всем позициям, и модель оставалась «слепой» — неважно, какую архитектуру или корпус вы ей подадите.
Карта памяти 64 КБ
У C64 — ровно 64 КБ адресного пространства, и вся модель должна в него уложиться вместе с кодом, токенизатором и буферами:
Обратите внимание: веса занимают почти половину всей памяти C64. Для контекста в 20 токенов и 25K параметров это прямо край возможного — любая попытка расширить сеть потребует либо bank switching через процессорный регистр $01 (у 6510 это встроенный механизм переключения банков памяти), либо подкачки с флоппи по ходу инференса.
Как запустить у себя
Нужен эмулятор Commodore 64 — проще всего VICE (Versatile Commodore Emulator — свободный open-source эмулятор под Windows, Linux, macOS, в том числе на ARM). Скачать готовый образ:
Внутри C64-консоли:
Ввести короткое сообщение строчными буквами, нажать Return, подождать. Рамка мигает, пока модель думает — это честный индикатор прогресса по токенам. Заглавные буквы становятся «unknown token», и модель начинает галлюцинировать сильнее обычного.
Обучить свою модель
Самая интересная часть — собственный «соул» на другом корпусе. Формат — по строке на реплику, с разделителем <SEP>:
Контекст — 20 токенов, так что реплики должны быть короткими. Дальше:
Тренировка занимает несколько минут на GPU. Каждые 500 эпох скрипт показывает параллельно output оригинальной float-модели и output int8-версии — видно, насколько квантизация уносит смысл. Лучший чекпоинт выбирается по качеству int8, а не по loss-у float-модели.
FAQ
Модель реально понимает текст?
Нет. 25 000 параметров примерно в 70 миллионов раз меньше, чем у GPT-4. На типичный «hey» модель отвечает что-то вроде «HELLO! RE SOUNDS ME. MEFUL!» — это распознаваемо похоже на речь, но не разговор. Ценность проекта — в том, что архитектура и математика настоящие, а не в качестве вывода.
Зачем это вообще нужно?
Во-первых, это лучший демо-материал для объяснения, как устроен трансформер: весь движок помещается в голове, каждое умножение видно, квантизация — не чёрный ящик. Во-вторых, это proof-of-concept того, что архитектура работает и на 25K параметров, не разваливаясь от масштабирования вниз. В-третьих, демосцена и ретрокомпьютинг — зона, где такие проекты живут собственной жизнью.
Можно ли запустить на физическом C64?
Да. disk/soulplayer.d64 — это штатный образ 1541-флоппи, его можно прошить на настоящую дискету через SD2IEC или Pi1541 и загрузить на реальной железке. Скорость та же — одна минута на токен.
У меня нет GPU — смогу обучить свой «соул»?
Долго, но сможете. Сама модель крошечная, тренировка на CPU займёт несколько часов вместо нескольких минут. Автор в README указывает GPU как рекомендацию, не обязательное требование.
Что из этого забрать в продакшен?
Ничего прямо, но много идейного. Автор показал, что даже в 25 КБ памяти и без MUL-инструкции можно уместить рабочий трансформер. Для embedded-ML это пример того, как аккуратно квантовать модель и какие сдвиги важны в softmax. Для обучения — живой материал для курса по LLM-инженерии.
Что уносим с собой
Soul Player C64 полезен не как инструмент, а как полная редукция трансформера до читаемого минимума. 25 КБ весов, 20 токенов контекста, одна минута на токен, 6502-ассемблер — и всё это реально работает. Если вы когда-либо застревали на объяснении multi-head attention или квантизации, у автора теперь есть готовый учебный стенд, который помещается на флоппи-диск и запускается на компьютере 1982 года. Вывод практический: 25K параметров достаточно, чтобы поведение модели было узнаваемо «языковым», хотя и нечитаемым. Дальше вопрос только в масштабе и данных — и это ровно то, что мы наблюдаем в реальных LLM.
Попробуйте сами — это займёт 10 минут. github.com/gizmo64k/soulplayer-c64: начать стоит с README и файла src/asm_attn_head.py — это ассемблерная реализация внимания на ~200 строк, которая делает всё то же, что делает 50-строчный attention на PyTorch. Обсуждение на Hacker News — с разбором от демосцены и предложениями, на чём обучать следующую версию.