一个 466.6M 参数的 Qwen3.5 权重里,装着一颗完整的红白机 CPU:151 条官方指令、2KB 工作内存、32KB 卡带程序。这不是训练出来的,是编译器一条一条算出来的——作者 dbreunig 说这些权重没有一个经过训练,全部由编译器生成。跑起来的时候,模型干的事是预测 CPU 的执行日志,一个 token 一步。
BF16 下 466.6M 参数占 933MB,其中真正非零的只有 9.3M,所以权重压缩包只有 3.3MB。模型结构是 7 层 Gated DeltaNet 加 1 层全零注意力,隐层 768,词表 263,808。它的内存诀窍在于把 DeltaNet 的状态矩阵当内存用:一行一个存储单元,卡带、内存、寄存器都塞在这些行里。
一帧要 1 到 6 秒,600 帧(也就是 10 秒红白机时间)大约跑 25 分钟,第一次运行还要花 20 秒用 numba 编译引擎。画面不是模型画的:PPU 仍然由宿主程序逐扫描线渲染,手柄输入和垂直消隐中断也由宿主注入,所以没有声音,精灵碰撞也只是近似。
限制列清楚:只支持 NROM 卡带(iNES mapper 0),玩不了靠存储体切换的大作;只认官方指令,非官方指令直接停机;跳进内存执行的代码会停机;不支持 APU 和 DMC 中断。自带的三款自由许可测试 ROM 里,每一帧都和常规 6502 模拟器的输出逐帧一致。
10 月 30 日建仓,201 星、6 fork、0 个未关闭 issue;Hacker News 上 251 分、21 条一级评论。做法复用自另一个项目 Qwenputer——那个把 CHIP-8 和 RISC-V 编译进了 Qwen3.5-4B。
我的判断:它现在不是能用的模拟器,慢三个数量级,能玩的游戏也有限。但它证明了一件对做端侧和本地推理的人有意义的事:模型的权重里可以放确定性计算,不只是概率生成,而且不需要训练。想复现的人直接跑自带的三个测试 ROM,先看 check 命令能不能和参考 CPU 对齐,再谈自己换游戏。