单张 RTX 3090 上运行 4 个编程智能体:使用为 Qwen3.8-27B 定制的 CUDA 引擎,总吞吐量约为 290 tok/s(是 llama-server --parallel 的 3–4 倍)
摘要
OpenJet 的新版本在单张 RTX 3090 上通过自定义 CUDA megakernel 引擎并行服务最多 4 个编码代理,总吞吐达约 290 tok/s,是 llama-server --parallel 的 3-4 倍。核心思路是每步将所有活跃代理的工作堆叠成一个批处理,权重只读一次并用张量核同时处理所有行。
我一直在开发 OpenJet,这是一个本地编程智能体,为 Qwen3.8-27B Q4_K_M 配备了自有的 CUDA 巨型内核引擎。此前,它一次只能处理一个对话。新版本可以在单张 GPU 上同时运行多个智能体。https://reddit.com/link/1xgs8hp/video/p0zd2rxse0yh1/player 性能数据(RTX 3090,Qwen3.8-27B Q4_K_M):每个智能体的表现 llama-server --parallel 4 OpenJet --agents 4 解码,短提示词 18-20 tok/s 64-72 tok/s 解码,每个智能体有 23K 上下文 15-16 tok/s 52-55 tok/s 在这些上下文上处理下一次请求的首个 token 延迟 13.4 秒 0.2-0.5 秒 处理一个 20K 提示词时,另一个智能体的解码速度 0.6 tok/s 9.5 tok/s 也就是说,4 个智能体的总吞吐量为 256-288 tok/s,而 llama-server 的总吞吐量为 72-80 tok/s。单独运行一个智能体时,仍可达到 117 tok/s。4 个实际编程智能体会暂停生成来运行工具和测试,它们的总吞吐量为 150-200 tok/s。并行解码的工作原理:在 GPU 上生成 token 受内存带宽限制。每个解码步骤都要从显存中读取全部 16.7 GB 权重,在 3090(936 GB/s)上,光这一步就需要大约 18 毫秒。相比之下,对这些权重进行的数学计算量很小。因此,引擎不会逐个运行智能体。在每一步中,它会将所有活跃智能体的工作堆叠为一批数据行:每个智能体的下一个 token,加上它的 2 个 MTP / 提示词查找草稿 token,因此 4 个智能体共有 12 行。引擎只将权重流式读取一次,每个载入的权重在仍位于芯片上时,就会通过张量核心与全部 12 行进行乘法运算。4 个智能体每一步的权重读取开销大约相当于读取一次,而非四次。这就是为什么每个智能体的速度会从 117 降至 64-72 tok/s,而不是约 30 tok/s:共享的权重读取占据了每一步的大部分开销。随着智能体数量增加而增长的,是注意力计算(每个智能体读取自己的 KV 缓存)以及额外数据行的计算量。整个步骤在一个持久化 CUDA 内核中运行,无需逐层启动内核,草稿也在同一遍处理中完成验证,因此每个被接受的草稿 token 都是同一次权重读取带来的额外 token。在实际智能体场景下保持高速度的机制:新提示词不会让其他智能体停下来。当某个智能体发送新提示词时,每一步都会将该提示词的下一个分块与其他智能体的数据行一起处理,因此在处理它的同时,其他智能体可以继续生成。结果与单独处理该提示词时逐比特一致。一个共享的 132K token KV 池(q8_0)。它采用分页管理,因此当其他智能体的上下文较短时,一个智能体可以使用其中的大部分空间。没有固定的 4 x 32K 划分。共享的系统提示词只存储一次。如果智能体共有的系统提示词加工具列表达到 1024 个 token 或以上,就只会为所有智能体统一处理和存储一次。对话始终保留在各自的槽位中。后续请求会回到已经保存该对话的槽位,因此只需处理新增的 token。其他新功能:采样式 MTP 草稿(感谢 iiLaurens):当温度 > 0 时,现在会从草稿头采样生成草稿,并通过拒绝采样进行验证。输出分布保持不变,同时有更多草稿被接受。mk_top:在终端实时显示每个智能体的 tok/s、上下文使用量、当前任务和最新输出,以及 GPU 统计信息。mk_top --run 4 会启动服务器和 4 个执行评测任务的智能体,方便你观察它们的运行情况。准确性:由于算术运算顺序不同,输出与 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 API 的智能体连接到 http://127.0.0.1:18080/v1。限制:仅适用于 Q4_K_M 引擎(混合量化版本一次只能处理一个对话),最多支持 8 个智能体,并且会忽略存在惩罚和重复惩罚。代码仓库:https://github.com/l-forster/open-jet 我还计划接下来添加对 TurboQuant 的支持,以便在单张显卡上将最大上下文窗口提升至 256K,同时尽量减少输出质量下降。
相似文章
双3090配置:Qwen 3.6 27B 上从 400 pp tokens/s 提升到 1600 pp tokens/s... 但 tps 略降。
使用双 RTX 3090 配置的用户发现,llama.cpp 的 `--split-mode tensor` 会在 CPU 上运行提示处理(约 400 t/s),而切换到 `--split-mode layer` 则可解锁 GPU 提示处理,速度超过 1600 t/s,且 token 生成速度仅略有下降。
两块RTX 4090实际能同时运行多少个代理?三周的llama.cpp并发数据——软上限5 @ 64k,硬上限9,以及原因。
关于在两块RTX 4090 GPU上使用llama.cpp并发运行多个AI代理的基准测试报告,揭示了性能限制和Qwen模型的最佳配置。
Qwen3.8-27B Q4_K_M 跑在单张 RTX 3090 上 + OpenCode:吞吐量、四项编码任务与一次推理预算失败
作者搭建了一套本地编码代理环境——在 24GB 的 RTX 3090 上通过 llama.cpp 运行 Qwen3.8-27B Q4_K_M,并接入 OpenCode——报告了吞吐量数据、四个有界 Python 编码任务(三项通过检查),以及一次推理预算失败:模型耗尽了 8K 的输出额度,却没能产出补丁。
如果你使用 Open Code 或其他代理程序,但没有并行使用代理,那么你会损失大量的 t/s。基准测试:RTX5090,通过 LM Studio 加载 Qwen3.6 35B,并行任务数设为 8
基准测试表明,在 RTX 5090 上使用 LM Studio 并行运行 4-5 个代理可最大化吞吐量,而更多代理会因显存和计算分割导致收益递减。
双RTX 3090 + EPYC主机运行qwen3.8-flash-next,速度约38令牌/秒
用户描述了一个硬件配置,包括双RTX 3090显卡和AMD EPYC CPU,用于运行Qwen3-Flash-Next模型(使用llama.cpp),单流推理速度达到38令牌/秒。用户寻求建议,是否应该添加第三块GPU或升级CPU以提高性能,特别是对于运行多个并行代理。