扩散语言模型量化遇阻:校准数据为何反成累赘
sina qqZone renren ydCloud 0

扩散语言模型这个新事物,你可能已经听说了。它跟传统GPT逐字往下写不一样,更像修照片:先给一张满是噪点的“文字照片”,再一步步去掉噪点,露出完整句子。LLaDA、Dream这些模型就是这么干的,它们证明了语言生成不一定非得从左往右写。
不过这篇论文要谈的,不是扩散语言模型本身多厉害,而是工程师头疼的一个实际问题:模型太大太慢,想塞进手机或者边缘设备,就得压缩。结果在压缩过程中,研究者撞上了一堵意想不到的墙。
**量化:大模型是怎么变瘦的**
先说压缩模型这件事到底在做什么。
量化,就是把模型里原本用16位甚至32位浮点数表示的权重和激活值,压成4位甚至更少的低精度数字,内存占用和计算量都能大幅降下来。
这好比原来用一张高清照片存一个场景,现在要用马赛克画面表示同样的内容。马赛克块越大,图片越小,细节丢得也越多。模型量化面临的正是这个权衡:精度降得越低,跑得越快越省内存,但出错的风险也越大。
传统自回归语言模型,比如GPT那一套,量化技术已经相当成熟。研究者发明了各种办法,比如利用二阶导数信息做权重量化的GPTQ,通过缩放手段抑制激活值异常点的AWQ,还有把权重和激活值转换到更适合量化的坐标系的旋转类方法比如QuaRot。这些方法有一个共同点:都依赖“校准数据”。
校准数据,就是在量化之前先拿一小批真实数据跑一遍模型,记录下激活值的分布范围,用这些统计信息来决定量化的刻度该怎么设。
这就像要给一批衣服定制尺码表,得先找几个人来量量身材,然后按照这个样本去推算整个系列的尺码区间。听起来合情合理,对吧?
问题是,扩散语言模型的“身材”是会变的。
**核心问题:一个不断变形的目标**
这里就要说说扩散语言模型和传统语言模型最本质的区别了。
自回归模型写文本,每步仅预测下一个词,拿到的上下文就是已生成且固定不动的那一段。扩散语言模型走的是另一条路:去噪途中,它会一遍遍碰上不一样的“遮盖状态”。
所谓遮盖状态,是指在扩散语言模型的生成过程里,句子刚起步时差不多全是特殊的“掩码”符号(像完形填空留的空格),去噪一步步往前走,空格才慢慢被真词填上,直到整句补齐。
论文举了个一眼就能看懂的例子。起初整句是“[M] [M] [M] [M] [M] [M]”,清一色掩码;走到中间,可能变成“[M] tok tok [M] tok [M] tok”,一部分位置已经填了词;最终才成为完整句子。这中间,模型每层每步看到的激活值分布,都会随着“哪些位置仍为掩码、哪些位置已填词”而发生剧烈变动。
论文作者做了一个实验,追踪某一层前馈网络中down_proj这个模块的输入激活值,在不同去噪步骤里的变化幅度。结果显示,同一层在不同去噪步骤里,激活值的尺度能相差好几倍,有的地方波动甚至达到4倍以上。
麻烦就出在这儿:拿某批校准数据去统计激活值分布,得到的结果兴许只对应某个特定去噪阶段、某一种掩码状态;换一批校准数据、换一个任务,这套统计结果或许就完全用不上了。
论文里有个对比实验很能说明问题。研究者选了WinoGrande和MMLU两套不同的校准数据集,去校准同一个量化方法,再分别放到C-Eval和PIQA两个基准上测。结果显示,校准数据一换,准确率就出现明显漂移。这说明校准本身并不可靠,它学到的只是某一个切片的统计规律,代表不了整个生成过程中不断变化的激活分布。
打个比方:你想给一条河的水位定一套固定预警标准,可这是条潮汐河,水位隔几个小时就涨落一回,涨落幅度还跟季节、降雨量挂钩。你只挑某个清晨量了一次水位就把标准定死,到了下午涨潮时这套标准可能根本不管用,甚至让防洪系统作出误判。不肯适配这种动态变化,只认某一次测量结果,系统早晚要出岔子。
面对这个难题,论文作者换了条路:与其死追这个一直在变的分布,不如把它改造成一个不变、可预测的分布。这便是这篇论文的核心贡献,名为SOLOQ。
**旋转的魔法:把混乱变成可预测**
SOLOQ这个名字背后的想法其实相当巧妙,它依托一个数学上早已被证明的性质:随机旋转能把任意方向的向量,变成在球面上均匀分布的模样。
具体做法是,手里有一个向量,先归一化成单位长度,再给它施加一个哈尔随机旋转(数学上“完全均匀随机”的一种旋转方式),得到的结果在高维空间里会呈现一个能用公式精确描述的分布;维度足够高时,这个分布会非常接近高斯分布,也就是大家熟悉的钟形曲线。
这意味着什么呢?
经过一次恰当的旋转,原始数据无论原本长成什么样,其坐标分布都会变成一种形状预先已知、可提前预测的分布。
校准依赖的根子问题就此被解决。数据长什么样不用再去猜了——旋转之后它永远是同一个模样。有了这个可预测的形状,量化刻度可以事先设计好,拿真实数据做统计这一步完全可以省掉。
这个思路并不是凭空冒出来的。在此之前,OrbitQuant工作已经在图像和视频扩散模型上把这个想法验证过了,它采用的旋转方法名为RPBH。
RPBH即随机置换块哈达玛旋转:先将向量中的元素顺序随机打乱,再切分成若干小块,每个小块各自做哈达玛变换——这是一种计算效率很高的结构化旋转——于是用比较低的计算开销就能取得接近随机旋转的混合效果。
不过RPBH放到扩散语言模型上会撞上两个问题。其一,每个小块能不能分到大致相当的能量,靠的是最初那次随机打乱,而输入里只要出现个别数值特别大的异常点,这种均衡就保不住了。其二更根本:打乱和分块一旦确定,各小块内部的哈达玛变换就是彼此独立执行的,块与块之间不交换任何信息,某个块起初分到的能量偏多或偏少,后面都没法纠正。
论文专门拿Dream模型举例:它的前馈网络维度为18944,被拆成512乘以37个块,块数相当多,块间能量失衡在这个情形下会被进一步放大。
针对这一点,SOLOQ给出了改进版本,命名为K-RPBH。
K-RPBH即克罗内克扩展的随机置换块哈达玛旋转:它在RPBH之上多加了一步跨块混合,用一个哈尔随机正交矩阵把各小块相同位置上的数值重新搅一遍,残留的块间能量不均衡由此得到修正。
论文附了一个数学证明(命题1):在期望意义上,K-RPBH能让输出每个坐标的方差精确收敛到理论目标值1/d,d为总维度。证明之外还有实测——论文用Dream-7B和Nemotron-Labs-Diffusion两个真实模型的激活值做了验证,K-RPBH处理后的坐标分布比RPBH更贴近高斯目标,块间方差的波动也小得多。
不妨打个比方。你是一名工厂质检员,要把一批零件按重量装进16个箱子,要求各箱总重量尽量接近。RPBH的做法是先把零件顺序随机打乱,再一箱一箱挨着装,装完就封箱不再动。打乱得不够均匀时,有的箱子会特别重、有的特别轻,封箱之后也没法再调。K-RPBH多了一道工序:封箱之前,把16个箱子里对应位置的零件取出来,按一个全局规则重新分配一遍,开头打乱得再不理想,这一步也能把偏差抹平。少了这最后一道调整,维度特别多、分块特别碎的模型(比如Dream那样拆成几十个块)就会一直背着明显的能量失衡,量化误差也随之变大。
论文还把K-RPBH与另外几种旋转方法的计算开销做了对比,其中包括QuIP和QuaRot采用的稠密或结构化旋转。结果是K-RPBH比完全稠密的哈尔随机旋转便宜不少:在Fast-dLLM v2上,旋转耗时从98.135毫秒降到5.779毫秒,精度表现则与稠密旋转基本持平。
两条路线:分布匹配码本与硬件原生格式
旋转做完,数据的分布形状已经可预测,剩下的问题是怎么把它真正量化成低比特数字。SOLOQ为此铺了两条并行的路。
第一条路是SOLOQ-C,走分布匹配的码本量化。
所谓码本量化,就是按目标分布的形状预先设计一组“代表点”(即码本),量化时把每个数值就近映射到代表点上,而不是拿固定刻度简单切分。
权重方面,SOLOQ-C采用E8P这种基于格子结构的量化器,技术借自QuIP#工作——权重是离线处理的,复杂一些的搜索计算扛得住。激活值则不同,推理时要实时处理,所以换成更轻量的Lloyd-Max标量量化器,这是信息论里针对已知分布设计最优量化刻度的经典方法。
第二条路是SOLOQ-N,直接对接硬件原生支持的NVFP4格式。
NVFP4是一种4比特浮点数格式,2位指数加3位尾数(记作E2M1),再配分组动态缩放因子,属于NVIDIA新一代GPU硬件直接支持的低精度计算格式。
走这条路的好处是能直接调用GPU芯片里为4比特计算专门优化的硬件单元,速度更快。SOLOQ-N先算出每16个数字一组的局部最大值,再算出整个张量的全局最大值,靠这两层缩放因子把数值映射进NVFP4可表示的范围内。
两条路线底下是同一套逻辑:先用K-RPBH把数据旋转到可预测的坐标系,再按各自量化器的特性完成最后一步映射。这个设计有它的巧妙之处——没有把“用哪种量化器”和“怎么应对分布漂移”捆死在一起,而是将分布处理这块最难的部分单独拎出来,做成通用底座,上层可以依硬件条件灵活换用。
类似一家快递公司的做法:客户寄来的包裹不管什么形状,先统一装进标准尺寸的集装箱(对应旋转这一步),装好之后无论走卡车还是走飞机(对应码本量化或NVFP4),包装方案都不必重新设计。缺了这层标准化,每换一种运输方式就得重新琢磨包装规则,维护成本会一路往上走。
一个小修正:把丢失的方向找回来
低比特量化除了损失数值精度,还有一个容易被人忽略的副作用:向量的方向可能在不知不觉中被扭偏。
拿中心点量化器(如Lloyd-Max)或有限精度格式(如NVFP4)去近似一个向量,量化结果与原始向量之间不光有大小上的误差,方向同样可能偏移。为此SOLOQ设计了一个颇为轻巧的修正手段,名为“纯缩放偏差校正”。
这套校正的数学原理可以这样理解:量化误差被拆成两块,一块顺着原始向量方向,另一块则与它垂直。然后算出一个缩放系数,把沿原方向那部分分量的投影长度精确拉回到与原始向量一致的水平。整个过程不用多存任何辅助数据,改一改现成的缩放因子就够了。
类似思路在别处也出现过,像面向无偏压缩的DRIVE、EDEN,还有做无偏内积估计的RaBitQ。不过SOLOQ挑的是最省事的那个版本,没有学TurboQuant再拿残差草图做一轮二次修正。
论文实验里,这项校正带来的涨幅不算大,却一直稳稳存在。LLaDA-1.5上,HellaSwag准确率从72.49%和73.71%这两个量化变体分别爬到73.01%、73.86%;Fast-dLLM v2上,GPQA从30.03%或31.92%升到30.58%和33.71%。校正几乎不添计算和存储负担,这笔账算下来很值。
**块扩散模型另有一道坎:KV缓存**
前面说的主要针对“全序列扩散模型”,LLaDA、Dream都属此类,每步去噪都得把整条序列重新过一遍,缓存留不下来。另有一类叫“块扩散模型”的变体,Fast-dLLM v2和Nemotron-Labs-Diffusion是代表,干活方式更像自回归:序列被切成若干块,一块一块往外生成,已生成块的信息存起来给后面的块接着用。
存下来的这个东西就是KV缓存。
所谓KV缓存,指的是Transformer注意力计算要用到此前所有词元的“键”(Key)和“值”(Value)向量,把它们留着,下一步直接取用、不必重算,这块存储结构便叫KV缓存。
麻烦在于句子越长,缓存堆得越大。论文测算,上下文长度到8000至16000时,KV缓存加激活值占内存的比例明显抬升,把权重本身都甩在后面。
SOLOQ的对策叫“提交时量化”:一个块彻底生成完、被“提交”进历史记录的那一瞬,才对其KV状态动手量化;眼下正被去噪的活跃块保持全精度,不碰。
道理不难懂:去噪中的块内容还在变,此时量化等于对着没定型的东西一遍遍扣精度,误差只会越积越多。提交后的块内容已经定死,只管被动存取和复用,这时候量化才稳妥。
Key这边,SOLOQ采用KIVI那种按通道的非对称量化;Value则交给SOLOQ自家的激活值量化路径,搭配K-RPBH旋转和Lloyd-Max或NVFP4量化器。
打个比方,像图书馆管理员归档文件。一份还在被人翻、被人改的文件,不会急着压缩打包塞进仓库,因为它随时可能再动;可一旦定稿归档,就能放心压好存起来,桌面也腾出来了。要是“正在用”和“已定稿”不加区分、一律同样处理,结果不是让还在变的内容过早挨压缩的损,就是让已定型的内容白占着没压的空间。
**实验结果:看数字**
理论说完,实际表现如何。
论文挑了三个全序列扩散模型(LLaDA-Base、LLaDA-1.5、Dream-7B)和两个块扩散模型(Fast-dLLM v2、Nemotron-Labs-Diffusion),做W4A4量化(权重与激活值均压到4比特),并与多种基线对照:简单的RTN(直接四舍五入)、AWQ、QuaRot配GPTQ,以及专为扩散语言模型打造的DLLMQuant和STaR-Quant。
LLaDA-Base上,全精度模型平均准确率58.95%,SOLOQ-C拿到57.74%,把同样免校准的RTN(44.23%)甩开一大截,也比要校准的DLLMQuant++(54.29%)高3.45个百分点。
LLaDA-1.5上,SOLOQ-N为68.48%,距全精度的69.23%仅差0.75个百分点,贴得很近,比DLLMQuant++高出4.17个百分点。
块扩散模型那边更夸张。Fast-dLLM v2在W4A4下,RTN和AWQ直接崩掉,平均准确率只剩6.67%和6.61%,跟乱答差不多;QuaRot因模型维度不兼容压根跑不起来;SOLOQ-C和SOLOQ-N则分别取得57.00%和56.77%,与全精度的60.35%相比差距不到4个百分点。
Nemotron-Labs-Diffusion上,SOLOQ-N达到70.76%,QuaRot配GPTQ只有59.39%,RTN和AWQ更惨,1.3%和1.28%,几乎全废。
这组对比颇能说明问题:扩散语言模型这套特殊生成机制,并非随便哪种量化方法都接得住。激活分布一旦随去噪步骤大起大落,那些靠固定校准统计吃饭的方法很容易当场失灵。
**效率:内存与速度的真实收益**
准确率守住了,压缩究竟换来多少实惠?
论文在真实GPU上跑了端到端测试。SOLOQ-N在NVIDIA RTX Pro 6000上运行原生NVFP4内核,五个模型的峰值显存下降2.31倍到2.61倍,大头来自4比特权重存储,块扩散模型还额外吃到KV缓存压缩的红利。端到端推理速度提升1.94倍到2.24倍。
论文还做了一次FPGA验证,在Zynq UltraScale+ ZCU104开发板上搭起脉动阵列加速器,让BF16与NVFP4两条数据通路对打。结果NVFP4加速器功耗反比BF16低15%,同样面积能塞进两倍计算单元,整体吞吐量提升1.94倍,每千焦能量处理的词元数提升2.70倍。可见SOLOQ不只在大GPU的数据中心派得上用场,资源吃紧的边缘设备上同样有实用价值。
论文并没有回避SOLOQ的短板,专门讨论了它的代价与取舍。
激活值的旋转得在线实时做。K-RPBH的结构化设计已经把这部分开销压得很低,可成本终归不是零。作者试过把旋转“折叠”进相邻的权重矩阵,让它转为离线操作。实验发现,低比特量化下这种折叠会带来额外的精度损失,在Fast-dLLM v2这类块扩散模型上尤其明显:折叠后的W4A4平均准确率从57.00%掉到50.94%,跌幅不小。折叠看着诱人,代价却躲不掉。
另一处限制在硬件。SOLOQ-C所用的非精度码本,实际只能跑在INT8内核上,享受不到4比特专用计算单元的速度红利,这也是它加速效果不及SOLOQ-N的原因之一。SOLOQ-N倒是更快,可它完全依赖硬件对NVFP4格式的原生支持;设备不支持这种格式,加速就要打折。
论文末尾还花了不少笔墨,分析“注意力沉锚”现象。
所谓沉锚,是指在Transformer的注意力机制里,某些固定位置(比如序列开头)会异常吸走大量注意力权重。自回归模型里早有这类发现,论文则验证了块扩散模型中同样存在。
实验里,Fast-dLLM v2的注意力明显集中在位置2,Nemotron-Labs-Diffusion则落在位置0。作者把这些“沉锚位置”保留全精度、其余位置照常量化,结果在普通4比特KV量化下,这层特殊保护几乎没必要,带不带差别很小;可一旦把KV压到2比特这种极端情形,保护沉锚位置就有了意义,准确率提升明显。压缩的边际效应往往不按线性走,越往极端推,原先可忽略的细节越可能成为关键。
写在后面
通读这篇论文,真正让我意外的不是K-RPBH的数学设计,而是那个校准数据失效的观察本身。
我们习惯性相信,只要拿到更多、更有代表性的真实数据去做校准,压缩效果就会更好。这个直觉在传统语言模型上确实成立。扩散语言模型却把它推翻了:它的激活分布压根不是一个稳定目标,而是随着去噪步骤和掩码状态不断变形。这么看,“用更好的数据去校准”这条路可能从根上就走错了方向,你永远追不上一个一直在动的靶子。
这背后是个更普遍的问题:不少工程优化的默认假设,都建立在“目标分布大致稳定”这个前提上。前提一旦被打破,原来的最佳实践反而可能成为负担。SOLOQ与其说是一项量化技巧,不如说是对假设前提的一次重新审视——它没有去修补校准这条路,而是直接绕开。
论文里还有个细节值得单独拎出来说。作者提到,K-RPBH比QuaRot“需要更少的变换操作”,而QuaRot在某些模型维度上根本不适用(论文标注为N/A)。这不是孤立的技术细节:现有不少旋转量化方法是针对特定维度结构设计的,碰上Dream那种18944维、拆成512乘37块的不规则结构,就直接失效。K-RPBH用克罗内克积这种数学工具去兼容任意维度组合,背后是对“通用性”的较真。
那些正在被去噪、还没定型的KV块该怎么办?SOLOQ的答案是“先别动它”。这种克制本身也是一种设计智慧——不是所有能压缩的东西都该立刻压缩。
Q&A
Q1:SOLOQ是什么,它解决了什么问题?
A:SOLOQ是一个面向扩散语言模型的免校准量化框架。它把权重和激活值旋转到一个分布可预测的坐标系中,从而绕开传统量化方法对校准数据的依赖——扩散语言模型的激活分布随去噪步骤剧烈变化,校准因此容易失效。
Q2:SOLOQ相比传统量化方法有什么优势?
A:不用任何校准数据,SOLOQ就能达到甚至超过依赖校准数据的方法。在多个扩散语言模型上,它4比特量化的准确率优于DLLMQuant、STaR-Quant等基线;配合NVFP4硬件格式,最高可实现2.61倍内存压缩和2.24倍推理加速。
Q3:K-RPBH旋转和普通的RPBH旋转有什么区别?
A:K-RPBH在RPBH基础上多加了一步跨块混合:用随机正交矩阵把各个小块对应位置的数值重新混合,缓解RPBH块数较多时容易出现的块间能量不均衡,让最终的坐标分布更贴近理想的高斯分布。