nesformer:在 Qwen 3.5 权重中运行任天堂娱乐系统
通过 LLM 权重实现 NES 模拟
esformer 是一项技术实现,它将完整的任天堂娱乐系统 (NES) 6502 CPU、2 KB 工作内存 (RAM) 和卡带 ROM 编译进标准的 Qwen3_5ForCausalLM 模型权重中。该项目并非通过训练模型实现,而是使用编译器计算出代表机器状态的特定权重值。当游戏运行时,模型会逐个 token 地预测 CPU 的执行轨迹,而宿主程序则负责管理显示器、控制器和 vblank 中断等外设。
该项目基于 Qwenputer 架构,此前该架构已展示过在 CHIP-8 和 RISC-V 核心上的类似技术。其核心创新在于利用模型的 Gated DeltaNet 状态作为机器内存,其中状态矩阵的特定行充当寄存器、RAM 和 ROM 的内存单元。
技术架构
esformer 检查点是一个标准的 Hugging Face 文件夹,加载时无需任何自定义模型代码。该系统依赖于以下结构划分:
- 模型内部 (权重 + DeltaNet 状态): 6502 核心,包括所有 151 个官方操作码、寻址模式、标志位、堆栈和 2 KB 工作内存。卡带 PRG-ROM 被存储了两次——一次用于指令获取,另一次用于数据读取。
- 宿主内部 (
host.py): PPU(扫描线渲染器)、控制器输入处理、APU 寄存器写入和 NMI 定时。宿主充当 I/O 桥接器,将 NMI 和数据读取 token 注入到模型的流中。
每个 Gated DeltaNet 头维护一个 128 × 128 的状态矩阵。通过保持门控开启并使用独热码 (one-hot keys),系统可以覆盖或回读特定行,从而有效地在 Transformer 的循环状态内创建持久内存空间。
性能与局限性
尽管 nesformer 功能完备,但其运行速度远慢于原生硬件,比真实的 NES 慢约 150–290 倍。该系统需要每秒约 700,000 个 token 才能实现实时性能,而目前的实现使用 Numba 编译引擎在单个 CPU 核心上仅能达到每秒约 1,650 个 token。
主要局限性包括:
- 仅支持 NROM: 目前仅限于 iNES mapper 0 (32 KB PRG-ROM)。尚不支持银行切换 (Bank-switching) 映射器。
- 指令集: 仅实现了官方 6502 操作码;非官方操作码会触发
HALT。 - 硬件保真度: PPU 和 APU 未在权重内模拟,这意味着没有音频,且无法捕捉扫描线中间的 PPU 效果。
社区见解与讨论
该项目引发了关于 LLM 作为计算基底效率的争论。评论者指出,确定性汇编代码的效率与基于 Transformer 的模拟所带来的高计算成本之间存在巨大反差。
"我喜欢这些黑客技术,尽管从效率的角度来看,它让我这种汇编代码高尔夫玩家感到恐惧。这也让我对确定性程序相比 AI 的高效性有了新的认识。" — jacquesm
其他人则指出了其对 LLM 能力的更广泛影响,认为这证明了 LLM 可以作为通用计算媒介,有可能在内部托管虚拟机或工具,而不是依赖外部的工具调用循环。
"原则上,人们可以在 LLM 权重内编译一个小型的虚拟机……LLM 不必像现在这样通过‘外部’工具调用进行缓慢的自回归 token 生成,它可以字面上执行除网络搜索之外的所有操作,直接在 LLM 内部通过矩阵乘法完成。" — armcat
尽管存在性能开销,该项目仍是对 Gated DeltaNet 架构的一次严格压力测试,并突显了将 LLM 用作确定性、有状态执行环境的潜力。
Sources
相关
- Dispatch
- 项目
- Dispatch
- Dispatch
- Dispatch