Subscribe Now
Trending News
Shorts

nesformer: procesor konzole NES ve vahách Qwenu rozběhne Super Maria

nesformer: procesor konzole NES ve vahách Qwenu rozběhne Super Maria

Projekt nesformer spouští hry pro konzoli NES na procesoru složeném z vah modelu Qwen3.5. Na GitHubu ho 30. října 2026 zveřejnil Drew Breunig. Procesor 6502, tedy jádro čipu 2A03 z NESu, běží spolu se 2 KB operační paměti a programovou pamětí ROM z herní kazety uvnitř checkpointu ve standardním formátu Qwen3.5. Žádnou z vah nikdo netrénoval. Všechny spočítal kompilátor. Při hraní model generuje záznam běhu procesoru, token po tokenu, a zbytek konzole obstarává malý program na hostitelském počítači: vykresluje obraz, čte ovladač a ve správný okamžik vyvolá přerušení vblank. Ukázkový záznam v repozitáři zachycuje Super Mario Bros. v úrovni 1-1, kterou takhle hrají váhy modelu. Breunig staví na Qwenputeru Divyanshe Agrawala, o kterém jsme už psali, a převzal z něj kompilátor i hlavní trik: paměť stroje drží stav vrstev Gated DeltaNet.

Breunig je spoluzakladatel a ředitel firmy Cmpnd, která pracuje na frameworku DSPy, a pro nakladatelství O’Reilly rediguje příručku The Context Engineering Handbook. Projekt 30. října představil na Hacker News jako Show HN s titulkem „A working Nintendo in ~1GB of Qwen weights“. V diskusi pod ním napsal, že váhy i kód postavil Claude Opus 5.5 na dva prompty. V prvním chtěl, aby Opus prostudoval Qwenputer a zjistil, jestli by se stejnou technikou dal emulovat čip a paměť NESu a jestli by nějaký model stihl původní takt konzole. Opus podle Breuniga odpověděl grafy, ze kterých bylo vidět, že pomalý bude jakýkoli model. Druhý prompt zněl „I think we should build it! Just for fun.“ Opus si pak sám našel testovací sady, které udržuje komunita kolem emulace starých her, a svou práci ověřoval testem nestest od Kevina Hortona, který obsahuje víc než 3 000 referenčních instrukcí. Oba prompty 30. října ocitoval na svém blogu i Simon Willison.

But this is a great example of what these models can do with proper reference materials, great specs, conformance tests, and clear direction.

Do vah se vešla jen část konzole. Model obsahuje jádro 6502 se všemi 151 oficiálními operačními kódy (opcody), všemi režimy adresování, příznaky, zásobníkem a vstupy přerušení BRK a NMI. Patří sem i 2 KB operační paměti a 32 KB programové ROM, kterou model drží dvakrát: jednu kopii pro načítání instrukcí, druhou pro čtení dat. Grafický čip PPU a obsluha ovladačů zůstaly v hostitelském programu. Ten také vkládá do záznamu přerušení NMI ve chvíli vblanku a zápisy do zvukových registrů přijme, ale nic s nimi nedělá. Když procesor čte vstupně-výstupní registr, hostitel mu odpověď vloží do záznamu jako token IN. Registry ani paměť procesoru hostitel jinak nevidí, zná jen to, co projde záznamem. Každá instrukce se v záznamu promění v krátký blok tokenů a poslední z nich ji potvrdí. Adresu právě prováděné instrukce model nezapisuje, dopočítává ji z cíle posledního skoku a délek instrukcí, které od něj proběhly. Většině instrukcí stačí jediný token a skutečný herní kód vychází na 1,1 až 1,3 tokenu na instrukci. ROM hry se do stavu modelu nahraje při spuštění, takže tytéž váhy rozjedou každou hru pro kazety typu NROM bez nového překladu.

Checkpoint je obyčejná složka pro Hugging Face, načte se standardním voláním Qwen3_5ForCausalLM.from_pretrained a žádný vlastní kód nepotřebuje. Qwenputer přidal procesor do hotového modelu Qwen3.5-4B. Breunigův checkpoint je naproti tomu samostatný model, ve kterém natrénované váhy Qwenu nejsou a slovník tokenů je celý vlastní, určený jen pro záznam běhu procesoru. Z Qwen3.5-4B převzal tvary hlav DeltaNet a šířku vrstev MLP. Obvod tvoří sedm vrstev Gated DeltaNet. Osmá vrstva s klasickou pozorností (attention) je celá nulová a je tam jen proto, že ji vyžaduje cache knihovny Transformers. Model má 466,6 milionu parametrů a v přesnosti bf16 zabírá 933 MB, odtud „~1GB“ v titulku na Hacker News. Nenulových parametrů je ovšem jen 9,3 milionu, takže se váhy sbalí do archivu ZIP o velikosti 3,3 MB.

Shodu s běžným emulátorem projekt ověřoval v několika krocích. Referenční procesor v Pythonu se shoduje se vzorovým záznamem testu nestest na 3 348 instrukcích a s emulátorem py65 na 5,7 milionu instrukcí herního kódu. Zkompilovaný obvod ve vyhodnocovači z Qwenputeru předpověděl každý referenční token celého nestestu a 283 610 pozic ze startu dvou her, checkpoint v knihovně Transformers pak 2 651 pozic bez jediné odchylky. Nejdelší jsou volné běhy, kdy model generuje sám. U hry Thwaite od Damiana Yerricka vygeneroval 1 916 527 tokenů, tedy 600 snímků a 10 sekund času konzole, a všech 300 uložených snímků odpovídá referenci. U hry Full Game od Douga Frakera to bylo 2 645 885 tokenů a 420 snímků a shodných bylo všech 210 uložených. Snímek po snímku autor porovnal jen tyto přiložené testovací hry. Super Mario Bros. nebo Donkey Kong si hráč musí obstarat sám, repozitář obsahuje jen tři volně licencované testovací ROM.

Hraní je pomalé. Výchozí engine počítá průchod modelem přímo ze souboru s váhami, kompiluje ho knihovnou numba a nulové bloky přeskakuje. Na jednom jádru procesoru počítače, na kterém projekt vznikl, zvládl asi 1 650 tokenů za sekundu, varianta v čistém numpy asi 210 a standardní Transformers asi 10. Skutečný NES by potřeboval zhruba 700 000 tokenů za sekundu. Hostitel proto zkracuje smyčky, ve kterých hra jen čeká na další vblank: když se tělo smyčky přesně opakuje a nic nezapisuje do paměti ani do vstupně-výstupních registrů, posune hodiny těsně před další událost grafického čipu. Tokenů je pak 2,6krát až 4,2krát méně a snímky zůstanou stejné. I tak je nesformer 150krát až 290krát pomalejší než skutečná konzole. Jeden snímek trvá 1 až 6 sekund a 600 snímků neboli deset sekund hry zabere kolem 25 minut. Stačí na to Python 3.11 nebo novější s knihovnami numpy, scipy, numba a pillow, PyTorch je potřeba jen pro běh přes Transformers.

Spustit jde jen část her. Model zvládne pouze kazety typu NROM (mapper 0 ve formátu iNES), protože procesor najednou adresuje nejvýš 32 KB programové ROM. Větší hry nesou na kazetě čip zvaný mapper, třeba MMC1 nebo MMC3, který přepíná, kterou část ROM procesor vidí. Model ale čte ROM z pevné 32KB tabulky uvnitř vah. Podpora mapperů by podle autora znamenala uložit do stavu celou ROM i registry mapperu a přidat krok, který adresu procesoru převede na adresu v ROM. Neoficiální opcode nebo skok do operační paměti model zastaví tokenem HALT. Nefungují přerušení IRQ a chybí zvuk. Grafický čip navíc kreslí po celých řádcích, takže efekty uprostřed řádku nevykreslí. Kód nesformeru je pod licencí MIT. Pod stejnou licencí s Agrawalovým copyrightem je i převzatý kompilátor chipformer, zatímco testovací ROM si ponechávají licence svých autorů, Thwaite třeba GPL-3.0.

Zdroje:

Related posts