从一张到四张 RTX 4090:千亿模型从能单人用到能多人用,还赢了 vLLM 一局

一分钟看完:文中给出单卡 vs 四卡全量数据、四个反直觉的发现(切层不是 4 倍速、并发收益有条公式)、40 多次重启的调参弯路(一半候选被否),以及能力与稳定性验证;最后一场对手戏——同样的四张卡换成 vLLM 跑 27B:单看 Decode 它快 2.5–3.5 倍,但用户"首字 + 出完"的总等待,Strata 所有场景都更短。
先看结果
先给结论:还是单卡那篇的模型——Qwen3.8-Flash-Next 的 IQ3_XXS 量化版,125B 总参数、量化后 76 GB;显存从 24 GB 换成 4 × 24 GB 之后,96K 长文档首字 24 秒变 8 秒,10 路短问答聚合从 102 抬到 275 tok/s,256K 满档照跑。
Strata 的多卡方案是 pipeline 切层:48 层切成 4 段,每张卡跑 12 层,一个请求依次经过四张卡。下面这张表"四卡·同参数"是只换卡(其余参数与单卡一致),"四卡·全调优"是再叠加全部调优:

注:这张表的"四卡·全调优"是 10-27 调优轮的配置(6 槽 × 3 组、chunk 8192);10-28 最终配置改为 4 槽 × 4 组 + chunk 6144,下一节的数字是最终配置重测,所以两节的 Prefill/首字略有出入(96K Prefill 11,866 vs 12,935),以最终配置为准。
一句话:单卡是"能跑",四卡是"能用"——首字快 3 倍,10 个人同时用问题不大。
单流很快,并发不差
先统一三个词:Prefill(预填充)是模型"读你输入"的阶段,读完才吐第一个字,决定首字等多久;Decode(解码)是一个字一个字往外吐的阶段,决定出字多快;上下文是输入的长短,16K ≈ 1.6 万 token(约 2.5 万汉字),256K 就是把 96 GB 显存的四张卡喂到设计上限。单流是一个请求的引擎速率;并发是 15/30 个请求同时压上来,总输出除以墙钟(含排队)。当前配置:4 个并发槽 × 4 个流水组(每组 1 个槽),Prefill chunk 6144。

三个读法:
- 单流 Prefill 越长越快:16K 6,125 tok/s → 96K 12,935 → 240K 13,922。四段流水填满后,长文档几乎不掉速。
- 并发 Prefill 是串行的:15 路 16K 的聚合输入 6,534,和单流 6,125 同量级。加人不会让 Prefill 并行,只是排队。
- 并发 Decode 被摊薄:15 路 16K 总出字 47.6,每路约 60 tok/s;15 路 128K 每路只剩约 30。并发买的是"队伍前进快",不是"每人出字快"。
四个发现
1. 切层不是 4 倍速,单请求输出只快 1.8 倍。 四张卡顺序算完一个 token,总计算量没变。收益主要来自"专家不再缺页":40 GB 专家全部装进显存,命中率 100%(单卡 94–99%)。买四卡的正确期待是"首字快 3 倍 + 并发翻倍",不是"输出快 4 倍"。
2. 并发吃不吃到红利,取决于输出占比。 一条公式:并发收益 ≈ Decode 时间占比。 短问答几乎全是输出,10 路聚合 102 → 275,真并行;16K 文档 Decode 占 72%,3 组错开吃到 2.2 倍,聚合 10 路起平坦;128K 文档 Decode 只占 7%——一个 128K 请求 87% 的时间在串行 Prefill,分组能错开的只有那 7% 的 Decode 段,所以 3 路加到 30 路,聚合纹丝不动,纯排队。"多人同时读长文档"的真实体验是:排队快了 2.5 倍(33 秒/请求 → 13 秒),但同时出字的那几路只有 5–30 tok/s。
3. 最值钱的开关藏在官方文档里,默认关着。 STRATA_PIPED_CONCURRENT=1。不开它,任何一路读文档时,其它路的输出被压到几乎停摆(实测只剩 2–5 tok/s);开了之后保持 25–60+。对"边读长文档边出字"是 5–10 倍的体验差,成本是零。同类还有 KV_PREFETCH=1(四卡 Prefill 约 +3%,单卡 96K 是 +11%)。
4. MTP 草稿层不是自带的,四卡上单流 +46%、重并发买单。 量化包里没有草稿头,得从 BF16 checkpoint 自己抓 5.2 GB(做法单卡篇写过)。装上后四卡单流 182 → 260–274,长输出收益更大——单卡强制输出 900 token:112 → 217(+93%);代价是 10 路 16K 重并发 −6%。两个坑必须记:官方草稿词表只有 27 个汉字(总词表 5.5 万),不 --add cjk 重建词表,中文几乎不会被草稿命中,5 GB 白下;草稿层与 kv-grow 互斥,单卡那套"长上下文 Decode +6~19%"的老技巧不能同开。单人长文档无脑开,纯高并发文档服务可以关掉换回 5–7%。
专家全驻留 + 两条流水线
一句话:单卡省显存靠"把模型拆成三层缓存",四卡提速靠"40 GB 专家全塞进 96 GB 显存 + Prefill 和并发两条流水线"。
专家缓存:每卡 6,144 槽 × 4 卡 = 24,576 槽,40 GB 全驻留,不再走 PCIe
显存余量:每卡 2.6–5.1 GB(单卡时代是 440 MB 贴红线)
KV:每层 32,768 格常驻显存,其余在内存按需流式读
Prefill 流水:4 段,输入切块跨卡重叠;并发分组:4 组错开进流水线

后两项是引擎在多卡下自动开的——单卡想用要手动设,四卡白拿。单卡的调参公式是"24 GB 怎么分";四卡变成:每张卡 = 12 层的计算 + 6,144 个专家槽 + 槽位份额 + 保留。显存从贴红线变成富余,后面的槽位和缓存调整全靠这个空间。
调参:前后 40 多次重启
全部单变量 A/B、每轮先预热(冷缓存会把输出压低 20–30%,重启后第一轮数据都不能用)。
活下来的四项: 并发槽 3→6(短并发 +21%,与缓存、PIPED 叠加后 +32%);会话缓存 20 GB/8 槽(128K 会话不再被反复逐出重算;试过 32 GB 的会宕机,20 GB 是稳态);PIPED_CONCURRENT(见发现 3);MTP 草稿层(见发现 4)。
但 6 槽不是万能:3 路并发长输出时,6 槽反而输给 3 槽 42%(308 vs 217 tok/s)——槽位 ≈ 并发路数时效率最高。2–3 人固定用就配 3 槽,4 人以上再配多槽。
被否的五项: spec-min-p(16K 并发 −7%:无草稿层时它剪掉的是本会被接受的猜测);prefill auto:32768(Prefill −21%、并发 −44%、显存见底,全面负优化);8 槽 × 4 组(组数没变,白多花 3.5 GB);融合核(文档说 +21% 是 RTX PRO 6000 的数,4090 上 −14%);NUMA 拆分(输出反而 −6~26%)。
教训一句话:别人实测有效的参数,换硬件拓扑就可能反号。 我们引用的 4 个外部结论,2 个在 4090 上反号;官方文档说 pipeline-windows 在 NVIDIA 上 +16~21%,也被 MTP 互斥挡住,最终没开成。
两个后来补测出来的硬结论:
Prefill chunk 不是越大越好,四卡甜点是 6144。 单卡那篇的 12288 搬过来直接反号:32K 慢 14%、10×16K 慢 19%——四段流水本来按 8K 分块重叠,加大块反而破坏重叠。往下试 4096,长文档又掉 10%。落在 6144:32K +11%、10×16K +14%,96K 以上持平,代价是最紧一张卡显存少 0.9 GB。
15–30 人并发,4 个槽 × 4 个组就是最优。 槽(PARALLEL)是同时接几个请求,组(BATCH_GROUPS)是把这些槽分到几条流水上错开。实测八种组合:
| 配置(槽 × 组) | 15×16K 聚合(tok/s) | 30×16K 聚合(tok/s) | 15×128K 聚合(tok/s) |
|---|---|---|---|
| 4 槽 × 4 组(每组 1 槽) | 47.6 | 48.5 | 11.1 |
| 6 槽 × 6 组 | 45.0 | 47.3 | 11.0 |
| 6 槽 × 3 组 | 44.4 | 46.8 | 10.8 |
| 8 槽 × 4 组 | 38.3 | 41.2 | 11.1 |
| 6 槽 × 4 组(不整除) | 23.8 | 24.0 | 3.9 |
两条规则:组数必须整除槽数,不整除引擎直接回落成 1 组,并发腰斩;组数对齐流水段数才是吞吐——四卡四段流水,4 组刚好一段一组,槽加到 6、8 反而更慢。另外三个候选(spec 8、草稿层 4-bit、主卡换位)实测全是负结果,不折腾。
同样四张卡,换成 vLLM 跑 27B 呢
最后做个对手戏:同一台机器,停掉 Strata,用 vLLM 起 Qwen3.8-27B(AWQ-Int4,约 15 GB),张量并行 4 卡、同样 256K,同一套流式客户端测同一批场景。先把前提说死:这不是同一个模型(125B MoE vs 27B dense),是"同硬件、不同模型"的服务对比,不是引擎排名。
单流对比(Prefill 决定首字,Decode 决定出字):

vLLM 的 Decode 确实快 2.5–3.5 倍——27B 权重全驻显存。但用户体感不是这么算的。 用户等的是"首字 + 出完"的总时间:

三个读法:
- vLLM 快的是"首字之后"的 Decode:它的首字要等 4.8–92.5 秒(并发时 52–354 秒),Strata 首字快,总等待在所有场景都更短。按实测速度,16K 文档输出要超过约 770 个 token、240K 要约 1.7 万个,vLLM 的总等待才追平——短回答场景 Strata 体感完胜。
- 15×128K 差距最大:vLLM 的 KV 装不下 15 个 130K 会话,首字从 87 秒一路排到 570 秒;Strata 靠 4 槽 × 4 组把首字压在 13–164 秒,总墙钟 168 秒 vs 571 秒。
- 但模型差 4.6 倍大:Strata 跑的是 125B,vLLM 跑的是 27B。"四张卡跑哪个"首先是你要多大模型的问题。
能力和稳定性一分没丢
- 官方能力基准(冻结用例 + 严格计分,非 LLM 裁判):这套基准跑在单卡 + MTP 的最终配置上,12/12 全过——指令跟随、长上下文检索、工具调用各 4/4(四卡未单独跑)。Decode 快了这么多,能力测试一分没丢,这关不过前面所有数字都没有意义。
- 30 路 256K 洪峰一次灌入 780 万 token(约 1,260 万汉字),零失败、零告警。
- 55 分钟连续压测 1,440 个请求,零失败,延迟无漂移。
如何用
| 你的场景 | 建议 |
|---|---|
| 一个人,32K 以内短文档 | 单卡够用,省 3 张卡 |
| 一个人,96K+ 长文档 | 单卡 + MTP(首字 22–24 秒可接受) |
| 2–3 人固定共用 | 单卡够用;四卡配 3 个槽(并发路数少时 6 槽反而更慢) |
| 4–30 人 / 256K 满档 | 四卡 + 全套调优(本文配置) |
| 要 27B 级、长输出、批量出字 | vLLM 四卡:单流输出 544 tok/s,但用户总等待更长 |
切换用两个脚本(start-1gpu.sh / start-4gpu.sh),一条命令互相切,槽位、分组、chunk 自动设置。
边界: 单机单模型(IQ3_XXS 量化版);并发是合成请求,不是真实用户;vLLM 对比两侧模型不同、输出长度不同,聚合数不能直接横比;每卡效率降到 73% 是切层方案的物理边界,调参解决不了。
抄作业: 先开零成本的 PIPED_CONCURRENT 和 KV_PREFETCH,再把 Prefill chunk 定到 6144、并发配 4 槽 × 4 组,最后装 MTP(它吃显存预算,装完要重看中小文档的首字)。
三句话: 多卡买的是"不排队"和"首字快",不是线性吞吐;收益最大的两件事都不在参数表里(默认关的开关 + 自己抓的草稿层);每一项都要自己测——单卡的 12288 到四卡反号,甜点变 6144。
当前四卡参数:
| 项目 | 参数 |
|---|---|
| 显卡 / 并发 | GPUS=1,2,3,4、PARALLEL=4、BATCH_GROUPS=4、STRATA_PIPED_CONCURRENT=1 |
| 上下文 / Prefill | --max-context 262144、--kv int8、PREFILL=6144 |
| KV | --kv-resident 32768、KV_GROW=0、STRATA_KV_PREFETCH=1 |
| 显存 | --expert-cache auto、--vram-reserve-mib 700 |
| 草稿层 | --mtp、--spec 4、--spec-min-p 0.5、--add cjk(建词表时) |
| 会话 / 视觉 | 会话缓存 20000 MB / 8 槽、视觉走 CPU(300 token/图,0 显存) |
测试环境:4 × RTX 4090 24G(GPU1–4 切层,GPU0 单卡对照),AMD EPYC 9354,504 GB 内存;Strata 0.2.6(Terminal build 0.1.51 / Engine 0.1.50)。vLLM 对比(同机 4 × 4090、TP4、Qwen3.8-27B AWQ-Int4、256K),同一流式客户端。单流速率以引擎 /metrics 为准,并发聚合与 vLLM 对比为客户端墙钟口径。
浙公网安备 33010602011771号