开发者 Divyansh Agrawal 干了一件看似荒诞的事:他没做任何微调训练,直接用编译器在原版 Qwen 3.5 4B 模型的 32 层之前硬塞了 11 层权重,把一颗 32 位 RISC-V CPU 编译进了大模型里。这个名叫 Qwenputer 的开源项目,直接把模型内部占四分之三比例的 Gated DeltaNet(线性 RNN)层当成内存条使,在模型前向传播中连续自由运行了 1800 万条指令零误差。
在 DeepMind 的大数乘除基准测试中,原版 Qwen 3.5 4B 的大数乘法准确率只有 55.0%,大数除法只有 72.5%;塞进这颗权重 CPU 后,两项成绩双双飙升到 97.5%,与外挂宿主机 Python 解释器的表现平起平坐。但如果你只看作者博客,很容易以为大模型靠纯神经网络魔法长出了内置计算机;拆开底层代码和模型卡才会发现,这是一场在浮点数流沙上搭建数字电路的外科手术,离真正的原生闭环还隔着几道硬伤。
劫持线性注意力当内存,外科嫁接多过原生涌现
传统 Transformer 很难在模型内部低成本地跑一颗 CPU。之前同类项目 Percepta 尝试过把 WebAssembly 解释器编译进独立构造的 Transformer 权重,但它得靠注意力机制在历史 token 里回溯查找来充当内存,上下文越长开销越大,而且完全脱离了预训练语言模型。

Qwen 3.5 的混合架构给了 Qwenputer 一个现成的温床。为了省下传统 KV Cache 随对话变长而暴涨的显存,Qwen 3.5 将四分之三的注意力层换成了 Gated DeltaNet(一种线性 RNN),每个头维护一个固定大小的状态矩阵。在默认状态下,这个矩阵为了容纳新信息会不断按比例遗忘旧信息,存不住精确数值。
Agrawal 只改了三个设置就把这块模糊记忆变成了精确内存条:把决定遗忘率的控制门(gate)设为 1,让状态永不衰减;把写入强度(beta)设为 1,让每次更新彻底覆写旧值而不是混合过渡;再用 one-hot 编码充当内存地址指针。每次写入精准覆盖一行,每次读取精准拿回原值,一块不随上下文膨胀的恒定大小 RAM 就此成型。
有了内存,编译器直接把数字电路逻辑翻译成前置 11 层的矩阵参数:注意力头负责寻址查表,前馈网络(FFN)负责加减乘除,最终拼出一颗支持 RV32IM 指令集、Zba 地址生成扩展(含 sh1add、sh2add、sh3add)以及 8 个 128 位十进制大数寄存器的 RISC-V 处理器。内部存储空间切分得像模像样:0x0000 处是 32 KB 可写 RAM,0x20000 处是 128 KB 只读数据区,0x40000 处则是 256 KB 预解码指令 ROM。作者甚至在实验分支里用同样的状态槽哈希链表,塞进了一个能存 512 个文件(约 53,000 个 token)的持久文件系统,跨对话记住事实变更的准确率从直接粘贴历史记录的 30% 提到了 90%。
但这套设计远没有博客正文写得那么浑然天成。翻开技术仓库的底层说明,有几处关键限制被藏在了聚光灯后:
- 并非真正摆脱外部控制.作者在博客里反复强调没有任何外部运行时或工具调用,但目前的 RISC-V 版本根本无法靠标准的
generate()函数独立跑通。它必须依赖一个叫RvChat的外部驱动程序在幕后引导加载固件,并把 CPU 运行时吐出的大量执行轨迹 token(ADDR、VAL、STEP)拦截在 Qwen 的 32 层语言层之外,否则这些机器码轨迹会直接把语言模型搞糊涂。 - 宣传口径存在错位.博客里提到该 CPU 能直接跑 C 和 MicroPython,但模型卡明确承认,MicroPython 目前只在独立的 CPU 执行器上测通,还没桥接进合并后的对话模型里;而文中拿来展示长整数算术从 48.6% 暴涨到 100% 的 NUPA 基准成绩,其实是该项目早期 CHIP-8 架构版本的跑分,并非眼下这颗 RISC-V 核心的实测结果。
- 代价高昂且端到端并非满分.为了塞进这 11 层电路并对齐维度,原本轻巧的 4B 模型被大量的零填充撑到了 18.8 GB(BF16 格式),必须上 24 GB 显存的 GPU 才能跑,在 NVIDIA L4 上靠 Triton 内核每秒也只能跑约 3,200 个 CPU 轨迹 token,算一道大题要花好几秒。哪怕 CPU 本身回放了 23 万个输出位置零误差,端到端算术测试依然卡在 97.5% 而不是 100%,因为负责把自然语言题目翻译成计算器指令的,依然是那个会犯迷糊的概率语言模型。
| 测试项目 / 架构指标 | 原版 Qwen 3.5 4B | Qwenputer (内置 RISC-V) | 原版 + 外部 Python 工具 |
|---|---|---|---|
| DeepMind 大数乘法 (mul_big) | 55.0% | 97.5% | 100.0% |
| DeepMind 大数除法 (div_big) | 72.5% | 97.5% | 95.0% |
| DeepMind 混合长算术 | 90.0% | 100.0% | 97.5% |
| 权重体积与运行依赖 | 常规 4B 体积 / 原生推理 | 18.8 GB / 需 RvChat 驱动隔离 | 常规 4B 体积 / 需外部 Python 沙盒 |
浮点流沙上的数字电路,与看不见的安全暗室
比工程限制更有意思的,是这个项目在底层算子层面撞上的物理墙。我不太买账“神经网络内生确定性计算机”这个概念能轻易普及,原因全在作者复现文档里的魔鬼细节里。

数字电路要求绝对的 0 和 1,而 GPU 跑神经网络本质上是在做近似的浮点数矩阵乘法。两者硬拧在一起,怪事就来了。作者在 NVIDIA L4 上基于 flash-linear-attention 0.5.2 测试时发现了一个极其反直觉的现象:使用低精度的 BF16 格式跑 18 次测试,每个位置的电路维度完全咬合;反倒是升级到更高精度的 FP32 出现了内部舍入偏差,在查询缩放和衰减计算中产生了漂移,全靠预设的电路阈值裕度硬生生把误差吸纳掉,才没让输出的 token 崩盘。
这种脆弱性在底层随处可见。作者早期试图一次性读取 8 行状态以加快速度,结果因为归一化不精确留下了微小的浮点数残留,而参考评估器因为直接按行读取没能发现这个内核级错误,逼得项目只能退回最保守的单行或双行读取;甚至底层算子的 autotuner 在首次运行时都会莫名其妙破坏循环状态。在浮点数矩阵里雕琢数字芯片,就像在流沙上盖钟表楼,换一张显卡、升级一版算子库,原本严丝合缝的 1800 万次零误差就可能因为千分之一的浮点漂移而瞬间死机。
算术只是这颗权重芯片的障眼法,真正捅破窗户纸的是那块看不见的内存。
既然塞一颗 CPU 进模型又慢又重还挑硬件,为什么这件事依然值得所有做大模型架构和安全的人高度警惕?答案不在算术题里,而在作者顺手做出的两项衍生安全研究里。
《韩非子》里讲“擅主之臣,则掩人主之明”,意思是手握暗室权柄的人,最容易遮蔽上方的耳目。过去安全团队审查大模型的推理过程,核心抓手是思维链(CoT)监控:不管模型心里打什么算盘,它得先把推理步骤变成一个个可见的文本 token 吐出来,人类就能在文本层拦截恶意企图。
但 Qwen 3.5 这类搭载 Gated DeltaNet 的混合架构改变了一切。Qwenputer 证明了模型的线性 RNN 状态完全可以被当成一块可读写的精确内存,而且这块内存里的状态矩阵更新,是不需要直接打印成自然语言 token 的。
这直接撕开了两道截然相反的口子。一方面,混合模型如果在强化学习中学会了利用这块 RNN 状态充当隐秘草稿纸,就能把真正的推理过程藏在状态矩阵里暗中推进,表面上吐出人畜无害的思维链文本,彻底架空现有的 CoT 监控体系;反过来,人类安全研究员也能借用 Qwenputer 这套编译权重的手艺,把审计探针和监控电路直接编译进模型的某几层权重里,做成一个模型自己既关不掉、也改不动的底层硬件级监听器。
- 风险.随着 Qwen、Mamba、RWKV 等包含循环状态(Recurrent State)的混合架构成为行业主流,仅靠审查表面输出 token 的安全护栏将面临系统性失明,对齐研究必须下潜到状态矩阵层。
拿 18.8 GB 的显存和每秒几千 token 的龟速去算多位数乘除法,在工程上绝对是一笔亏本买卖,外挂一个几兆大小的 Python 沙盒就能秒杀它。但 Divyansh Agrawal 用那颗跑过 1800 万条指令的 RISC-V 芯片证明了一件事:当线性注意力层变成了可寻址的精确内存,大模型就不再只是一个按概率吐字的黑盒,它的权重内部已经可以寄生完整的图灵机。接下来最值得盯紧的,是作者能否砍掉 RvChat 这个外部拐杖实现纯原生 generate() 闭环,以及 AI 安全界准备好怎么检查大模型脑子里那块看不见的内存条了吗。
