大模型KV缓存量化:RoPE路径被漏掉,同样误差伤害高出2到7倍
sina qqZone renren ydCloud 0

先抛个问题。
搬家收拾行李时,相机、首饰这类贵重物件得小心包裹,普通衣物随手一卷塞进箱子就完事,这两类东西你多半会用两套办法对付,一个拿泡沫纸一层层缠,一个直接团一团扔进去。
可要是有人跟你说“贵重也好普通也罢,统统按一个标准压缩打包”,你大概会觉得哪儿不太对。
这篇论文盯上的,正是大模型圈里被晾了很久的那个“统一打包”毛病。
**先把KV缓存弄明白**
想知道这篇论文要解决什么,先得搞清楚大语言模型是凭什么“记住”前文说过的话。
你向ChatGPT提个问题,它一个字一个字地往外吐。每蹦出一个新字,模型都得把前面所有内容再回看一遍,才能定下下一个字是什么。可每回都把前头全部内容重算一遍,实在太费。工程师们于是想出一招:把前面每个词算出的“键”和“值”存下来,下回直接取用,不必重算。
> KV缓存:大模型生成文字时,为避免重复计算,把此前每个词对应的“键”(Key)和“值”(Value)信息存下来、供后续生成直接调取的一块内存区域。
麻烦在于,聊天内容越长,这块缓存就胀得越厉害。聊得越久,缓存吃掉的显存越多,服务器能同时接待的用户就越少。这跟手机相册一个道理,照片越拍越多,占的地方越大,手机就越容易弹出“存储空间不足”。
为了省下这块内存,大家试过不少招,最直截了当的一招叫“量化”。
> 量化:把原本以高精度数字(比如16位浮点数)存放的数据,压成用更少位数(比如4位整数)来表示,存储空间因此大幅缩水,代价是引入一定的精度损失。
量化听着不难,无非“数字记得糙一点”。可糙到哪个份上才不出岔子,里面的讲究就多了。
**MLA架构引出的新问题**
论文把目光落在一类叫MLA的注意力机制上。
> MLA(多头潜在注意力,Multi-Head Latent Attention):DeepSeek团队提出的一种注意力机制设计,把多个注意力头共享的信息压成一个低维的“潜在”表示来存放,KV缓存的体积因此大幅缩小。DeepSeek-V3、Kimi K3、LongCat-Flash等多家主流大模型都采用了它。
MLA的巧处在于把缓存分成了两条路。一条是“内容路径”,存的是全部注意力头共用的压缩信息,这些信息之后要被拿来还原出每个头各自的键和值。另一条是“RoPE路径”,专放跟位置信息有关的键。
> RoPE(旋转位置编码,Rotary Position Embedding):一种让模型知道“这个词排在第几位”的技术,靠对向量做旋转变换来编码位置信息,眼下主流大模型普遍采用的位置编码方案。
两条路看着只是分工不一样,论文却挖出一件挺意外的事:业界现成的量化方案,几乎清一色只压内容路径,把FP8(一种8位的数字格式)用在内容缓存上,RoPE路径的键缓存反倒原样留在高精度BF16格式里。
这就像打包行李,大件家具都做了瘦身,那个装满小饰品的首饰盒却碰都没碰,理由说不定只是“没人认真琢磨过首饰盒该怎么压”。论文作者们打算把这个“首饰盒”翻开来看看。
**一样的压缩误差,伤害为何不同**
研究团队做了个挺直白的实验:往内容缓存和RoPE缓存里分别灌进同样大小的“误差”,再看这两种误差各自会让模型最终输出偏出多少。
这里有个术语得先交代。
> NMSE(归一化均方误差):用来衡量两个数值序列之间差异有多大的指标,数值越小说明两者越接近,常拿来评估量化压缩后的数据跟原始数据差了多少。
结果出人意料。团队测了从160亿到1万亿参数规模的六个主流MLA模型,在缓存误差一模一样的情况下(都压在1%的NMSE水平),RoPE路径导致的最终输出误差,比内容路径高出近2到7倍不等。
DeepSeek-V2-Lite上,RoPE路径的误差放大倍数到了6.33倍;LongCat-Flash-Lite上更高,6.86倍;放大倍数最小的Kimi-K2-Instruct,也有1.94倍。
这说明什么?原先大家觉得RoPE缓存"没那么要紧、可以先搁一搁",可它其实更娇气,是个碰不得的易碎品。压缩稍微狠一点,它回敬你的误差放大效应就比内容缓存重得多。还按"只压内容、放过RoPE"的老办法来,就像给普通衣物左一层右一层裹了三层泡沫纸,真正的易碎品反倒随手丢在箱底。保护策略本身没出错,是保护的重点整个弄反了。
**误差放大是怎么发生的**
"RoPE路径误差更大"这个现象搞清楚之后,研究团队接着往下追,想弄明白背后的机制。
他们发现,两条路径的误差传播方式压根不一样。
内容缓存出了误差,会同时波及两处:一处是"注意力匹配"(模型判断该重点看哪些词),另一处是"数值聚合"(模型实际取信息时用的那些值)。两种影响还会缠在一起,多出一层耦合效应。
RoPE缓存的误差却只有一条路:只经由与位置相关的匹配分数起作用,碰不到具体的数值内容。
乍一听,RoPE路径的影响渠道更单一,误差该更好控制才对。可研究往下走发现,这个"单一渠道"本身就特别吃误差,论文里的说法是"算子敏感度"更高。再加上量化误差在各坐标方向上的"能量分布"不一样,有些方向的误差正好落在模型最敏感的点上,几项加起来,最终偏差反而被放大了。
打个比方,两条路都能从A地到B地。一条是普通公路,沿途出口多,车流能分流;另一条是独木桥,所有车都得挤过同一个点。独木桥的"路径"看着简单,可桥本身承重能力差,哪怕只过一辆超载的车,整条通道也可能直接垮掉。RoPE路径就是那座看着简单、实际异常敏感的独木桥。
**量子MLA:两条路各配一套压缩方案**
问题的根源摸清之后,论文拿出了解决方案,名字叫QuantMLA。
核心思路是:两条路径的误差传播机制既然完全不同,就不该拿同一套压缩标准去要求它们,得分别定制变换方式和优化目标。
内容路径这边,QuantMLA设计了一种叫"正交旋转加通道缩放"的变换空间。
正交旋转说白了就是一种数学变换:把数据在高维空间里“转个角度”,不过转动时数据本身的长度和距离关系不会被拉伸或压缩,所以转之前转之后算出来的结果完全等价。
这个变换的巧妙之处在于,它完全可以提前算好,在模型部署之前就"焊死"进原有参数里,推理时不用再额外花时间做变换。好比搬家前先按新家的空间布局把东西规划分类打包好,到了新家照标签摆就行,而不是搬进门才一件件商量怎么放。
内容路径对应的优化目标叫"注意力输出重建",说白了就是直接盯住模型最终产出的那个输出,尽量让压缩后的输出跟没压缩时保持一致。内容路径的误差会同时影响匹配和聚合两个环节,只有盯住最终输出,才能把这两种耦合在一起的影响都算进去。
RoPE路径那边更麻烦些,因为这条路上还套着一层RoPE的旋转位置编码,普通的变换不能随便往里加,得保证新变换和RoPE自身的旋转操作"兼容",不能互相打架。
论文给出的解法是"成对旋转加绑定缩放",专门照着RoPE两两配对的频率结构来设计,保证这个变换能和RoPE的旋转操作顺利交换次序,于是同样可以提前离线融合进模型参数,推理时不多花开销。
对应的优化目标叫"位置QK重建",意思是专门保住RoPE路径独有的那部分注意力分数(也就是和位置相关的匹配分数),而不像内容路径那样去追最终的整体输出。论文还从数学上证明了一点:只要把这部分位置分数的误差控制住,最终输出的误差就有一个明确的上界,不会一路恶化下去。
这种"对症下药"的思路,其实是认了一个朴素的道理:两种性质完全不同的东西,硬拿同一套标准去衡量和处理,本身就是偷懒,也注定要留下隐患。
**压到多狠才算够狠**
方法论有了还不够,得看实际能压到什么程度。
论文给出的核心成绩是:在四个不同的MLA模型家族上,QuantMLA首次做到内容缓存和RoPE缓存同时压到INT4精度(每个数用4位整数表示),精度损失还控制得很小。
> INT4:一种用4个二进制位表示一个数字的整数格式,相比常见的16位浮点数格式,存储空间直接缩小到四分之一。
具体数字摆出来更有说服力。DeepSeek-V2-Lite模型上,BF16原精度跑GSM8K数学题能拿36.92%;QuantMLA把内容缓存和RoPE缓存一起压到INT4后,得分35.25%,只损失不到2个百分点。反过来看,用最朴素的四舍五入量化(RTN)压到同一精度,分数直接掉到16.98%,少了将近20个百分点。SmoothQuant和QuaRot这两个改造过的对照方法,成绩也明显落在QuantMLA后面。
论文还试了更极端的做法:内容缓存继续压到INT2,每个数只占2个二进制位,RoPE键缓存则留在INT4。LongCat-Flash-Lite模型在这种压缩下跑HumanEval代码生成,拿到71.34%,未压缩时是73.78%,差距不大。GLM-4.7-Flash在同一设置下综合平均分51.43%,比同精度里表现最好的对照方法高出6.22个百分点。
长上下文检索也做了测试。论文用RULER基准覆盖4K到32K不同长度,QuantMLA在较简单的检索任务上基本追平未压缩模型;难度最高的S-NIAH-3任务上,平均准确率87.20%,比最好的对照方法高7.4个百分点。
**从实验室到实际部署,还差一套工程活**
方法管用只是开头。真要落地,还得看它在实际推理服务里跑得够不够快、省得够不够多。
为此团队写了一套原生的低精度MLA计算内核,把解压和反量化直接嵌进注意力计算本身,不用先还原成完整精度再算,省掉了整个缓存展开那笔内存开销。
有个细节挺有意思:论文没有对所有词一视同仁地压缩,而是划出一块“保护区”——对话最开头的几个词(称为sink token,锚点词)和最近128个词,始终保留未压缩的高精度版本,剩下的词才走低精度。
注意力机制里有个现象叫 Sink token,也就是锚点词:序列开头那几个词,模型会对它们一直保持高强度关注;这些词本身信息量未必大,却像锚点一样把整体注意力分布稳住了,所以它们的精度要特别加以保护。
这么设计是因为研究发现,开头和最近的词对模型保持稳定表现格外关键,这些词的精度一旦被破坏,容易引发连锁的偏差放大。好比搬家时大部分行李可以压缩打包,但身份证、钥匙这种随时要用、丢了麻烦的东西,你一定会单独放在最好拿的口袋里,不会跟其他行李一起压进去。
工程上的回报相当可观。12.8万token的超长上下文场景下,持久化KV缓存体积压到了原来的27.9%,相当于3.59倍压缩率。
真实服务压力测试更能说明问题。论文模拟了这样一个高压场景:8块GPU同时处理5个请求,每个请求输入长度12.8万token,要求生成1024个token。用未压缩的BF16缓存,显存很快撑爆,系统被迫触发32次“抢占”——暂停部分请求、腾出内存给别的请求,之后再重算被暂停的部分。换成QuantMLA压缩后的缓存,整个过程零抢占。吞吐量上的结果就是:输出速度从每秒2.61个token升到13.51个token,提升5.168倍。
这个数字的分量在于,它不是靠某个算子跑得更快换来的。论文特意说明,实际注意力计算延迟和未压缩版本几乎没差别,差距在0.5%以内。收益来自缓存变小后系统不用再反复暂停、重算——靠“少做无用功”提效,计算本身并没有被加速。
写在后面
读完论文,我印象最深的不是5倍多的吞吐提升,而是那组揭示RoPE路径误差被放大的实验数据。这种“大家默认不重要、所以没人仔细测过”的死角,往往藏着意外发现。
行业聊KV缓存压缩时,长期默认一个前提:RoPE相关的信息天生娇贵,碰不得,于是绕开它只压别的部分。这个默认与其说经过严谨验证,不如说更像“没人愿意啃硬骨头”的集体惰性。论文真正的贡献,某种程度上不是发明了多复杂的新算法,而是有人愿意花时间较真地测一测:这个“默认”到底站不站得住脚。
另一个让我反复琢磨的是“保护区”设计——只保护开头几个词和最近的词,中间内容全部压缩。这种处理暗合人类记忆的某种规律:我们对一段对话的开场白和最近说的话印象最深,中间大段细节反而容易模糊处理。模型的注意力分布和人的记忆规律在这个细节上出现了某种巧合的呼应。这种跨领域的呼应,是不是意味着有些优化策略之所以有效,根植于信息处理本身更底层的某种共性规律?论文没有回答,但留下了一个值得继续追问的缝隙。
Q&A
Q1:QuantMLA解决了什么核心问题?
A:它发现大模型MLA架构里,RoPE位置信息缓存在同样压缩误差下造成的输出偏差,比内容缓存高出近2到7倍;但业界此前普遍只压内容缓存、放过RoPE缓存。QuantMLA针对这两条路径分别设计了专属压缩方案。
Q2:QuantMLA能把显存压缩到什么程度,精度损失大不大?
A:在四个主流MLA模型上,内容和RoPE缓存同时压到INT4精度,精度损失普遍控制在1到2个百分点以内;12.8万token超长上下文下,缓存体积可压缩到原来的27.9%。
Q3:QuantMLA在实际部署中能带来多大的效率提升?
A:高压力服务测试中,使用QuantMLA压缩的缓存让系统避免了反复抢占和重算,整体输出吞吐量提升5.168倍,同时保留对话开头和最近内容的高精度保护区。