一张 RTX 4090 跑千亿模型,Strata 实测 155 tok/s

先看结果
结论:125B 总参数(IQ3_XXS 量化后 76 GB 权重)的 MoE 模型,240K 上下文可用,短/96K 单流 155 tok/s;但 3 槽配置下第 4 个人开始排队。
使用 Strata 推理引擎,模型是 Qwen3.8-Flash-Next 的 IQ3_XXS 量化版:125B 总参数,每次激活约 6B;量化后 76 GB,其中专家权重约 40 GB。机器是 2 × EPYC 9354(128 线程)+ 192 GB 内存。
最终配置:256K 上下文、KV int8、--batch 3、MTP 草稿层、STRATA_KV_PREFETCH=1、PREFILL=12288。
| 指标 | 单卡·全调优(推荐配置) |
|---|---|
| Prefill @ 32K / 96K / 240K | 4,627–4,688 / 4,636 / 4,449 tok/s |
| 首字 @ 32K / 96K / 240K | ~7 / ~21 / ~55 s |
| Decode 单流(短) | 155 tok/s |
| 显存余量 | 438 MB / 24,564 MB |
| 专家缓存 | 13.67 GB / 8,445 槽 |
基线(10-26,无 MTP、auto 8192)作对照:Prefill 4,050–4,210 / 4,107 / 3,790,首字 8 / 24 / 65 s,Decode 96–108,专家缓存 14.67 GB / 9,057 槽。全调优后 Prefill 高 10–17%,首字快 1–10 秒。
一句话:长上下文能读、能写,速度不慢,但多并发长上下文速度掉很多。
四个发现
1. 长上下文不掉速。 32K 到 240K 的 Prefill 基本是一条直线(4,449–4,688 tok/s),240K 仍有 4,449;4K 档因为约 0.5 秒固定开销只有 2,569(基线;开 MTP 后约 2,329)。原因是 KV 只把 32,768 / 262,144 个 cell 常驻显存,其余 3.09 GB 在锁页内存按需流式读,KV 读命中率 96–98%。
所以 256K 是配置上限;实测到 240K,没有断崖。
2. 并发收益取决于输出占比。 这里 Prefill(预填充)是读输入、决定首字;Decode(解码)是出字、决定速度。墙钟是从请求发出到最后一个 token 的真实耗时,包含排队 + Prefill + Decode;Decode 时长口径只算生成阶段。无草稿层基线:3 路墙钟 112 tok/s(Decode 时长口径 135),5 路/10 路都是 102 tok/s,超过 3 路后总吞吐不再增长;10 个 16K 同时来,每路只有 11 tok/s,最后的等 50 秒。拆开看,Prefill 是串行的(首 token 间隔约 5 秒),Decode 才是 3 路并行。

图里场景后的秒数是该路总耗时;TTFT 单流短问答约 0.5 秒,3 路短并发 0.6–1.7 秒,10 路短并发 0.4–14 秒,10×16K 3.7–48 秒。5 路短并发当时没单独记录逐请求首字,表里标 —。
开 MTP 后要分场景:
- 16K ×3:墙钟 18.4 → 17.3 秒,每请求 Decode 19/16/96 → 24/21/161;
- 10×16K:墙钟 50.4 → 59.8 秒;每路输出从约 95 加到 128 token,Decode 聚合不能直接横比;
- 短问答 ×3:墙钟 5.9 → 6.5 秒,每请求 Decode 44–58 → 38–51,聚合 −29% 主要是输出更短。
16K ×3 墙钟略快,10×16K 因输出变长而变慢;短问答 ×3 受损。并发收益要看输出占比,不能只看 Decode 聚合。
3. 识图不占显存。 把图片读取器放 CPU,每张图固定 300 个视觉 token(约 350 prompt token),编码器 0 显存;代价是新图多等约 2 秒。对文本吞吐影响在 ±5% 内,一张合成验收单三项全对,常规版式可以试。
4. 官方量化包没带 MTP。 About 页写着 “MTP drafts up to 3 tokens”,但量化版 GGUF 里根本没有草稿头——引擎一直在用 lookup 猜。我们后来自己装了草稿层,Decode 从 ~100 涨到 155;具体见后文。
如何做到:三层存储
一句话:它不把模型塞进显存,而是把模型拆成三层缓存,利用 MoE 的稀疏激活,让每个 token 只碰它真正需要的那一小部分权重。

图:一个 token 只碰它需要的专家;图里 24 GB 显存的 61% 是专家热缓存,这是无草稿层基线。MTP 终态专家缓存 13.67 GB / 8,445 槽(57%),未命中的 1–4% 走 PCIe 从 192 GB 内存取。
这台机器实际用到的是“显存 + 内存”两层:显存里是 13.67 GB / 8,445 槽的热缓存(图里 14.67 GB / 9,057 槽、61% 是无草稿层基线;开 MTP 后为 13.67 GB / 8,445 槽、57%),内存里是 39.97 GB 全部专家 + 3.09 GB 溢出 KV + 最多 20 GB 的会话缓存(20,000 MB 预算,当前约 2 GB);SSD 是兜底。76 GB 模型总量里专家约 40 GB,其余是 PLE 表、dense 和词表。
实测占用(当前 256k + MTP):
显存:23.4 / 24.0 GB(余量 < 1 GB)
主机内存:62.8 GB / 192 GB 上限
会话缓存:约 2 GB(预算 20 GB)
MoE 每层有 512 个路由专家,token 只激活 10 个,另加 1 个共享专家;跨层“层号 + 专家号”共 24,576 个身份,每个约 1.7 MB。命中显存的直接算,没命中的走 PCIe 从内存取;实测命中率 94–99%,PCIe 取数只占 1–4%。
一个公式看懂所有调参:24 GB = dense + KV 常驻 + prompt 缓冲 + N × 0.95 并发槽 + 专家缓存 + 700 MB 保留。
专家缓存“吃剩余”:任何一项变大,它就变小,命中率下降,Decode 变慢。prompt 缓冲和专家缓存共享预算(无 MTP 时 14.67 GB 是划走 4.25 GB 后的余额;开 MTP 后约 13.67 GB);减槽不会让剩余显存变多,因为 auto 会立刻填满。
踩过的两个坑
坑一:调高 KV 常驻,没有变快。 看到 3 路 16K 并发时两路只有 16–19 tok/s,我们以为 KV 常驻窗口装不下 48K 工作集,把 kv_resident 从 32,768 调到 65,536。第一次对比 Decode 从 19.3 掉到 15.0——但那是刚重启的冷缓存(命中率只有 73–88%)。
预热后重测,两路仍是 16.0/15.9,和 32,768 的 16.1/19.0 没有可测差异,专家缓存却少了 1.55 GB。假设被证伪:瓶颈是三个槽共享同一张卡的解码窗口,不是 KV 流式读;最后独占的那一路会回到 96 tok/s。
坑二:冷缓存会骗你。 任何 A/B 测试,重启后的第一轮都不能用。冷缓存会把 Decode 压低 20–30%,很容易得出“调参把性能搞坏了”的结论。后面所有对比都先预热 3 组,只用热缓存数据。
加个草稿层
上面优化以后,最大的遗憾就是 Decode 只有 ~100 tok/s。MTP 草稿层官方支持直接下载:跑 strata launch --mtp on,就会拉 5.2 GB 草稿层,不用自己拼。
如果走离线手动路径,还有一个坑:run config 里的 "mtp": false 会被 launcher 当成“关掉”,每次启动剥离 --mtp;正常 strata launch 不会补写 --mtp <folder>,只有 adopt/setup 会。我们是手动把 /data1/mtp/rt 写进 run config 的 args 才生效。草稿头本身只占约 184 MB,但草稿层/词表/缓冲合计约 1 GB,专家缓存从 9,057 缩到 8,445 槽(−7%)。装好之后:

注:表里是每路 Decode;墙钟总出字(总输出/真实耗时,含 Prefill 排队)在表注里单列,别和 155 tok/s 的 Decode 混。
三个坑:
- 直接下载只解决权重,草稿词表还是官方那份 5.5 万 token 子集,只有 27 个汉字。 不重建词表(
--add cjk,建草稿词表时),中文几乎不会被草稿命中——5 GB 白下。 - 装了草稿层,
kv-grow就不能同时开(引擎互斥)。之前“长上下文 Decode +19%”的技巧作废。 - 3 路短并发墙钟 5.9 → 6.5 秒(+10%),每请求 Decode 44–58 → 38–51(−8–13%);墙钟总出字 −29% 主要是输出更短。单人流(尤其长文档)是赢家;短问答 ×3 是输家,×5/×10 基本持平(−7%/+5%)。
MTP 单开时 Prefill 基本无损。 4K 有一次测量低约 9%(2,569 → 2,329),但 4K 固定开销占比大,单次不足以当结论;16K/32K/96K/240K 都在基线波动内(32K 基线本身 3,808–4,211,MTP 3,919)。最终配置叠加 STRATA_KV_PREFETCH=1 + PREFILL=12288 后,32K 4,627–4,688、96K 4,636、240K 4,449,全面高于基线。
顺手还捡了一个开关:STRATA_KV_PREFETCH=1,96K 文档的 Prefill +11%(24.4 → 21.9 秒),Decode 无损。再叠加 PREFILL=12288,96K 首字约 21 秒,240K 约 55 秒。
Prefill chunk 单卡甜点是 12288。 auto 8192 → 固定 12288:32K 4,198 → 4,627–4,688(+10–12%)、96K 4,424 → 4,636(+4.8%)、240K 4,258 → 4,449(+4.5%);Decode 不变。16384 不更好(32K 只有 +4%,10×16K 略慢)。四卡是 6144,别混用。
外站参数实测:四项都没收益。 k8v4 Prefill 约 −7%、并发墙钟 +3.6–5.4%;spec-min-p 0.7 + prompt-cache-every 8192 再慢 2%;PARALLEL=4 比 combo 专家缓存少 885 MB、Prefill −9%。单卡维持 int8 / P=3 / spec-min-p 0.5 / prompt-cache 默认。
最关键的一关:官方 strata bench run 的 12 项 sanity(指令/检索/工具各 4)全过——冻结用例、严格精确匹配,不是 LLM 裁判;未做 MMLU/困惑度等全面质量回归。Decode 快了 55%,sanity 一分没丢。
怎么用
适合: 一个人读长文档(96K 文档约 21 秒出字,追问 2–3 秒);离线批处理;识图单据(300 token/张,0 显存)。
不适合: 多人实时并发(3 槽配置下第 4 个人开始排队);在线客服式低延迟(10 路最慢 16–50 秒)。短问答为主、2–3 人同时用时,MTP 下 3 路墙钟反而慢 10%,建议 P=1/2 或 --mtp off。
边界: 单机、单模型(IQ3_XXS 量化版,不是 BF16);Decode 长测 150–230 token,128 token 短测已剔除;240K 只有 64-token 短测(154 tok/s),长输出未测;并发是合成请求,视觉只测了一张合成单据。本文只回答 Strata 在这张卡上能做到什么。
抄作业: 先测基线并预热 3 组;单卡开 MTP + --add cjk(建草稿词表时),再开 STRATA_KV_PREFETCH=1,并把 PREFILL 定到 12288(单卡甜点,四卡是 6144);长文档 1–3 人配 3 槽,短问答为主 P=1/2 或关 MTP;不要调高 kv_resident,显存贴红线时加 vram-reserve-mib。
三句话: 瓶颈是“显存怎么分”,同一张卡 MTP 开关差 55%(~100→155)、P=3 比 P=4 Prefill 快 9%;单卡的并发买不到线性吞吐,收益取决于输出占比;调参先预热再做 A/B。
当前单卡参数:
| 项目 | 当前单卡·全调优 |
|---|---|
| 显卡 | GPUS=0 |
| 并发 | PARALLEL=3 |
| 上下文 | --max-context 262144 |
| Prefill | PREFILL=12288 |
| KV | --kv int8、--kv-resident 32768、KV_GROW=0、STRATA_KV_PREFETCH=1 |
| 显存 | --expert-cache auto、--vram-reserve-mib 700 |
| 草稿层 | MTP=on、DRAFTING=mtp、--spec 4、--spec-min-p 0.5 |
| 会话 / 视觉 | CONVERSATION_CACHE_MIB=20000、VISION=cpu、--vision-tokens 300 |
注:
PREFILL=12288是单卡甜点,四卡用 6144;--spec 4在引擎 metrics 里显示 spec 6;启动器参数--mtp对应MTP=on/DRAFTING=mtp;--add cjk是建草稿词表时的参数。
测试环境:1 × RTX 4090 24G,AMD EPYC 9354,192 GB RAM;Strata 0.2.6(Terminal build 0.1.51 / Engine 0.1.50);Qwen3.8-Flash-Next IQ3_XXS(125B 总参数,量化后 76 GB 权重)。单流速率以引擎 /metrics 为准,并发聚合为客户端墙钟口径;两者不混用。
浙公网安备 33010602011771号