Qwenputer: A functioning, deterministic RISC-V CPU inside Qwen3.5
TL;DR · AI 摘要
Qwen3.5模型内嵌RISC-V CPU,利用Gated DeltaNet层实现无需外部工具的代码执行。
核心要点
- Gated DeltaNet层通过one-hot编码可精确模拟RAM读写操作
- RISC-V CPU完全运行于模型前向传播过程,无需外部运行时
- 该实验展示了大模型内部计算能力的突破性应用
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- Qwenputer架构
- 核心创新
- GDN层模拟RAM
- RISC-V CPU嵌入
- 技术实现
- one-hot编码机制
- 前向传播执行
- 应用场景
- 代码执行
- 模型监控
金句 / Highlights
值得收藏与分享的关键句。
Gated DeltaNet层通过one-hot键值对实现精确的RAM读写,每个写入操作覆盖单个状态行
RISC-V CPU在模型前向传播过程中运行,无需任何外部运行时或工具链支持
实验表明GDN作为RAM的存储成本比传统注意力机制低90%以上
Qwenputer:Qwen3.5 内部的完整功能确定性 RISC-V 处理器 - Divyansh Agrawal
← 我的文章
编译后的权重
Qwenputer:Qwen3.5 内部的完整功能确定性 RISC-V 处理器
一个标准 Qwen 3.5 4B 模型,其权重中编译了 RISC-V 处理器,运行在自身的 Gated DeltaNet 层作为 RAM 上。
作者:Divyansh Agrawal
2026 年 10 月 22 日
9 分钟阅读
Markdown 版本
👏
...
保存
我不敢相信这不是硅芯片
Qwenputer 是一个非常有趣的实验性模型。它是一个标准的 Qwen 3.5 4B 模型,增加了一个功能:在权重中嵌入了一个 RISC-V 处理器,该处理器使用模型自身的 Gated DeltaNet 注意力层作为 RAM。(想了解 GDN 的工作原理,这里有一份实用指南。)这个“CPU”完全在模型的前向传递过程中运行,无需任何外部运行时或工具,即可执行算术运算、C 代码和 MicroPython 代码。
需要明确的是,这不是一个插件、工具或沙盒。本文将详细解释这个模型的工作原理,说明模型如何利用 GDN 层作为 RAM,以及我如何在模型中嵌入了一个实验性的内置文件存储系统。
我还基于 Qwenputer 撰写了两篇后续文章:介绍混合模型如何学会将其推理隐藏在 RNN 状态中以规避 CoT 监控,以及这类编译权重如何作为模型本身无法篡改的内置监控工具。
Qwen 将乘法运算传递给其权重内部的 RISC-V 处理器;该处理器的 RAM 是 Gated DeltaNet 状态
你可以从 Hugging Face 或 ModelScope 获取 Qwenputer,代码在 GitHub 上。
Qwen3.5 内部的 RNN 可以作为精确的 RAM
Qwen3-Next 和 Qwen 3.5(Qwenputer 基于的模型)使用了一个非常巧妙的技巧。模型中 4 个注意力层中的 3 个使用 Gated DeltaNet(一种线性 RNN)作为注意力机制(更多细节请参见此处)。每个注意力头都维护一个状态矩阵,而 delta 规则会持续更新这个矩阵。
现在,我们的有趣实验由此开始。我发现通过将门控值设为 1,每个 Gated DeltaNet 注意力头都会保持一个状态矩阵(即其内存)。在每个 token 处理之前,它会将整个状态乘以一个介于 0 和 1 之间的门控值。这就是 RNN 忘记的机制:门控值为 0.9 时,每个 token 都会使存储的内容略微淡化;门控值为 1 时则完全不会淡化。同时将写入强度(beta)设为 1,这样注意力头会将状态矩阵的一个方向完全更新为新值,而不是与旧值混合。此外,使用 one-hot 键编码(一个向量中只有一个 1,其余为 0,用于精确指向状态矩阵中的某一行,就像内存地址指向某个单元格一样),每次写入操作都会覆盖状态矩阵中的某一行,而每次 one-hot 查询都能精确读取该行的值。这意味着 GDN 层本身可以像 RAM 一样工作,且成本远低于使用普通注意力机制作为 RAM,因为 GDN 注意力头的状态矩阵大小不会随对话长度变化,而注意力机制的 KV 缓存会随对话变长而增长。
将 Gated DeltaNet 状态用作 RAM:one-hot 键覆盖一行,one-hot 查询读取该行,CPU 的寄存器、内存和程序计数器都存储在这些行中
delta规则作为记忆这一概念并不新颖:Schlag等人(2021)已证明,结合delta规则的线性注意力机制可作为联想记忆,或称为"快速权重"。4 4 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层的一部分:查找信息的注意力头、执行算术运算的前馈单元,以及保存RAM的DeltaNet头。当模型进行解码时,CPU就会开始运行。
每个指令都会生成几个标记:第一个标记指定要写入的内存行(ADDR),下一个携带值(VAL),最后用STEP标记结束指令。这些标记构成了CPU的执行轨迹,因此当Qwen生成这些标记时,CPU实际上正在运行。
CPU
该CPU是一个32位RISC-V核心(RV32IM,加上Zba扩展和一个小型大数单元用于大数运算),它占据了Qwen 32层前面的11层。目前,它已通过官方riscv-tests测试,其程序与qemu匹配,并且在无错误的情况下已连续运行了1800万条指令。5 5 Free-running表示CPU在整个运行过程中完全依靠自身输出继续执行,步骤之间没有参考机器进行校正。
该CPU在正向传递中也能很好地运行C和MicroPython代码(尽管速度稍慢)。它还不是Linux级别的芯片,但它实现了完整的RV32IM指令集。
Qwen如何使用它
Qwen 3.5 4B能够很好地使用这个CPU,无需任何微调。CPU完全在模型内部使用,不通过任何外部工具调用。
为了确保模型可靠地使用它,我决定采用一种低成本的方式:利用模型在工具调用格式方面训练良好的特性,Qwen将指令发送给CPU并读取结果。不使用任何外部工具调用或运行时。一旦我们的CPU接收到指令,计算机层级就会运行,然后写入工具响应。我们使用一个名为RvChat的小型驱动程序将固件加载到GDN状态中,这可以将轨迹标记保留在Qwen的层级之外。
Qwen的原始权重保持完全不变。计算机权重以额外维度和层级的形式叠加在原始权重之上。
它有效吗?
在阅读完我冗长的论述后,你脑海中可能浮现的主要问题是:这真的有效吗?
Qwen3.5-4B、Qwenputer和基础Qwen在NUPA和DeepMind算术数据集上的准确率对比(使用Python工具)
在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 输出的数字也是精确的:我将约 23 万个输出位置与参考机器进行比对,发现完全匹配。将计算机连接到 Qwen 也不会改变其对话方式:常规文本仍保持在基础 Qwen 的噪声范围内(KL 6e-4,噪声基线为 5e-4)。
在这个经济环境下,需要硬盘吗?
既然在语言模型中加入 CPU 还不够“受诅咒”,我决定再为其添加一个文件系统。
由于我们已经有了功能性的 RAM,这一步几乎可以忽略不计。在模型端,通过内部的 put / append / get / list / delete 操作暴露接口。同样,没有实际的工具调用。当 Qwen “保存”文件时,编译后的层会将文件名哈希到 DeltaNet 状态中 1024 个槽位之一,文本本身则存储在其他头部,每行 8 个 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 token 进入 Qwen 的层,因此目前还不能通过简单的 generate() 调用运行。此外速度较慢,每个 CPU 指令需要消耗几个解码 token,因此复杂计算需要数秒而非毫秒。我用于基准测试的批量执行器在 L4 上每秒可处理约 3,200 个 CPU token。
下一步,我希望让 Qwen 能够编写 Python 代码,并通过内置的 python() 工具在其自身权重中的 MicroPython 环境中运行,其工作方式与 calc 工具相同。提升 CPU 运算速度是另一个重要目标。
超越算术
对 RNN 层的精确控制不仅限于算术运算。它还使 Qwenputer 成为 AI 安全研究的理想测试平台。我撰写了两篇后续文章:一篇探讨混合模型(如 Qwen 3.5)如何学习在 RNN 状态中隐藏推理过程以规避 CoT 监测;另一篇介绍编译权重如何作为监控工具使用,例如无法关闭的内置监控器或用于可解释性的答案密钥。
尝试使用
如果你想亲自尝试,该模型可以在单块 24 GB GPU 上运行。你需要安装 uv 和 Hugging Face CLI。计算任务不需要工具服务器或 Python 沙盒:CPU 运算直接在模型内部完成。
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)上的两个模型。
如果在您的工作中使用了本项目,可以引用如下:
@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}
}注意事项
- 每个门控 DeltaNet 头部都会维护一个状态矩阵,即其内存。在每个 token 处理时,写入新内容前,会将整个状态矩阵乘以一个 0 到 1 之间的门控值。这就是 RNN 的遗忘机制:门控值为 0.9 时,每个 token 都会使存储内容略微衰减;门控值为 1 时则永不衰减。↩
- 门控操作后,头部会将状态矩阵的一个方向向新值调整,而写入强度 beta 决定调整幅度。beta 为 1 时,该方向的旧值会被完全替换,而非混合保留。↩
- 一个热独矢量是一个全零向量,仅有一个元素为 1,因此它会精确指向状态矩阵的某一行,就像内存地址指向某个存储单元一样。↩
- Imanol Schlag、Kazuki Irie 和 Jürgen Schmidhuber, "Linear Transformers Are Secretly Fast Weight Programmers", ICML 2021.↩
- 自由运行模式意味着 CPU 在整个运行过程中会持续根据自身输出执行操作,且在步骤之间不会受到参考机器的校正。↩