Wink Pings

他在Qwen的权重里装了一台GPU,跑真CUDA,每秒10个token

Vixhal把4 lane SIMT GPU编译进Qwen3.5-2B的45层权重,Gated DeltaNet状态用来当寄存器、程序ROM和全局内存。参考解释器在49个kernel上全部对齐Tesla T4,文本漂移KL约7e-4,代价是每秒10到15个token。

Vixhal(@TheVixhal)往Qwen3.5-2B里塞了一台GPU。

准确说,他把一台4 lane的SIMT GPU编译成了45层未训练的权重,放在Qwen原有24层前面。总共69层。它跑真正的CUDA,编译到PTX,在模型自己的forward pass里执行。

之前Qwenputer把RISC-V CPU编译进Qwen3.5-4B,Percepta把WebAssembly解释器编进自定义transformer。qwenGPU的区别在内存怎么来的:它用Gated DeltaNet的循环状态当寄存器、程序ROM和全局内存。

Gated DeltaNet是线性注意力的一种,每个head维护一个状态矩阵。平时门控控制写入,key和value做外积更新。Vixhal的做法是把门一直打开,写入强度设为1,所有key都是one-hot。这样每次更新恰好覆盖一行,读回时用one-hot query,那一行就是一个可寻址的内存单元。

qwenGPU结构图

配置是4 lane,每lane 15个可用寄存器(16行里有一行恒读零),4级流水线,32个block的ROM,126个内存字。

CUDA launch的流程:host扮演NVRTC和CUDA驱动的角色,用clang把CUDA编译成PTX,再降到机器块,作为token喂给模型。之后模型自己写launch的每一步。每个EXEC(b, w) token跑一个block的一个warp,耗时一次forward。后面的VAL token携带寄存器结果,MEM记录内存写入。host只负责从循环状态里读回结果,不做计算。

演示里,[1, 2, 3]和[4, 5, 6]的点积返回32。模型用了47个token写完这次launch。

数字方面,参考解释器在49个kernel上和真实Tesla T4全部对齐。文本漂移KL约7e-4,因为电路对文本token静音,Qwen自己的权重没动。normal模式24个聊天问题里20个用GPU算出了数字,advanced模式Qwen自己写CUDA,5次里4次一次过。

代价也很直白。Apple MPS上10到15 tokens每秒。构建checkpoint需要约16GB空闲内存,没有预编译版本,得自己just build。代码MIT,checkpoint跟Qwen一样Apache-2.0。

有网友问能不能在模型里跑模型。Vixhal的回复是技术上可以,但得塞进126个整数字,一个2-2-1 XOR网络没问题,跑Qwen需要大得多的GPU。

还有人算了笔账。Marco Polo在回复里吐槽:你的host脚本已经在跑Python了,不import decimal,反而把45层1970年代的C编译进14.7GB显存,乘3个整数要20秒,遇到$0.50就报“GPUError: use integers”。他顺手贴了自己的70-Cell Pipeline benchmark。

Vixhal没接这茬,回了张NVIDIA当天跌4.22%的截图。

NVIDIA股价截图

这东西实用吗?答案不太乐观。10到15 tokens每秒,跑一段CUDA比在纸上手算快不了多少。Qwen自己写的CUDA也只有80%的正确率,README自己都提醒2B模型的CUDA靠不住。

但49/49对齐T4这个结果说明一件事:在预训练LLM的权重里精确执行任意程序,是成立的。模型不只在逼近一个函数,它可以在自己的推理过程里做确定性的、可验证的计算。Percepta和Qwenputer都在往这个方向走,qwenGPU把粒度从CPU指令换成了GPU kernel。

至于这条路通向哪,现在下结论太早。49/49只是一个起点,速度是另一个问题。每秒10到15个token,暂时还不适合拿来当推理后端跑。但它至少证明了一件事:预训练权重里能塞进去的东西,比大多数人以为的多。

发布时间: 2026-11-02 17:53