KV cache 量化这几年的主线,基本是"更聪明的预处理 + 更低的固定位宽":旋转、归一化、换分组粒度,但编码格式本身没人动过——大家默认每个值都得占同样多的比特。腾讯团队刚放上 arXiv 的 D-Quant 换了个思路:把视频压缩里用了几十年的熵编码(rANS)搬进 attention 内核,让高频值用短码、低频值用长码,再用一个"drift"机制把变长输出掰回定长容器。结果是在 2.26 bit 每值的预算下逼近 BF16 精度,64K 长上下文 KV 内存省约 7 倍。

为什么固定位宽是天花板

固定宽度量化的根本限制是:b bit 只能表示 2^b 个量化水平。往 2-bit 走,水平数掉到 4 个,信息损失断崖式下跌。而 D-Quant 的观察是:KV 值经过旋转和归一化后近似正态分布——大部分值挤在中心,尾部极少。固定宽度编码却给高频符号和稀有符号同样的比特数,等于白扔了这份分布结构。熵编码天然吃这种非均匀分布:按符号概率分配码长,同样的平均存储预算下可以塞进多得多的量化水平。

麻烦在工程侧。熵编码输出变长码流,而 attention 内核的高效反量化和计算依赖规则内存布局、定长寻址——变长数据在并行 kernel 里是灾难。之前 CacheGen、SplitZip 这类工作只敢把熵编码用于 KV 传输(先解压再算),没人敢直接放进计算路径。

drift:把变长掰回定长

D-Quant 的解法是给每个 token 的 K 或 V 张量分配一个定长字节容器,把量化后的符号用 rANS 熵编码塞进去;塞不下时,少量符号从高成本符号"漂移"到邻近的低成本符号,直到码长满足约束。论文测得漂移只改动 0.75% 的 key 符号和 5.00% 的 value 符号,且没有任何符号移动超过一个重建水平——是稀疏局部修正,不是全局降精度。

这个设计还顺手解开了两个死结。其一,量化水平数与位宽解耦:2.26 bit 预算下,key 用 8 个水平、value 用 6 个,固定位宽 paradigm 里这不可想象。其二,免校准:预处理后 KV 分布足够接近标准正态,概率模型直接从解析式导出,不需要标定数据集。

数字说话

Qwen3-8B 上 RULER 平均分 86.50(BF16 为 87.31),Llama-3.1-8B 上 88.94(参考 89.69);128K 上下文时 D-Quant 拿到 70.92 / 74.65,最强 baseline 只有 57.14 / 66.15。效率侧,8K prompt 下 BF16 在 batch 64 爆显存,D-Quant 跑到 batch 128 峰值内存仅 49.4 GiB;各自最大 batch 下吞吐 563.6 对 159.5 tokens/s,提升 3.5 倍。把预算再压到 1.96 bit,Qwen3-8B 仍保 85.21 分,继续压过全部 baseline。

值得注意的是这笔交易的另一面:熵解码带来额外计算,小 batch 下 D-Quant 比 BF16 慢——它换的是显存受限场景下的 serving 容量,不是单请求延迟。这个权衡在长上下文 Agent 场景(高并发、长会话)恰好是对的位置。

所以呢

KIVI、KVQuant、QuaRot 这条线一直在优化"怎么摆 outlier",D-Quant 换了进攻方向:编码格式本身还有多少水分可挤。对做推理服务的团队,7 倍 KV 内存压缩加 3.5 倍吞吐增益,值得立刻评估接入成本;对研究者,熵编码进入 attention kernel 这一步打通后,速率-失真优化这套视频压缩的成熟工具箱,接下来都可以往 KV cache 上搬。论文:arxiv.org/abs/2609.19880。