Skip to content

推理优化深入阅读

假设你接手的是同一个在线服务:模型已经能跑,但长 prompt 下首 token 明显变慢;并发一起来,生成速度又开始恶化;为了继续把 batch 和上下文往上推,团队开始尝试 cache 策略和量化,结果显存虽然省了,服务体验却不一定更好。

这条线最重要的是按暴露顺序判断:问题先出在哪一段,压下去以后瓶颈又转到哪里,最后哪些候选方案真的值得保留。

第一段:先确认是不是 prefill 问题

第一阶段最常见的症状是:短 prompt 还可以,一旦 prompt 拉长,TTFT 明显升高,但 decode 阶段单 token 速度还没完全坏掉。不要笼统说“模型太慢”,而是先把问题压到 prefill:

这里真正想确认的是:TTFT 升高是不是主要来自 attention 和 prefill,FlashAttention 或 chunked prefill 有没有空间,重复前缀是不是让无效 prefill 变多。第一个关键判断是:首 token 慢,不等于生成慢。

第二段:prefill 压下去以后,瓶颈转到 decode

团队把 prefill 调过一轮以后,经常会看到第二个问题:TTFT 下来了,但并发一高,TPOT 又开始恶化,generated tokens/s 还是不高。这时问题已经从 prefill 转移到了 decode loop 和请求组织:

这里最容易出现的误判是:只要引入 speculative decoding,吞吐就一定变高。真实情况更依赖 workload;如果请求短、并发低,复杂策略不一定值得,如果调度没排顺,单独换策略也未必真能把 TPOT 压下来。

第三段:吞吐还想继续上推,cache 开始决定边界

走到这一步,服务通常已经不是“完全跑不动”,而是开始被 KV cache 和调度边界卡住:batch 想继续往上推,但 peak memory 顶住了;cache 一边跑一边涨,decode 稳定性和并发一起变差。这时要把注意力切到 cache 管理和请求调度:

这里要分清:在推理优化里,我们先问的是 cache 怎样影响吞吐、并发和服务稳定性;如果核心问题已经变成“装不下”,再转去显存专题。

第四段:量化进入候选集,但不自动代表服务更好

当 cache、batch 和部署成本一起成为约束时,团队通常会开始引入量化。这里最危险的误判是:只要显存降了,就默认服务更好。这一步应沿量化部署线来判断:

这里真正要比较的是:这些方案改的是权重、KV cache 还是运行态张量;它们对 TTFT / TPOT / throughput / peak memory 的影响是否一致;当前服务目标更重在线交互还是更重离线吞吐。

第五段:最后回到同一 workload 做结论

前面几段都还是局部判断,真正做结论时,必须回到同一个 benchmark 框架里。核心收口页是:

真正的 benchmark 收口不是“这个方法更先进”,而是 accept / tune / reject:它是否适合当前 workload 和服务目标。把这条故事走完以后,一个更像真实交付的结论通常是:长 prompt 下先解决 prefill,随后瓶颈转到 decode 与调度,再往后是 cache 和量化共同决定服务边界,最终被接受的不是某个单点技巧,而是一组在同一 workload 下同时站得住的链路优化组合。

Released under the MIT License.