大模型推理:KV Cache 字节数 × 访问步数这个乘积如何决定性能
搬家的时候你会发现一件反直觉的事:真正累人的不是搬那几件大家具,而是来来回回跑楼梯。家具只搬一趟,楼梯要跑几十趟。大模型推理里也有这么一段楼梯——它叫 KV Cache,你每吐一个字,就要把整段对话历史从显存里重新走一遍。这段状态是整个推理引擎里最不起眼、也最贵的东西。它决定了你的服务能同时接多少人,决定了第 40 轮对话为什么比第 1 轮慢四倍,也决定了那些看起来很玄的优化——PagedAttention、RadixAttention、GQA、MLA、FP8 KV、FlashDecoding、chunked prefill——为什么归根到底都在做同一件事。这些名字听着五花八门,拆开看,它们优化的其实是同一个乘积。这条链能一路拆到 HBM 带宽和 roofline 的交点,拆完你手里会多出一套判断:哪些优化对你这套负载真正有效,哪些是别人的场景里有效、搬到你这儿是净亏——包括我最推荐那条路子自己的软肋在哪。这一路会有点绕,公式、源码、显存布局都会出现,但每一步我都会先让代码跑起来,用观察到的数字倒推机理,不靠记结论。1. 从一次越聊越慢的现场说起先看一个我见过很多次的现场。八卡 H100、Llama-3.3-70B、同一套服务参数,一个客服会话开着不动,用户一轮一轮往下聊:轮次 历史 token 数 单路输出速度 本路 KV 占用(八卡合计) 1 420 34 tok/s 131 MiB 5 3 100