Qwenputer 发布:在 Qwen3.5 权重内编译确定性 RISC-V CPU

原标题:Qwenputer: A functioning, deterministic RISC-V CPU inside Qwen3.5
88AI 研判分

研究人员 Divyansh Agrawal 推出实验性模型 Qwenputer,将完整的 RISC-V CPU 逻辑直接编译进 Qwen 3.5 4B 的权重中。该架构利用 Gated DeltaNet 注意力层作为 RAM,使模型能在前向传播内部独立执行算术运算及 C/MicroPython 代码,无需任何外部运行时或工具调用。

报道正文

本文目录10 个章节

简直不敢相信这竟然不是硅片

Qwenputer 是一款相当有趣的实验性模型。它基于标准的 Qwen 3.5 4B,但增加了一项功能:在权重中嵌入了一个 RISC-V CPU,该 CPU 利用模型自身的门控 DeltaNet(Gated DeltaNet)注意力层作为 RAM。(如需了解 GDN 的工作原理,这里有一份实用指南。)这个“CPU”完全在模型的前向传播过程中运行,无需任何外部运行时或工具调用,即可执行算术运算、C 语言和 MicroPython 代码。

需要明确的是,它既不是插件,也不是工具或沙箱。这篇博客将详细解释该模型的工作原理,包括模型如何利用 GDN 层作为 RAM,以及我如何在其中嵌入一种实验性的模型内文件存储机制。

此外,我还撰写了两篇基于 Qwenputer 的后续文章:一篇探讨 混合模型如何学会将推理隐藏在 RNN 状态中以规避思维链(CoT)监控,另一篇介绍 像这样的编译权重如何作为内置监控工具发挥作用,且模型本身无法篡改。

Qwen 将乘法运算交给其自身权重内部的 RISC-V CPU;该 CPU 的 RAM 是门控 DeltaNet 状态

Qwen 将乘法运算交给其自身权重内部的 RISC-V CPU;该 CPU 的 RAM 是门控 DeltaNet 状态

你可以从 Hugging Face 或 ModelScope 获取 Qwenputer,相关代码已发布在 GitHub 上。

Qwen3.5 内部的 RNN 可用作精确 RAM

Qwen3-Next 和 Qwen 3.5(Qwenputer 所基于的模型)使用了一个非常巧妙的技巧。模型中每 4 个注意力层就有 3 个使用门控 DeltaNet——一种线性 RNN——作为注意力机制(更多信息请见此处)。每个注意力头都维护一个状态矩阵,并通过 delta 规则对其进行更新。

现在,我们有趣的实验开始了。我发现,通过将门控(gate)设为 1,11 每个 Gated DeltaNet 头都维护一个状态矩阵,即其“记忆”。在处理每个 token 时,在写入任何新内容之前,它会将整个状态乘以门控值(介于 0 和 1 之间)。这就是 RNN 遗忘的方式:门控值为 0.9 意味着每处理一个 token,存储的内容都会轻微衰减;而门控值为 1 则意味着内容永不衰减。将写入强度(beta)设为 1,22 在门控之后,该头会将状态的某个方向推向一个新值,写入强度 beta 决定了推动的幅度。beta 为 1 意味着该方向上的旧值被完全替换,而不是混合。并使用 one-hot 键编码,33 One-hot 键是一个除单个位置为 1 外其余均为 0 的向量,因此它精确指向状态中的某一行,就像内存地址指向一个存储单元一样。我们执行的每次写入都将精确覆盖一行,并且每次 one-hot 查询都能检索到精确的值。这意味着 GDN 层本身可以完全作为 RAM 工作,且成本远低于使用标准注意力机制作为 RAM,因为无论对话多长,GDN 头的状态大小保持不变,不像注意力的 KV Cache 那样会随长度增长。

Gated DeltaNet state used as RAM: a one-hot key overwrites one row, a one-hot query reads it back, and the CPU keeps its registers, memory and program counter in those rows

将 Gated DeltaNet 状态用作 RAM:one-hot 键覆盖一行,one-hot 查询读回该行,CPU 在这些行中保存其寄存器、内存和程序计数器

Delta 规则充当记忆这一概念并不新鲜:Schlag 等人(2021)表明,带有 delta 规则的线性注意力可以作为联想记忆,或称为“快速权重”(fast weights)。44 Imanol Schlag, Kazuki Irie 和 Jürgen Schmidhuber, "Linear Transformers Are Secretly Fast Weight Programmers", ICML 2021。这里的新颖之处在于,在生产模型内部使其变得精确且可寻址,并具备足够的可靠性以在其上运行整个 CPU。

这是构建整个模型的基础。目前,默认的 Qwen 3.5 并不会在 GDN 中保持精确值。通过这种修改,我们解锁了实验的下一部分。

将计算机编译进各层

既然我们现在拥有了功能完备、廉价且快速的 RAM,就可以着手将可运行的 CPU 编译进模型权重中。幸运的是,这不需要任何训练过程:编译器会直接设置每一个权重。你将 CPU 描述为一个电路——即一长串微小的步骤列表,例如“读取此寄存器”、“将这两个数字相加”或“若为零则跳转”,编译器会将每个步骤转换为 Transformer 层的一部分:用于查找的注意力头(attention heads)、执行算术运算的前馈单元(feed-forward units),以及承载 RAM 的 DeltaNet 头。随后,CPU 在模型解码过程中运行。

每条指令都会生成几个 token:一个指定要写入的内存行(ADDR),下一个携带数值(VAL),最后由一个 STEP token 结束该指令。这些 token 构成了 CPU 的执行轨迹,因此在 Qwen 生成它们的同时,CPU 实际上正在运行。

CPU

该 CPU 是一个 32 位 RISC-V 核心(RV32IM,加上 Zba 扩展和一个用于大数运算的小型 bignum 单元),它占据了 Qwen 前 11 层的位置(Qwen 共有 32 层)。目前,它通过了官方的 riscv-tests,其程序输出与 qemu 匹配,并且已经自由运行了 1800 万条指令而没有任何错误。55 所谓“自由运行”,是指 CPU 完全依靠自身的输出持续运行整个流程,中间没有参考机器进行校正。

这个 CPU 也能相当好地在前向传播中运行 C 和 MicroPython 代码(尽管速度稍慢)。它还不是 Linux 级别的芯片,但它实现了完整的 RV32IM 指令集。

Qwen 如何使用它

Qwen 3.5 4B 能够很好地使用这个 CPU,无需任何后训练(post-training)。CPU 完全在内部使用,并未通过任何外部工具调用(tool calls)来调用。

为了让模型可靠地使用它,我决定采用一种低成本的方法:借助模型经过良好训练的工具调用格式,Qwen 向 CPU 发送指令并读回结果。不使用任何外部工具调用或运行时环境。一旦我们的 CPU 接收到指令,计算机层就会运行,然后写入工具响应。我们使用一个名为 RvChat 的小型驱动程序将固件加载到 GDN 状态中,这使得 trace tokens 不会进入 Qwen 的层中。

Qwen 的原始权重保持原样不变。计算机权重被叠加在其上,位于额外的维度(dims)和层中。

它有效吗?

我想在你读完我喋喋不休的长篇大论后,脑海中最主要的问题会是:这真的有效吗?

基础 Qwen3.5-4B、Qwenputer 以及配备 Python 工具的基础 Qwen 在 NUPA 和 DeepMind 算术数据集上的准确率

基础 Qwen3.5-4B、Qwenputer 以及配备 Python 工具的基础 Qwen 在 NUPA 和 DeepMind 算术数据集上的准确率

在 DeepMind 数据集上:

  • div_big:Qwenputer 得分为 97.5%,而给 Qwen 3.5 4B 配备 Python 工具的得分为 95%,基础 Qwen 的得分为 72.5%。
  • mul_big:Qwenputer 得分为 97.5%,而配备 Python 工具的得分为 100%,基础 Qwen 的得分为 55%。
  • mul_div_multiple_longer:Qwenputer 得分为 100%,而配备 Python 工具的得分为 97.5%,基础 Qwen 的得分为 90%。
  • add_or_sub_big:Qwenputer 得分为 97.5%,与配备 Python 工具时相同,基础 Qwen 的得分为 87.5%。

在 NUPA 的长整数运算任务中,Qwenputer 的性能从 48.6% 提升至 100%,这与给 Qwen 配备 Python 工具的效果相当。

CPU 打印出的数字也是精确无误的:我将其约 230,000 个输出位置与参考机器进行了回放比对,未发现任何不匹配项。此外,将计算机接入 Qwen 并不会改变其表达方式:其常规文本表现仍在基础 Qwen 的噪声范围内(KL 散度为 6e-4,而噪声底限为 5e-4)。

硬盘?在这种经济环境下?

既然语言模型内部集成 CPU 显然还不够“离谱”,我决定再给它配上一个文件系统才算稳妥。

由于我们已经拥有了可用的 RAM,这一步骤基本上微不足道。在模型侧,它通过内部的 put / append / get / list / delete 操作暴露出来。同样地,这里没有任何实际的工具调用。当 Qwen “保存”一个文件时,编译层会将其名称哈希到 DeltaNet 状态中保留的一个目录里的 1,024 个槽位之一,并将文本本身存储在其他注意力头中,每行八个 token,链式连接。如果两个名称最终落入同一个槽位,它只需检查下一个槽位即可。重新查找一个文件大约需要两到三个步骤,而不是进行扫描,并且它可以容纳多达 512 个文件,这相当于约 53,000 个 token 的文本量。

有意思的是,这种状态具有相当的持久性。你可以在对话结束时保存状态,将其加载到下一次对话中,文件依然完好无损。借助这个文件系统,Qwen 在跨对话获取事实变化方面的准确率高达 90%,而如果你只是把旧聊天记录粘贴回去,准确率仅为 30%;这一表现甚至与给 Qwen 配备由 Python 运行的记忆工具相当(83.3% vs 78.9%)。这项功能目前仍处于实验阶段,其代码位于 rv-store 分支,模型则托管在 Hugging Face 和 ModelScope 上。

局限性与未来展望

Qwenputer 本质上仍是一个实验项目,因此存在一些局限性。额外的层数和更宽的隐藏维度使得检查点文件大小达到 18.8 GB,大约是基础版 Qwen 的两倍,尽管其中大部分是零填充数据。此外,它还需要一个小型驱动程序(RvChat)来启动固件并防止 trace tokens 进入 Qwen 的层级,因此目前无法通过简单的 generate() 调用直接运行。它的速度也稍慢一些,因为每条 CPU 指令都需要消耗几个解码后的 token,导致大型计算需要数秒而非毫秒才能完成。我在基准测试中使用的批处理执行器在 L4 GPU 上大约每秒能处理 3,200 个 CPU token。

接下来,我希望 Qwen 能够编写 Python 代码,并通过一个类似 calc 工作的 python() 工具,在其自身权重内部的 MicroPython 环境中运行这些代码。提升 CPU 速度是另一个主要目标。

超越算术运算

对 RNN 层的精确控制在远超算术运算的领域中也极具价值。这使得 Qwenputer 成为 AI 安全研究的一个绝佳测试平台。我撰写了两篇后续文章:一篇探讨了混合模型(如 Qwen 3.5)如何学会将推理隐藏在 RNN 状态中从而规避 CoT 监控,另一篇讨论了编译后的权重如何作为可监控性工具,例如模型无法关闭的内部监控器,或用于可解释性的答案密钥。

试一试

如果你想亲自体验,该模型可以在单张 24 GB 显存的 GPU 上运行。你需要安装 uv 和 Hugging Face CLI。你不需要工具服务器或用于计算的 Python 沙箱:CPU 会在模型内部直接执行计算。

BASH
git clone https://github.com/divagr18/qwenputer && cd qwenputer/experimental/riscv && uv sync --extra hf
hf download divagr1925/Qwen3.5-4B-Qwenputer --local-dir qwenputer-rv
uv run python -m chipformer.rv.chat qwenputer-rv --firmware tests/data/rv/calc-bridge.elf \
    --ask "Use calc: what is 123456789 * 987654321?"

所有内容均已开源:GitHub 上的代码,以及 Hugging Face (Qwenputer, Filesystem) 和 ModelScope (Qwenputer, Filesystem) 上的两个模型。

如果您在工作中使用了该项目,可以按以下方式引用:

BIBTEX
@software{agrawal2026qwenputer,
  author  = {Agrawal, Divyansh},
  title   = {{Qwenputer}: a computer compiled into the weights of a pretrained language model},
  year    = {2026},
  url     = {https://github.com/divagr18/qwenputer}
}