大模型推理 KV Cache 量化与显存压缩落地

日期:2026-08-13

一、项目背景

我们在一个私有化项目里部署了一款七十亿参数级别的对话模型,一开始跑得挺顺,直到客户把长上下文会话场景铺开,问题就来了。并发一高,显存直接被 KV Cache 吃满,新请求只能排队,P99 首字延迟肉眼可见地涨。客户当时提的需求很直接:不加卡,把并发顶上去。我们一度想当然去压模型权重,换了更激进的权重量化,结果精度掉了、显存也没省多少,反而把问题搞复杂了。后来复盘才发现,长上下文下 KV Cache 才是显存大户,权重那点占用相比之下根本不是瓶颈。这个项目也让我们重新理解了交付基线的制定方式,不能再凭经验拍,得先 profiling 再定方案。

二、落地场景

我们用 vLLM 风格的推理框架,在模型服务化层做了两件事:一是给 KV Cache 上 INT8/FP8 量化,把每份缓存的位宽压下来;二是引入分页缓存思路,把显存切成固定块,请求之间按需分配和复用,减少碎片。连续批处理保持不变,但缓存分配改成按页调度。交付形态是推理一体机,客户在信创环境里跑,监控接 Prometheus,能直接看到单卡并发和显存占用曲线,运维第一次能定位到"是不是缓存顶满了"而不是瞎猜。

三、关键技术挑战与解决思路

量化后精度回退是第一道关。我们一开始把 KV Cache 直接压到 INT4,长文本摘要开始丢关键信息,召回掉了几个点。退到 INT8 才稳住,精度回退控制在可接受范围内。长序列的显存碎片比预想严重,早期按请求整块分配,并发一多就出现"明明有空闲显存却分配不出"的假溢出。分页缓存把块切小后这个问题基本消失。并发峰值显存超卖是个取舍,我们设了软上限,超过就触发排队而非硬崩,宁可延迟升一点别让服务挂。连续批处理要和新缓存调度协同,否则批里某个长请求把缓存占满,短请求被拖死,我们加了缓存占用加权,长请求优先走慢队列。还有个容易忽略的点:量化算子的选型,不同推理框架对 INT8 KV Cache 的支持成熟度不一,我们在交付前专门验证过算子路径,避免某条分支悄悄走了浮点回退。

缓存淘汰策略我们选了按块 LRU 而不是全局 FIFO,原因是长会话的头部上下文不能因为尾部挤占被丢掉,否则长文总结会断片。这个细节上线初期没在意,出现过一次长文档总结前半段丢失,定位到淘汰策略后改成按块保活才稳。还有一个工程细节:分页缓存的块大小调过一轮,十六太小导致元数据开销大、三十二又浪费显存,最后折中到十六并配合预分配,既控开销又不碎。这些看着小,但在高并发长上下文下每一项都会放大成显性故障,调优时一个都不能潦草。

案例片段(已脱敏): 某客户单卡原配置长上下文会话并发卡在约二十四路。开启 KV Cache INT8 量化加分页缓存后关键配置如下:kv_cache:  dtype: int8  paged: true  block_size: 16  max_concurrency_soft: 48  evict_policy: lru_block压测下并发从二十四路提到约五十二路,显存占用下降约四成,P99 首字延迟在四十路以内基本持平,超过软上限后延迟缓升但未出现服务中断。

四、效果数据

单卡并发从约二十四路提到五十路上下,提升一倍多,客户不用加卡就扛住了业务量。显存占用下降约四成,同样显存能多驻留长上下文会话。P99 首字延迟在软上限内基本持平,超过后缓升不崩,比之前直接排队友好。精度回退幅度在 INT8 下控制在百分之一以内,长文本摘要任务人工抽检无明显退化。缓存碎片导致的假溢出从日均数次降到零。这套配置后来成了我们私有化交付的默认基线之一,新项目 profiling 第一步就是看 KV Cache 占用占比,占比高就先上量化再谈别的。

这套显存压缩还有个连锁好处:同样一体机能同时驻留更多长上下文会话,客户顺势把多轮对话的上下文窗口从八千拉到三万,没加卡。我们顺手做了个显存水位告警,缓存占用到七成就提前排队,避免瞬时冲高把服务打挂,运维说这是第一次能"看见"缓存而不是等崩了才知道。压测里还有个细节:INT8 量化后首字延迟在中等并发反而略降,因为缓存访问带宽压力小了,这个副作用我们一开始没预料到,算是量化带来的额外彩头。不同模型换上来时我们都会先跑一遍同样的 profiling,把显存占用拆解成权重、缓存、激活三块,哪块是瓶颈一目了然,方案不再凭感觉定。

五、可复用经验总结

这个项目的教训很实在:长上下文下先量 KV Cache 再动权重,我们当初本末倒置,白折腾一轮。量化别一上来压最狠,INT4 看着省显存,精度回退的代价往往比那点显存贵。分页缓存解决碎片比任何"调大显存"都管用,假溢出的问题根因是分配策略不是容量。软上限加排队比硬超卖稳妥,服务不中断比延迟低点更重要。那个量化算子走浮点回退的坑,让我们此后交付前必做算子路径验证,不然后面定位能查到怀疑人生。这套显存压缩基线现在是我们推理一体机的出厂配置,但不同模型对量化的敏感度不一样,换模型时建议先小流量灰度看精度,别直接套默认。