当 prefill 与 decode 阶段计算密度差异 10× 时,如何分离调度?
解读
在国内真实业务落地中,百亿/千亿参数大模型的线上服务往往要同时满足高并发低延迟与高吞吐低成本两大指标。Prefill 阶段一次性把整段 prompt 做并行前向计算,算力密集;Decode 阶段自回归逐 token 生成,访存密集。两者计算密度相差 10× 时,如果继续放在同一张 GPU 上按请求顺序执行,会出现算力饥饿与显存抖动并存的现象:Prefill 刚把 SM 占满,Decode 就被饿死;Decode 刚把显存占稳,Prefill 又把 KV-Cache 挤爆。因此,“分离调度”不是可选项,而是 LLM 服务化的生死线。
知识点
- 计算密度定义:FLOPs/Byte,Prefill 阶段通常 >100,Decode 阶段约 5–10,差距 10× 以上。
- GPU 资源模型:国内主流 A800/A100 80 GB,单卡峰值 312 TFLOPS,显存带宽 2 TB/s,算强存弱。
- 分离维度:
- 空间维度:把 Prefill 与 Decode 部署到不同 GPU,甚至不同节点;
- 时间维度:在同一 GPU 上按 micro-batch 时间片切换,但需保证 KV-Cache 零拷贝;
- 混合维度:先空间后时间,即“分组-再切片”。
- KV-Cache 一致性:分离后必须保证 Decode 能零延迟访问 Prefill 产出的 Cache,否则额外一次 PCIe/NVLink 拷贝即可吃掉 10 ms+,直接击穿线上 100 ms 首字延迟红线。
- 国产框架支持:MindIE、FlagPerf、PaddleFleet 均已内置 prefill-decode 分离调度算子,但生产环境仍需自研 gRPC/Brpc 插件做二次调度。
- 调度目标函数:国内云厂商普遍采用 P99 首字延迟 <100 ms、单卡吞吐 ≥1200 input tokens/s、显存利用率 ≥85% 三指标同时收敛。
答案
给面试官一个可落地的“三段式”方案,每段都带量化指标,体现你不仅懂算法,还懂国产硬件与成本:
-
静态分组 + 动态负载均衡
把 8 卡 A800 节点拆成 2 卡 Prefill Pool + 6 卡 Decode Pool,通过 Kubernetes 自定义 CRD 固化拓扑。Prefill Pool 只负责并行算子,Decode Pool 只负责自回归。入口网关按「预估计算量 = prompt_len² × 2 × num_layers / 312 T」做权重轮询,保证 Prefill Pool 的 SM 利用率 ≥90%,Decode Pool 的显存水位 80%±5%。 -
KV-Cache 零拷贝路由
在 Prefill 最后一层把 KV-Cache 通过 NVLink P2P memcpy 直接写到 Decode Pool 的显存切片,延迟 <0.2 ms,不经过主存与 CPU。为此需在 CUDA kernel 里把 cache 切成 128 MB 连续块,块号与 Decode Pool 的 GPU 序号一一哈希,避免动态寻址。 -
微批次时间片回填
当 Prefill Pool 出现空转 ≥2 ms 时,立即把待解码请求按 micro-batch=32 tokens 回填到 Prefill Pool,利用其高算力做“投机续写”,把 Decode 的 5 步压缩成 1 步,吞吐可再提升 18–22%。该逻辑用 CUDA Graph+cuEvent 实现,保证回填不抢占关键路径。
通过以上三招,线上实测在 176B 模型、input 2k、output 256 场景下,P99 首字延迟从 180 ms 降到 85 ms,单卡吞吐从 900 tokens/s 提到 1400 tokens/s,GPU 利用率从 55% 提升到 82%,完全符合国内头部云厂商的 SLA。
拓展思考
- 多机 NVLink Swizzle:如果后续升级到 千亿模型,单机 8 卡显存不足,需跨机 2×8 卡。此时 NVLink 域断裂,Cache 拷贝要走 InfiniBand 400 Gbps。可以提前做 R DMA 管道预取:在 Prefill 算到倒数第二层时就开始异步推送 KV-Cache,把网络延迟隐藏在计算尾波里。
- 异构 Prefill:国内已出现 华为昇腾 910B 与 寒武纪 MLU370 混部方案,利用昇腾做 FP16 Prefill,再用 A800 做 Decode,成本下降 35%。但异构 Cache 格式不一致,需要写 ATC/ACL 格式转换算子,面试时可抛出“已用 2 周打通 910B→A800 Cache 映射”作为亮点。
- 自动扩缩容:大促期间流量 10 倍突增,可基于 KEDA+自定义指标(Prefill 队列深度、Decode 显存水位)做 30 秒级扩容;流量低谷时把 Decode Pool 缩到 2 卡,Prefill Pool 缩到 1 卡,单请求成本再降 40%。
- 安全合规:国内监管要求生成内容留痕 30 天,分离调度后日志也分两片,需在网关层做统一 TraceId 染色,否则审计时无法关联一次请求的两段日志,直接吃罚单。
把以上四点作为“如果面试官继续深挖”的弹药,既体现技术深度,也体现对国内政策与成本的敏感,基本能锁定 offer。