编辑部快讯
第 2429 号 · 2026-10-27 · 晚间版

US 美国10-27 21:15⏱ 3 分钟

单张 RTX 3090 跑 4 个编码 agent:自研 CUDA 引擎驱动 Qwen3.8-27B,合计约 290 tok/s(为 llama-server --parallel 的 3-4 倍)

单张 RTX 3090 跑 4 个编码 agent:自研 CUDA 引擎驱动 Q

我一直在开发 OpenJet,一个为 Qwen3.8-27B Q4_K_M 配备自研 CUDA megakernel 引擎的本地编码 agent。此前它一次只服务一个会话,新版本可以在单张 GPU 上同时服务多个 agent。 https://reddit.com/link/1xgs8hp/video/p0zd2rxse0yh1/player 数据(RTX 3090,Qwen3.8-27B Q4_K_M ):

我一直在开发 OpenJet,一个为 Qwen3.8-27B Q4_K_M 配备自研 CUDA megakernel 引擎的本地编码 agent。此前它一次只能服务一个会话,新版本可以在单张 GPU 上同时服务多个 agent。 https://reddit.com/link/1xgs8hp/video/p0zd2rxse0yh1/player

数据(RTX 3090,Qwen3.8-27B Q4_K_M):

| 每 agent 指标 | llama-server --parallel 4 | OpenJet --agents 4 |

| --- | --- | --- |

| decode,短提示 | 18-20 tok/s | 64-72 tok/s |

| decode,各 23K 上下文 | 15-16 tok/s | 52-55 tok/s |

| 这些上下文上下一请求的首 token | 13.4 s | 0.2-0.5 s |

| 处理 20K 提示的同时另一个 agent 解码 | 0.6 tok/s | 9.5 tok/s |

也就是说,4 个 agent 合计 256-288 tok/s,而 llama-server 合计 72-80 tok/s。单个 agent 独跑仍能拿到 117 tok/s。四个真实的编码 agent(会停下来跑工具和测试)合计 150-200 tok/s。

并行解码的原理:GPU 上生成 token 受内存带宽限制。每个 decode 步都要从显存读完全部 16.7 GB 权重,在 3090(936 GB/s)上仅此一项就约需 18 ms。相比之下,对这些权重做的计算量很小。所以引擎不逐个轮流跑 agent,而是每一步把所有活跃 agent 的工作堆进同一批行:每个 agent 的下一个 token 加上各自的 2 个 MTP / prompt-lookup 草稿 token,4 个 agent 共 12 行。权重只流过一次,每个被加载的权重在仍在片上时,就用 tensor cores 与全部 12 行相乘。4 个 agent 每步的权重读取开销约等于读一次,而不是四次。这就是为什么每个 agent 从 117 降到 64-72 tok/s,而不是降到约 30:共享的权重读取占了每步成本的大头。随 agent 数增长的是 attention(每个 agent 读自己的 KV cache)和额外行的计算。整个步作为一个持久 CUDA kernel 运行,没有逐层 launch,草稿也在同一趟里验证,因此每个被接受的草稿都是同一次权重读取白赚的 token。

真实 agent 场景下保持高速的机制:

新提示不会让所有人停摆。当某个 agent 发来新提示时,每一步都会把它的下一块与其他 agent 的行一起携带,处理提示期间其他 agent 继续生成。结果与单独处理该提示在比特级完全一致。

一个共享的 132K token KV 池(q8_0)。它按页管理,一个 agent 可以占用其中大部分,其余 agent 保持较短。没有固定的 4 x 32K 切分。

共享 system prompt 只存一份。各 agent 共有的、1024 token 以上的 system prompt 加工具列表,只处理和存储一次。

会话留在自己的槽位。后续请求回到已存有其会话的槽位,因此只处理新增 token。

另外新增:Sampled MTP 草稿(感谢 iiLaurens):在 temperature > 0 时,草稿现在从 draft head 采样并用拒绝采样验证。输出分布不变,更多草稿被接受。mk_top:一个实时终端视图,显示每个 agent 的 tok/s、上下文占用、当前任务和最新输出,外加 GPU 状态。mk_top --run 4 会启动 server 和 4 个跑评测任务的 agent,供你观察。

准确性:输出与 llama.cpp 不逐字节一致,因为运算顺序不同。对照 llama.cpp 自身的下一 token 分布,KL 散度与 llama.cpp 批处理对比逐 token 处理在同一量级。README 附有完整正确性对照表。

试用(Linux,24 GB 显存的 RTX 30/40/50,CUDA 12+):

python3 megakernel/server/mk_server.py -m Qwen3.8-27B-Q4_K_M.gguf --agents 4

python3 megakernel/tools/mk_top.py

然后把最多 4 个 OpenAI 兼容 agent 指向 http://127.0.0.1:18080/v1 。

限制:仅 Q4_K_M 引擎(混合量化版一次只服务一个会话),最多 8 个 agent,presence/repetition 惩罚被忽略。

仓库:https://github.com/l-forster/open-jet

我还计划下一步支持 TurboQuant,把单卡最大上下文窗口做到 256K,同时把输出质量损失压到最小。

来自 /u/Adorable_Weakness_39 的提交 [link] [comments]

本页为站内快照,仅作聚合阅读;内容来自公开网络,版权归原作者所有。