← На главную

NES-совместимый процессор записали в веса Qwen3.5

30.10.2026 16:40 · hackernews

Nesformer превращает стандартную языковую модель Qwen3.5 в процессор Nintendo Entertainment System. В веса компилируются 6502-совместимый CPU, 2 КБ рабочей RAM и программный ROM картриджа. Модель никто не обучал: каждый вес вычисляет компилятор, унаследованный у Qwenputer Дивьянша Агравала. Во время игры checkpoint генерирует журнал выполнения процессора по одному токену.

Это не эмуляция всей консоли исключительно нейросетью. Небольшая host-программа рисует PPU-кадры, читает контроллер, передаёт ответы I/O и запускает NMI на vblank. Внутри модели реализованы все 151 официальные инструкции, режимы адресации, флаги, стек, BRK и NMI. Звук не синтезируется, а APU-регистры просто принимают записи.

Ключевой приём — использование состояния Gated DeltaNet как памяти. Матрица состояния каждой головы имеет размер 128×128. При открытом gate и one-hot key обновление перезаписывает ровно одну строку, а one-hot query читает её обратно. Строки становятся ячейками для ROM, RAM и регистров. Checkpoint сохраняет обычный формат Hugging Face Qwen3_5ForCausalLM и загружается без пользовательского model code.

Модель содержит 466,6 млн параметров bf16 объёмом 933 МБ, но ненулевых только 9,3 млн, поэтому архив весов занимает 3,3 МБ. Семь Gated DeltaNet-слоёв выполняют выборку команды, декодирование, адресацию, арифметику и выбор следующего токена; восьмой нулевой attention-слой нужен Hugging Face cache. Program counter не записывается явно на каждой операции, а вычисляется по точке перехода и счётчикам длин команд.

Проверки включают nestest и сравнение с py65 на 5,7 млн инструкций. В свободной генерации трассы Thwaite и Full Game совпали с эталонным CPU; сохранённые кадры также совпали. Для 600 кадров Thwaite потребовалось 1 916 527 токенов, для 420 кадров Full Game — 2 645 885.

Скорость далека от NES. Numba-движок выполняет около 1650 токенов в секунду на одном CPU-ядре, NumPy — 210, stock transformers — примерно 10. Настоящей консоли соответствовало бы около 700 тысяч токенов в секунду. Десять секунд игрового времени занимают около 25 минут; пропуск повторяющихся idle-loop сокращает работу в 2,6–4,2 раза без изменения кадров и I/O.

Поддерживаются только NROM-картриджи mapper 0 и официальные opcodes, исполнение из RAM и IRQ отсутствуют. PPU упрощён: mid-scanline-эффекты не воспроизводятся, sprite-флаги приблизительны. Тем не менее одни веса запускают разные NROM ROM без пересборки, включая Super Mario Bros. при предоставленном пользователем образе.

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