NES CPU编译进Qwen3.5模型权重
Show HN: A working Nintendo in ~1GB of Qwen weights
一个NES CPU被编译进Qwen3.5模型的权重中,其6502 CPU、2 KB工作RAM和游戏卡ROM在标准Qwen3_5ForCausalLM检查点内运行,模型预测CPU执行日志,主机程序处理图像绘制、控制器读取和中断
一个NES CPU编译进了标准Qwen3.5模型的权重中。 NES的6502 CPU(其2A03芯片的核心)、2 KB的工作RAM和一个游戏卡的程序ROM都在一个标准的Qwen3_5ForCausalLM检查点内运行。 这些权重没有被训练过; 编译器计算了每一个。 当你玩游戏时,模型一次一个标记地预测CPU的执行日志。 一个小型主机程序在周围运行其余的 консоль:它绘制图像,读取控制器,并触发vblank中断。
nesformer建立在Divyansh Agrawal的Qwenputer之上,它将一个CHIP-8和一个RISC-V CPU编译进了Qwen3.5-4B。 它重用了Qwenputer的编译器及其核心技巧:模型的Gated DeltaNet状态是机器的内存。 Super Mario Bros. (World 1-1) 全游戏由Doug Fraker提供(标题屏幕和第一级)。 这些运行中的每个CPU标记都来自模型。 对于捆绑的测试游戏,每一帧都与传统的6502模拟器的输出完全匹配(见如何检查)。 快速入门1.
文件夹布局解压缩nesformer.zip和nesformer-weights.zip到同一个文件夹。
权重放在nesformer/包旁边,而不是里面:nesformer/ <- 从这里运行命令 ├── nesformer/ <- Python包 ├── chipformer/ <- Qwenputer的编译器 ├── roms/ <- 测试ROM(也可以放你自己的) ├── examples/ <- 示例GIF和帧表 ├── tests/ ├── LICENSE ├── LICENSE.chipformer ├── README.md ├── pyproject.toml └── weights/ <- 来自nesformer-weights.zip ├── config.json ├── generation_config.json ├── model.safetensors ├── nesformer.json └── SHA256SUMS 命令行在nesformer/包旁边寻找权重。
为了将权重放在其他地方,传递--weights /path/to/weights到运行、检查或跟踪,或给info提供路径。 为了确认权重解压正确,从顶层文件夹运行shasum -a 256 -c weights/SHA256SUMS。 2. 安装需要Python 3.11或更新版本。
python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install numpy scipy numba pillow 3.
玩一个游戏python -m nesformer run roms/thwaite.nes --frames 600 --show \ --buttons " start@90-95+200-205,a@230-233+250-253+270-273+290-293+310-313+330-333+350-353+370-373+390-393+410-413+430-433+450-453+470-473+490-493+510-513+530-533+550-553+570-573+590-593 " --show 终端中绘制每个帧,模型生成它。
运行结束时,命令行在当前文件夹保存一个名为ROM的动画GIF(这里thwaite.gif)。 预计会很慢。 第一次运行大约花费20秒用numba编译引擎。 之后,一帧需要1-6秒,所以600帧(10秒的NES时间)大约需要25分钟。 玩你自己的ROMs点run到任何使用NROM板(iNES映射器0)的.nes文件,比如Super Mario Bros.、Donkey Kong或Excitebike。 你提供ROM; nesformer只提供三个自由许可的测试ROM在roms/中。
python -m nesformer run roms/smb.nes --frames 600 --show \ --buttons " start@60-65,right@200-600,a@250-265+300-315+360-375+420-435+480-495+540-555 " 该脚本开始游戏,然后让Mario向右走,每秒跳一次。 命令行在启动时将ROM加载到模型的状态中,所以相同的权重运行任何NROM游戏而无需重建。 其他板上的游戏会停止,并显示消息:见限制。
控制器脚本--buttons接受逗号分隔的列表。 每个条目命名一个或多个按钮,用+连接,然后@,然后一个或多个用+连接的帧范围:start@60-65 在60到65帧期间按Start right@200-600 从200帧到600帧保持Right a@250-265+300-315 按 A 两次 right+b@200-600 保持Right和B一起(在Super Mario Bros.中运行)。 按钮是a、b、select、start、up、down、left和right。
帧从60秒/秒的电源开启时开始计数,所以600帧是10秒。 游戏忽略在不能移动的屏幕上的输入,所以稍微提前按住按钮没有坏处。 在Super Mario Bros.中,更长的A按住会跳得更高。 命令


来源:Hacker News · github.com