#模块五:推理优化、Serving 与部署工程知识点
推理优化不是把某个 kernel 换快这么简单,而是在「用户等待多久、单位 GPU 能服务多少 token、显存是否可控、质量是否下降、SLO 是否稳定」之间做工程权衡。面试里最容易暴露短板的地方,是只会说 KV cache、量化、batching、speculative decoding 的定义,却说不清它们分别作用在哪个阶段、改变了哪类瓶颈、又会把压力转移到哪里。
1. Prefill / Decode:先把推理拆成两段
Decoder-only 大模型在线推理通常分成 Prefill 和 Decode。Prefill 处理用户输入的 prompt:一次性把输入 token 送过模型,计算每层的 K/V 并写入缓存。它的矩阵规模大、并行度高,更像 compute-bound,直接影响首 token 前的等待时间。Decode 是自回归生成:每一步只输入上一个新 token,计算它的 Q/K/V,用新 Q 去访问历史 K/V,再采样下一个 token。它每步算量不大,但要频繁读权重和历史 cache,常见瓶颈是 HBM 带宽和调度开销。
所以,TTFT 主要由排队、prefill、首步 decode 和网络开销构成;TPOT 主要看 decode 阶段每个输出 token 的平均耗时。优化长 prompt 的首 token,要看 prompt prefill、prefix caching、chunked prefill 和请求排队;优化长答案的流式速度,要看 decode batching、KV cache 访问、量化、speculative decoding 和采样实现。把这两个阶段混在一起谈,后面的选型基本都会错。
2. KV cache:用显存换时间,也可能把显存打爆
KV cache 缓存的是历史 token 在每一层 attention 中算出的 Key 和 Value。没有它,生成第 t 个 token 时要反复重算前面 t-1 个 token 的表示;有了它,每步只追加当前 token 的 K/V,历史部分直接复用。代价是缓存随 batch、序列长度、层数、KV head 数和 dtype 字节数线性增长,粗略公式是 2 × B × Lseq × Nlayer × Hkv × Dhead × bytes。权重是常驻静态成本,KV cache 是请求态动态成本;并发越高、上下文越长、输出越长,越容易出现「模型权重装得下,但线上还是 OOM」。
降低 KV 成本的路线有几类。结构上,GQA/MQA 减少 KV head 数;内存管理上,PagedAttention 把 cache 切成固定 block/page,避免按最大长度连续预分配导致碎片和浪费;数值上,可以做 FP8/INT8 KV cache 量化,但它比权重量化更难,因为 K/V 是在线产生的激活,分布随 token 和层变化;策略上,可以限制最大上下文、做 prefix caching、滑动窗口、重要 token 保留或分层淘汰。好的回答要强调:KV 优化不只是省显存,也会影响带宽、调度复杂度和长上下文质量。
3. Batching、continuous batching 与 PagedAttention
Batching 的核心收益是提高设备利用率:把多个请求合在一起做矩阵计算,吞吐会上升。但它不必然降低单请求延迟,因为请求可能要等 batch 凑齐,短请求还可能被长请求拖住。静态 batching 适合离线或同长度任务;在线 LLM 服务更常用 continuous batching,也叫动态 batching:每个 decode step 后,已完成请求被移出,新请求可以插入,服务端持续维护一个活跃 batch,而不是等整批请求全部结束。
continuous batching 和 PagedAttention 是强耦合的。在线请求长度差异极大,如果 KV cache 必须连续分配,动态插拔会产生大量碎片;PagedAttention 像虚拟内存一样用 page 管理 KV,调度器只需要维护 token 到 page 的映射,就能更高效地复用显存。这里的面试重点不是背 vLLM 名字,而是讲清「动态调度提升 GPU 利用率,分页 cache 让动态调度可持续」。如果再叠加 prefix caching,多个请求共享相同 system prompt、工具说明或长文档前缀时,可以直接复用前缀 KV,显著降低重复 prefill 和 TTFT。
4. 量化与 speculative decoding:一个省带宽,一个改串行性
量化通过减少权重、激活或 KV cache 的字节数来省显存、降带宽、提高吞吐。权重量化常见在 INT8、INT4、FP8 等范围内做取舍,部署前可以离线校准;激活和 KV 量化更依赖运行时分布,通常更敏感。量化是否掉点,取决于模型规模、层敏感性、校准数据、任务容错度和 kernel 实现。不要把量化说成免费加速:它可能让显存更宽裕,也可能因为反量化、非最优 kernel 或精度损失抵消收益。
Speculative decoding 解决的是 decode 串行生成太慢的问题:用小 draft model 或额外预测头先草拟多个 token,再让 target model 并行验证。若草稿分布接近目标模型,多个 token 可在一次验证中被接受,TPOT 下降;若接受率低、生成很短、温度很高,或 draft 成本太大,收益会变小甚至负收益。它还会让 KV cache 回滚、page 对齐、动态 batch 调度更复杂,并且常常改善的是输出过程流畅度,不一定降低 TTFT。判断是否使用,要用真实业务流量测端到端延迟,而不是只看理论加速比。
5. 指标:TTFT、TPOT、吞吐、延迟和 SLO 要分开看
推理服务至少要同时看四类指标。TTFT 是从请求进入系统到首 token 返回,用户会把它感知为「是否卡住」;TPOT 是每个输出 token 的时间,用户会把它感知为「输出是否顺滑」;吞吐可以按 requests/s、tokens/s、output tokens/s 或 GPU 利用率衡量;端到端延迟则包含排队、鉴权、路由、prefill、decode、后处理和网络。SLO 应该写成 p95/p99,而不是只报平均值,因为线上体验常常被尾延迟决定。
典型折中是:增大 batch 通常提高吞吐但拉高排队延迟;缩小 batch 能保 TTFT 但浪费 GPU;prefix caching 降低共享前缀场景的 TTFT,但需要 cache 命中率、TTL 和隔离策略;投机解码可能降低 TPOT,却可能增加首 token 前的准备成本;大模型质量更好但单位 token 成本更高。因此系统需要 admission control、队列优先级、最大 token 限制、超时取消、模型分级路由和 fallback,而不是只追一个局部指标。
6. Prefill/Decode 分离、多租户与观测
Prefill/Decode 分离 是把两个瓶颈不同的阶段拆到不同资源池:prefill 节点更重视大矩阵吞吐和长 prompt 处理,decode 节点更重视低延迟、KV 常驻和持续 token 生成。它适合长 prompt、高并发、请求形态差异大的场景,可以缓解 prefill 把 decode 卡住的问题;但会引入 KV 传输、跨节点调度、cache 生命周期、故障恢复和容量规划复杂度。若业务请求短、并发低,强拆可能得不偿失。
多租户场景还要处理隔离和公平性:不同用户、模型、LoRA adapter、优先级和上下文长度会争抢同一批 GPU。服务端需要 quota、rate limit、队列优先级、租户级成本计量、请求取消后的 KV 清理,以及对 system prompt/prefix cache 的权限隔离。观测上不能只看 GPU 利用率,至少要打通 request_id 级 trace,记录 queue time、prefill time、decode steps、TTFT、TPOT、输出 token 数、cache hit rate、batch size、OOM、重试、取消、模型路由和错误码。没有这些指标,线上优化只能靠猜。
7. 常见误区
- 误区一:KV cache 只会提速。它本质是显存换时间,长上下文和高并发下可能比权重更先成为瓶颈。
- 误区二:batch 越大越好。大 batch 提吞吐,但可能增加排队和尾延迟,SLO 严格时要分优先级和快慢路径。
- 误区三:量化一定不掉质量。权重、激活、KV 的量化难度不同,校准数据和任务分布不匹配时会明显掉点。
- 误区四:speculative decoding 是通用加速器。它依赖接受率、输出长度、采样温度和实现开销,短对话未必划算。
- 误区五:只看 tokens/s 就能评估服务。用户体验更受 TTFT、TPOT、p95/p99、错误率和降级策略影响。
8. 复盘清单与追问链路
复盘一个推理系统时,先问请求画像:prompt 多长、输出多长、并发多少、是否流式、是否共享前缀、质量和延迟哪个优先。再问资源画像:模型多大、权重 dtype、KV dtype、GPU HBM、带宽、网络、是否多模型路由。然后分阶段看指标:排队、prefill、首 token、decode、后处理分别耗时多少;p95/p99 是否被长 prompt、长输出、冷启动、cache miss 或大租户拖高。最后看治理动作:batch 策略、PagedAttention、prefix caching、量化、投机解码、Prefill/Decode 分离、限流和 fallback 是否真的改善了目标 SLO。
面试追问通常会这样推进:先问 KV cache 是什么;接着问 prefill 和 decode 为什么瓶颈不同;再问 batching 为什么提吞吐但不一定降延迟;随后追 PagedAttention、continuous batching、prefix caching 如何协同;然后问量化为什么有时掉点、speculative decoding 为什么可能负收益;最后落到系统设计:给 7B、32B、70B 三档模型,如何做路由、多租户隔离、观测和降级。好的回答要始终围绕一条主线:先拆阶段,再找瓶颈,再用指标证明优化有效。