Процессор Nintendo — внутри языковой модели

Компилятор, а не обучение, закодировал полноценный процессор NES 6502 и 2 КБ оперативной памяти прямо в веса стандартного чекпоинта Qwen3.5. Модель предсказывает лог выполнения CPU токен за токеном, пока небольшой хост-процесс занимается графикой, вводом контроллера и таймингом vblank. Проект называется nesformer и уже позволяет запускать Super Mario Bros. — пусть и крайне медленно.


Как это работает

Компилятор, позаимствованный из проекта Qwenputer, использует состояние Gated DeltaNet модели как машинную память. 2 КБ рабочей RAM, регистры 6502 и программный ROM из картриджа записываются напрямую в матрицу весов ванильного чекпоинта Qwen3.5.

Каждая голова Gated DeltaNet хранит матрицу состояний 128×128, которую дельта-правило обновляет при каждом токене. Хитрость в том, что при одноиндексном ключе (one-hot key) обновление перезаписывает ровно одну строку матрицы — а значит, каждая строка работает как отдельная ячейка памяти. Так картридж, RAM и регистры процессора живут прямо внутри модели.

ℹ Что такое Gated DeltaNet
Gated DeltaNet — это вариант линейного внимания (linear attention) с рекуррентным состоянием. Вместо хранения всей истории токенов он обновляет компактную матрицу состояний по дельта-правилу, что позволяет использовать её как адресуемую память.

Архитектура несформера устроена так:


graph TD
    A[ROM картриджа .nes] --> B[Компилятор]
    B --> C[Веса Qwen3.5 + DeltaNet-состояние]
    C --> D[Модель генерирует токены CPU]
    D --> E[Хост: PPU рендерер]
    D --> F[Хост: контроллер + NMI]
    E --> G[Анимированный GIF / терминал]

Характеристики чекпоинта

Чекпоинт содержит 466,6 млн параметров, из которых реально ненулевых — лишь 9,3 млн, поэтому веса сжимаются в zip до 3,3 МБ. При этом в bf16 файл весов занимает около 933 МБ — отсюда и «~1 ГБ» в названии проекта.

ПараметрЗначение
АрхитектураQwen3_5ForCausalLM
Слоёв DeltaNet7 (вычислительных) + 1 нулевой
Hidden size768
Словарь263 808 токенов
Параметров всего466,6 млн (bf16, 933 МБ)
Ненулевых параметров9,3 млн
Размер zip-архива3,3 МБ
Поддерживаемые маперытолько NROM (mapper 0)

Насколько это быстро?

Спойлер: совсем не быстро.

Модель работает примерно на 1 650 токенах в секунду, тогда как настоящей NES требуется около 700 000 — то есть несформер медленнее реальной консоли в 150–290 раз. На практике один кадр рендерится за 1–6 секунд: 600 кадров (10 секунд игрового времени) займут около 25 минут.

⚠ Ожидайте медленную работу
Первый запуск тратит около 20 секунд на компиляцию движка с numba. После этого каждый кадр генерируется за 1–6 секунд. 600 кадров игрового времени ≈ 25 минут реального ожидания.

Быстрый старт

Для запуска нужен Python 3.11+. Пример для Super Mario Bros.:

# Установка зависимостей
python3 -m venv .venv
source .venv/bin/activate
pip install numpy scipy numba pillow

# Запуск игры (нужен собственный ROM)
python -m nesformer run roms/smb.nes --frames 600 --show \
  --buttons "start@60-65,right@200-600,a@250-265+300-315"

Поддерживаются только картриджи NROM (mapper 0) — именно на этом маппере вышли Super Mario Bros., Donkey Kong и Excitebike.

💡 Совместимые игры
Nesformer работает с любым .nes-файлом на маппере NROM (iNES mapper 0). Игры с другими маперами (MMC1, MMC3 и т. д.) пока не поддерживаются.

Откуда взялась идея

Дрю Бройниг создал несформер под вдохновением от проекта Qwenputer Дивьянша Агравала, который встроил работающий эмулятор NES 6502 CPU в веса Qwen3.5-4B.

Qwenputer компилирует 32-битный RISC-V процессор и CHIP-8 компьютер прямо в веса Qwen3.5-4B, позволяя модели выполнять код на C и MicroPython и проводить точные арифметические вычисления без внешних инструментов.

«Никто не обучал эти веса — компилятор вычислил каждый из них» — из описания проекта nesformer.

Оба проекта демонстрируют одно и то же радикальное переосмысление: языковую модель можно использовать не как вероятностный генератор текста, а как детерминированную вычислительную машину — если правильно скомпилировать веса.

Значение для отрасли

Внедрение NES-процессора в чекпоинт Qwen3.5 работает за счёт отображения памяти консоли во внутреннее состояние модели и генерации каждой инструкции как токена. Проект демонстрирует, что большая языковая модель может выступать детерминированным интерпретатором железа при правильно скомпилированных весах.

Это открывает нестандартное направление: вместо дообучения (fine-tuning) — прямая компиляция логики в структуру трансформера. Потенциальные применения — встроенные верификаторы, аудит-логи и мониторинговые инструменты, которые сама модель не может отключить.

Код проекта открыт на GitHub.