真实面经题目 · 原创解析
大模型推理变慢时,如何从序列长度、batch、KV Cache、量化、FlashAttention 和 GPU 资源排查?
这题考 LLM 推理性能诊断闭环。高质量回答应先定义慢在哪里,再拆分队列、prefill、decode、KV Cache、batch 调度、attention kernel、量化、GPU 利用率和服务链路,用指标定位瓶颈,而不是一上来堆优化名词。
真实面经题目 · 原创解析
这题考 LLM 推理性能诊断闭环。高质量回答应先定义慢在哪里,再拆分队列、prefill、decode、KV Cache、batch 调度、attention kernel、量化、GPU 利用率和服务链路,用指标定位瓶颈,而不是一上来堆优化名词。
我会先把慢定义清楚:是 TTFT 变高、每 token 延迟变高、吞吐下降、P99 变差,还是某些长 prompt 或高并发场景才变慢。然后按链路拆开排查。第一层看服务侧排队和调度,确认是不是请求堆积、batch 过大、动态 batching 等待时间过长或优先级策略导致。第二层拆 prefill 和 decode:prefill 主要受输入长度、attention 计算、FlashAttention 是否生效和显存带宽影响;decode 每步生成一个 token,更受 batch 内活跃序列数、KV Cache 读写、调度和采样开销影响。第三层看 KV Cache,确认是否命中 prefix cache,是否因为上下文过长、并发过高或显存碎片导致 cache eviction、分页开销或 OOM 回退。第四层看 batch 和序列分布,过小 batch 会让 GPU 吃不满,过大 batch 会增加排队和单请求延迟,长短请求混在一起也会造成尾延迟。第五层看模型和算子:量化是否真的用了高效 kernel,FlashAttention 或 fused kernels 是否匹配当前 shape、dtype 和硬件,是否存在 CPU 后处理或 tokenizer 成为瓶颈。最后用 profiler 和线上指标验证:GPU utilization、memory bandwidth、SM occupancy、显存占用、cache hit rate、tokens/s、TTFT、TPOT 和 P95/P99。修复后要做质量回归,因为量化、截断和 batching 策略可能改变输出质量或稳定性。
推理慢不是一个指标。TTFT 高说明首 token 前的排队、tokenize、prefill 或调度可能有问题;TPOT 高说明 decode 阶段逐 token 生成慢;吞吐低可能是 GPU 没吃满;P99 高可能是长请求、cache 抖动或调度不公平。先分症状,后面排查才不会乱。
很多慢不是模型算子慢,而是请求在队列里等。要看并发量、动态 batching 等待窗口、batch size、优先级、限流、流式响应 flush、上游重试和长短请求比例。若 TTFT 高但 GPU 利用率不高,可能是调度、tokenizer、网络或服务框架阻塞,而不是 attention kernel。
prefill 要处理完整 prompt,标准 attention 对序列长度非常敏感。prompt 越长,计算和显存越重,尤其多轮历史、RAG 长上下文、多图 token 或模板冗余会直接推高 TTFT。排查时要统计输入 token 分布,而不是只看平均值;少量超长请求往往决定 P99。
decode 每一步只生成新 token,但要读取历史 KV Cache,并对 batch 中未结束的序列反复调度。生成长度、停止条件、采样策略、batch 内长短不齐、beam 或多候选都会影响 TPOT。若输出很长,即使 TTFT 正常,用户仍会感到整体响应慢。
KV Cache 能避免重复计算历史,但它占用大量显存。要检查 prefix cache 是否命中,cache 是否因上下文过长或并发过高被频繁淘汰,paged cache 是否碎片化,GQA/MQA 是否降低了 KV 容量压力,以及显存不足时是否触发 offload、重算或更慢路径。
增大 batch 可以提高 GPU 吞吐,但会增加排队时间和单请求延迟。batch 太小 GPU 利用率低,batch 太大 P99 变差;长短请求混批还会让短请求等待长请求。需要区分吞吐目标和交互式延迟目标,用动态 batching、continuous batching、优先级和最大 token 预算平衡。
量化不一定必然更快,如果 kernel 不匹配、反量化开销大、batch/shape 太小或瓶颈在内存和调度,收益会很有限。FlashAttention 也要求 dtype、head dim、mask 形式、硬件和框架路径匹配。排查时要看实际 kernel trace,而不是配置里写了就默认生效。
GPU utilization、SM occupancy、memory bandwidth、显存占用、kernel 时间、CPU-GPU 同步、H2D/D2H 拷贝都要一起看。GPU 利用率高但 tokens/s 低可能是内存带宽或低效 kernel;GPU 利用率低可能是 CPU tokenizer、网络、调度、锁或 batch 不足。profiler 能把猜测落到证据上。
截短 prompt、改 batch、开启量化、换 attention kernel、调整 cache 策略都可能影响输出质量、确定性、OOM 风险和尾延迟。上线前要比较 TTFT、TPOT、吞吐、显存、错误率和任务质量,避免用质量或稳定性换表面速度。
优先查排队、tokenizer、prompt 长度、prefill attention、prefix cache 命中和动态 batching 等待时间。TPOT 正常说明 decode 路径可能没问题。
不一定。可能是 batch 太小、请求断续、CPU tokenizer 或后处理慢、网络 flush 阻塞、调度锁竞争、频繁 CPU-GPU 同步,也可能是服务限流让 GPU 等请求。
量化收益依赖高效 kernel 和合适 shape。如果反量化开销大、kernel 不支持、batch 太小、瓶颈在 KV Cache 读写或服务调度,延迟可能不降甚至上升。
不一定。FlashAttention 对长序列 prefill 常常更明显;decode 每步 query 长度很短,瓶颈可能转向 KV 读写、batch 调度或采样。需要分 prefill 和 decode 看 profiler。
可以按输入长度或预估 token 预算分桶,限制单 batch 最大 token 数,对短交互请求设优先级,使用 continuous batching,并对超长请求做单独队列、摘要或异步策略。