Qwenputer:在 Qwen3.5 内部运行的完整、确定性 RISC-V CPU

Hacker News Top 模型

摘要

Qwenputer 是一个实验性的 Qwen 3.5 4B 模型,其权重中编译了一个功能完整、确定性运行的 RISC-V CPU。它利用模型自身的 Gated DeltaNet 层作为精确的 RAM,完全在前向传播过程中执行算术、C 语言和 MicroPython——无需任何工具或外部运行时。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/10/29 01:30

# Qwenputer:Qwen3.5 内部一台完全可用、确定性的 RISC-V CPU 原文:https://divagr.com/blog/qwenputer ← 我的博客 (https://divagr.com/blog) ## 已编译权重 一个原版 Qwen 3.5 4B,内部编译了一颗 RISC-V CPU,运行在它自己的 Gated DeltaNet 层上充当 RAM。 ## 无法相信这不是真芯片 Qwenputer 是一个相当有趣的实验模型。它是一个原版 Qwen 3.5 4B,唯一的改动是:权重中嵌入了一颗 RISC-V CPU,利用模型自身的 Gated DeltaNet 注意力层作为 RAM。(想了解 GDN 的工作原理,这里有一份详细指南:https://divagr.com/attention-lab/delta)。这颗"CPU"完全运行在模型的前向传播之中,能够执行算术运算、C 代码和 MicroPython 代码,完全不需要任何外部运行时或工具。 需要特别澄清的是:它不是一个插件、不是一个工具、也不是一个沙盒。这篇博客将详细解释这个模型的工作原理,模型如何利用 GDN 层作为 RAM,以及我如何在模型内部加入了一个实验性的文件存储系统。 我还基于 Qwenputer 写了两篇后续文章:混合模型如何学会将推理隐藏在 RNN 状态中并规避思维链监控(https://divagr.com/blog/hybrid-models-can-hide-reasoning-in-their-rnn-state),以及这种编译权重如何作为内置监控工具,模型自身无法篡改(https://divagr.com/blog/building-oversight-tools-into-a-models-weights)。 Qwen 将一个乘法交给权重内部的 RISC-V CPU;CPU 的 RAM 就是 Gated DeltaNet 状态 你可以从 Hugging Face(https://huggingface.co/divagr1925/Qwen3.5-4B-Qwenputer)或 ModelScope(https://www.modelscope.ai/models/Spartan1925/Qwen3.5-4B-Qwenputer)获取 Qwenputer,代码在 GitHub(https://github.com/divagr18/qwenputer)。 ## Qwen3.5 内部的 RNN 可以作为精确的 RAM Qwen3-Next 和 Qwen 3.5(Qwenputer 基于的模型)使用了一个非常巧妙的技巧。模型 4 层注意力层中的 3 层使用 Gated DeltaNet——一种线性 RNN——作为注意力机制(更多细节见这里:https://divagr.com/attention-lab/delta)。每个头维护一个状态矩阵,delta 规则负责更新它。 现在,有趣的实验来了。我发现,通过将门控值设为 1,<sup>1</sup>将写入强度(beta)设为 1,<sup>2</sup>并使用独热键编码,<sup>3</sup>每一次写入都会精确地覆盖状态矩阵中的一行,每一次独热查询都能取回精确的值。这意味着 GDN 层本身就可以作为精确的 RAM 工作,而且比使用普通注意力作为 RAM 的成本低得多,因为 GDN 头的状态大小不随对话长度变化,不像注意力的 KV 缓存。 Gated DeltaNet 状态作为 RAM 使用:独热键覆盖一行,独热查询读回它,CPU 将寄存器、内存和程序计数器保存在这些行中 delta 规则可以作为记忆的想法并不新鲜:Schlag 等人(2021)证明了使用 delta 规则的线性注意力可以作为联想记忆,或称"快速权重"。<sup>4</sup> 这里的新东西是使其变得精确且可寻址,嵌入在一个生产模型中,并且足够可靠地在其上运行整个 CPU。 这就是整个模型构建的基础。就目前而言,默认的 Qwen 3.5 不会在 GDN 中保留精确值。通过这项修改,我们解锁了这个实验的下一部分。 ## 将一台计算机编译进层中 既然我们有了一个完全可用、低成本且高速的 RAM,就可以将一个可用的 CPU 编译进模型权重了。幸运的是,这不需要训练:编译器直接设置每一个权重。你将 CPU 描述为一个电路——一长串小步骤,比如"读取这个寄存器"、"将这两个数相加"或"为零则跳转"——编译器将每个步骤转换为 Transformer 层的一部分:执行查找的注意力头、执行算术的前馈单元,以及保存 RAM 的 DeltaNet 头。CPU 随后在模型解码时运行。 每条指令由几个生成的 token 组成:一个指定要写入的内存行(ADDR),下一个携带数据(VAL),最后一个 STEP token 结束该指令。这些 token 就是 CPU 的执行轨迹,因此当 Qwen 生成它们时,CPU 实际上正在运行。 ## CPU 这颗 CPU 是一个 32 位 RISC-V 核心(RV32IM,加上 Zba 扩展和一个用于大数运算的小型 bignum 单元),在 Qwen 的 32 层之前占用了 11 层。就目前而言,它通过了官方 riscv-tests,其程序与 qemu 结果一致,并且已自由运行了 1800 万条指令而没有出现任何错误。<sup>5</sup> 这颗 CPU 也可以在前向传播中运行 C 和 MicroPython 代码,效果相当不错(虽然有点慢)。它还不是 Linux 级别的芯片,但它实现了完整的 RV32IM 指令集。 ## Qwen 如何使用它 Qwen 3.5 4B 能够很好地使用这颗 CPU,不需要任何后训练。CPU 完全在内部使用,不通过任何外部工具调用。 为了让模型可靠地使用它,我选择了最简单的方式:利用模型训练得相当好的工具调用格式,Qwen 通过它向 CPU 发送指令并读回结果。**不使用任何外部工具调用或运行时。**一旦 CPU 收到指令,计算层就开始运行,然后写入工具响应。我们使用一个名为 RvChat 的小型驱动程序将固件加载到 GDN 状态中,这使轨迹 token 不进入 Qwen 的层。 Qwen 的原始权重保持不变。计算机权重是在其基础上添加的,占用额外的维度和层。 ## 它真的能用吗? 读完我这些不停输出的长篇大论后,你心中的主要问题可能是:这玩意真的能用吗? 在 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%,与使用 Python 运行的记忆工具效果相当(83.3% vs 78.9%)。这一部分仍然是实验性的,代码在 rv-store 分支(https://github.com/divagr18/qwenputer/tree/rv-store/experimental/riscv),模型在 Hugging Face(https://huggingface.co/divagr1925/Qwen3.5-4B-Qwenputer-Filesystem)和 ModelScope(https://www.modelscope.ai/models/Spartan1925/Qwen3.5-4B-Qwenputer-Filesystem)。 ## 局限与下一步 Qwenputer 是一个实验性项目,因此有一些局限。额外的层和更大的隐藏维度使检查点达到 18.8 GB,大约是基座 Qwen 的两倍,尽管大部分是零填充。它还需要一个小驱动程序(RvChat)来加载固件并使轨迹 token 不进入 Qwen 的层,所以目前还不能仅用一个普通的 `generate()` 调用运行。它也有点慢,每条 CPU 指令消耗几个解码 token,因此一次大计算需要几秒而不是几毫秒。我用于基准测试的批处理执行器在 L4 GPU 上每秒运行约 3,200 个 CPU token。 下一步,我希望 Qwen 能编写 Python 并在它自身权重内部的 MicroPython 上运行,通过一个与 `calc` 工作方式相同的 `python()` 工具。让 CPU 更快是另一个重点。 ## 超越算术 精确控制 RNN 层的用途远不止于算术。它也使 Qwenputer 成为一个非常好的 AI 安全研究测试平台,我写了两篇后续文章:像 Qwen 3.5 这样的混合模型如何学会将推理隐藏在 RNN 状态中并规避思维链监控(https://divagr.com/blog/hybrid-models-can-hide-reasoning-in-their-rnn-state),以及编译权重如何作为可监控性工具(https://divagr.com/blog/building-oversight-tools-into-a-models-weights),比如一个模型无法关闭的权重内监控器,或用于可解释性的标准答案。 ## 试试看 如果你想自己玩一玩,这个模型可以在单张 24 GB GPU 上运行。你需要 [uv](https://docs.astral.sh/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](https://github.com/divagr18/qwenputer),两个模型在 Hugging Face([Qwenputer](https://huggingface.co/divagr1925/Qwen3.5-4B-Qwenputer)、[Filesystem](https://huggingface.co/divagr1925/Qwen3.5-4B-Qwenputer-Filesystem))和 ModelScope([Qwenputer](https://www.modelscope.ai/models/Spartan1925/Qwen3.5-4B-Qwenputer)、[Filesystem](https://www.modelscope.ai/models/Spartan1925/Qwen3.5-4B-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} } ``` --- <sup>1</sup> 每个 Gated DeltaNet 头维护一个状态矩阵,即它的记忆。在每个 token 处,写入任何新内容之前,它将整个状态乘以门控值——一个介于 0 和 1 之间的数。这就是 RNN 的遗忘方式:门控值为 0.9 意味着每个 token 都将所有存储内容轻微淡化,门控值为 1 则表示什么都不会被淡化。[↩](https://divagr.com/blog/qwenputer#footnote-ref-1) <sup>2</sup> 门控之后,头将状态的某个方向推向新值,写入强度 beta 决定推多远。beta 为 1 意味着该方向上的旧值被完全替换,而不是混合。[↩](https://divagr.com/blog/qwenputer#footnote-ref-2) <sup>3</sup> 独热键是一个全零向量中只有一个位置为 1,因此它精确指向状态矩阵中的一行,就像内存地址指向一个存储单元一样。[↩](https://divagr.com/blog/qwenputer#footnote-ref-3) <sup>4</sup> Imanol Schlag, Kazuki Irie and Jürgen Schmidhuber, "Linear Transformers Are Secretly Fast Weight Programmers" (https://arxiv.org/abs/2102.11174), ICML 2021. [↩](https://divagr.com/blog/qwenputer#footnote-ref-4) <sup>5</sup> 自由运行意味着 CPU 在整个过程中基于自己的输出持续运行,没有参考机器在步骤之间进行纠正。[↩](https://divagr.com/blog/qwenputer#footnote-ref-5)

相似文章

@tobi: https://x.com/tobi/status/2116265341990891599

X AI KOLs Timeline

Qwenputer:在 Qwen3.5-4B 权重内部嵌入完整 RISC-V CPU,利用模型自身的 Gated DeltaNet 层充当内存,可在前向传播中直接运行 C 和 MicroPython,无需外部运行时。在 DeepMind 数学基准上达到 97.5–100% 的成绩。