KV缓存 · 连续批处理 · 推理加速
大模型生成是「自回归」:一个token一个token往外蹦。每蹦一个,要把整段序列再过一遍attention。
attention的公式是 Q × Kᵀ / √d → softmax → × V。生成第t个token时,Q只有1个(当前位),但K、V要包含前面所有token。如果不缓存,每生成一个新token,前面t-1个token的K、V都得重算——这就是朴素推理的O(n²)灾难:序列越长越慢,第100个token比第1个慢约100倍。
KV缓存的本质:把每层每头算过的K、V存进显存,下一步直接拼上新的那一个。计算从重算历史变成只算增量。代价是显存——KV缓存随序列长度线性增长,长上下文模型一大半显存都被它吃了。
点「生成下一步」,看朴素推理(每步重算所有K、V)和KV缓存(只算新增那一个)的计算量差距。序列越长,差距越大。
光有KV缓存还不够——单请求喂不饱GPU,算力浪费在等待上。
静态批处理(一次凑齐N个请求一起跑)的痛点:请求长短不一,短的跑完得等长的,GPU空转。连续批处理(continuous batching)的解法:请求随时进、随时出,一个请求生成完立刻让位给排队的新请求,每一步都把batch填满。ORCA论文里叫 iteration-level scheduling。
等满N个才开工,短请求等长请求,GPU空转多。
请求动态进出,每步batch都满,吞吐最大化。
一次只服务一个用户,GPU利用率常低于30%。
多请求共享一次前向,单token成本摊薄。
组合拳:KV缓存(省计算)+ 连续批处理(填满GPU)+ PagedAttention(省显存碎片,下期讲)= vLLM 比 HF Transformers 快 14~24倍。这是为什么线上大模型服务几乎都跑在 vLLM/TGI/TensorRT-LLM 上,没人裸跑 HF。