1. 项目概述当MXFP4遇上激活异常值我们如何破局在大型语言模型LLM的实际部署中我们这些一线工程师和研究者最头疼的问题之一就是如何在有限的硬件资源上让这些“庞然大物”跑得又快又好。模型量化尤其是将权重和激活值都压缩到极低比特如W4A4几乎是必由之路。它背后的原理并不复杂本质上是通过一个缩放因子scale和零点zero point将高精度的浮点数映射到有限的整数或低精度浮点表示上从而大幅降低模型的内存占用和计算开销。然而理想很丰满现实却很骨感。当你真正动手把FP16的LLaMA模型往4比特上压时会发现性能掉得厉害而罪魁祸首往往就是激活张量里那些不听话的“异常值”。这些异常值有些是普遍偏大的“常规异常值”有些则是集中在少数token上、数值巨大的“海量异常值”。在传统的每通道或每令牌量化中它们已经够麻烦了但在像MXFP4这样的微缩格式里问题被进一步放大。MXFP4的设计很巧妙它将张量分成32个元素一组的小块组内共享一个E8M0格式的缩放因子。这个设计硬件友好在NVIDIA Blackwell Tensor Core上能有原生支持效率很高。但它的副作用也很明显只要一个组里出现一个异常值整个组的共享缩放因子就会被这个“坏家伙”撑大导致组内其他正常值的动态范围被严重压缩量化误差激增。这就好比一个木桶因为一块长板异常值的存在导致所有其他短板正常值的盛水能力表示精度都被迫拉高到不切实际的水平最终整体效果反而更差。现有的应对方法比如随机哈达玛德旋转或者可学习的全局旋转思路是通过正交变换把异常值的能量“摊平”到各个维度上。但我在实践中发现这些方法有个根本的缺陷它们是“数据无关”的。旋转矩阵要么是固定的随机矩阵要么是通过优化学习得到一个全局矩阵它们并不知道异常值具体藏在哪个通道里。这就好比用一把大扫帚漫无目的地扫地虽然也能扫到一些垃圾但效率低下对于顽固的污渍集中在特定通道的海量异常值往往力不从心。更重要的是全局旋转会破坏MXFP4格式固有的块间独立性给硬件实现和计算带来额外的复杂性。正是基于这些在实际量化工作中反复遇到的痛点我们提出了DuQuant。它的核心思想非常直接既然MXFP4以32个元素为一个组进行独立量化那我们的优化手段也应该精准地作用于这个“组”内部。我们将旋转的粒度与MXFP4的微缩组大小对齐B32为每个组设计一个能够感知组内异常值分布的数据依赖型旋转矩阵。这个设计带来一个关键简化因为每个MXFP4组有自己的缩放因子组与组之间的量化误差互不影响原来在整数量化中为了平衡组间方差而必需的“之字形”排列和第二轮旋转在这里变得多余了。因此DuQuant可以用一次精准的、感知异常值的旋转替代原先复杂的双旋转加排列流程在线计算成本直接减半同时还能更有效地平滑权重分布。下面我就结合大量实验和踩过的坑来详细拆解DuQuant的设计、实现细节以及那些论文里不会写的实操心得。2. 核心思路拆解为什么对齐块大小是关键一招要理解DuQuant为何有效我们需要深入MXFP4的量化机制和异常值的破坏原理。这不仅仅是理论推演更是在无数次实验失败后总结出的经验。2.1 MXFP4量化误差的放大效应MXFP4的量化过程可以简化为两步首先找到组内32个元素的绝对值最大值根据这个最大值计算出一个共享的缩放因子sj然后用这个缩放因子去归一化组内每一个元素并将其舍入到最接近的4比特浮点表示。公式虽然简洁但隐患就藏在sj的计算里。假设一个MXFP4组内的数值是[0.1, 0.2, 0.3, 1024.0, 0.4, ...]。那个1024.0的海量异常值会直接决定sj的大小。为了能表示1024.0sj必须足够大。当用这个巨大的sj去归一化0.1、0.2这些正常值时它们会被压缩到一个非常小的区间内。在4比特有限的表示精度下这些被压缩后的正常值在舍入时会产生巨大的相对误差。量化误差不再均匀分布而是异常值“绑架”了整个组的精度预算。我们在LLaMA-3的Down Projection层输入处观察到了大量这类现象这也是该层量化后性能损失最严重的根本原因。2.2 现有旋转方法的局限为何“数据无关”不行面对组内异常值一个直观的想法是“搅匀它”。随机哈达玛德旋转如MR-GPTQ、BRQ采用的方法确实能起到一定的均匀化作用。它像一个高速搅拌器把组内32个元素随机混合。但是它有两个问题盲目性它不知道异常值在哪个位置旋转是固定的、随机的可能一次旋转恰好把几个大值又凑到了一起反而加剧了问题。粒度不匹配有些方法使用全局旋转如QuaRot这破坏了MXFP4的块结构使得硬件无法高效利用其原生支持同时全局混合也可能把不同组的异常值问题耦合在一起增加了优化难度。可学习的旋转如FlatQuant虽然能根据数据优化但其优化目标通常是全局的量化损失计算开销大且学到的旋转矩阵可能对校准集过拟合泛化到新数据时效果不稳定。2.3 DuQuant的破局点粒度对齐与方差解耦DuQuant的灵感来源于我们之前的工作DuQuant但其简化得益于MXFP4的格式特性。原来的DuQuant针对整数量化设计需要两次旋转加一次排列核心是为了解决组间方差问题。因为整数量化通常使用全局或每通道的缩放因子一个组经过旋转平滑后可能把高方差转移到另一个组导致那个组的量化误差变大。所以需要排列操作来重新分配再用第二次旋转进行局部平滑。MXFP4格式天然解决了组间方差问题因为每个组32元素拥有完全独立的缩放因子sj。第1组的异常值只会撑大第1组的sj与第2组的sj毫无关系。这意味着我们只需要关心组内的分布是否平滑即可组与组之间是“老死不相往来”的。因此DuQuant的核心设计变得极其清晰粒度对齐将旋转的块大小B严格设置为32与MXFP4的微缩组大小一一对应。一个旋转块正好处理一个MXFP4组。单次精准打击为每个这样的块实际中所有块共享同一个设计好的矩阵构建一个数据依赖的、感知异常值的正交旋转矩阵\hat{R}。这个矩阵的构造目标非常明确找到组内异常值最集中的那个维度然后通过旋转将这个维度的能量即异常值分散到组内其他31个维度上去。流程简化由于无需处理组间影响复杂的之字形排列和第二次旋转被彻底移除。整个在线变换简化为X - X · \hat{R}。这个设计带来了双重好处计算成本减半一次旋转 vs. 两次旋转排列同时效果更精准旋转直接针对最严重的异常值通道。我们在LLaMA-3各层的量化误差分析中见图1清晰看到这种对齐的、感知异常值的旋转在QKV输入、O投影输入尤其是Down投影输入海量异常值重灾区上其组内归一化量化误差均显著且稳定地低于原始值和无目标的随机哈达玛德旋转。实操心得理解“独立缩放因子”是关键很多刚接触MXFP4的同行会下意识地用处理INT4量化如GPTQ、AWQ的思维来处理它总想着如何平衡不同通道或不同token之间的范围。这是一个误区。在MXFP4的语境下你的优化战场被清晰地划分为了一个个32元素的“独立王国”。你的所有战术旋转、平滑都应该以“王国”内部为边界。强行引入全局操作不仅可能无效还会增加不必要的开销并破坏硬件友好性。时刻记住MXFP4下没有“全局缩放因子”需要你去保护。3. 方法实现详解从平滑到旋转的完整流水线理解了“为什么”之后我们来看“怎么做”。DuQuant的整个流程可以无缝嵌入到标准的训练后量化PTQ流程中仅需一个小的校准集。下面我分步拆解并附上关键的实现细节和参数选择依据。3.1 第一步平滑变换——分担量化压力在应用旋转之前我们首先采用一个经典的预处理步骤SmoothQuant。这一步的目的是在权重和激活之间迁移量化难度。激活值中的异常值通常比权重中的更尖锐、更难量化。SmoothQuant通过一个逐通道的缩放矩阵Λ将激活值的幅度缩小同时将权重的幅度放大从而在数学等价的前提下让权重“分担”一部分量化压力。具体操作如下 对于线性层Y X · W我们将其重写为Y (X · Λ^{-1}) · (Λ · W)其中Λ是一个对角矩阵其第j个对角线元素Λ_j max(|X_j|)^α / max(|W_j|)^{1-α}。这里的α是一个超参数控制迁移的强度。α0.5表示平均分配。max(|X_j|)和max(|W_j|)是从校准数据中统计得到的该通道激活和权重的绝对值最大值。为什么先做平滑因为旋转操作尤其是我们后面要做的细粒度旋转其计算成本与数据范围有一定关系。先通过平滑把激活值的极端异常值压下来一些可以为后续的旋转创造一个数值上更“温和”的环境有时能让旋转搜索过程更稳定、更快收敛。但要注意平滑主要对付的是“常规异常值”对于那种突兀的“海量异常值”效果有限这就需要旋转出场了。3.2 第二步构造感知异常值的块对角旋转矩阵这是DuQuant的核心。我们的目标是构造一个块对角正交矩阵\hat{R}其每个块\hat{R}_bi的大小是32x32并且是数据依赖的。构造算法贪婪搜索假设我们有一个校准激活张量X_calib其形状为[序列长度, 通道数]。我们将通道维度按32分组。定位最坏组遍历所有32元素的组计算每个组原始激活的L∞范数即组内绝对值最大值。找到拥有最大L∞范数的那个组记为X_worst。这个组包含了当前最严重的异常值集中区域。初始化旋转矩阵从单位矩阵I_{32x32}开始。迭代优化进行最多K步例如128步的贪婪搜索。在每一步 a.寻找目标维度在当前X_worst中找到绝对值最大的那个元素所在的维度d即异常值最集中的通道。 b.生成候选旋转尝试将维度d与组内其他31个维度分别进行一次Givens旋转一种2x2的正交变换用于混合两个维度的值。每次旋转都会产生一个新的候选矩阵。 c.评估效果用每个候选矩阵左乘X_worst计算变换后张量的L∞范数。 d.选择最优选择能使L∞范数降低最多的那个Givens旋转。 e.更新矩阵将当前旋转矩阵与这个最优的Givens旋转矩阵相乘。 f.更新数据用这个最优Givens旋转更新X_worst。矩阵共享上述过程只针对那个“最坏组”X_worst进行搜索。搜索完成后我们得到最终的32x32旋转矩阵\hat{R}_b。关键的一步是我们将这个矩阵复用于所有其他组。即\hat{R} BlockDiag(\hat{R}_b, \hat{R}_b, ..., \hat{R}_b)。这是因为我们假设不同组的异常值分布模式是相似的共享矩阵极大地减少了存储开销从K个矩阵降到1个且在实践中被证明有效。为什么用贪婪搜索而不是优化求解理论上我们可以定义一个最小化变换后张量L∞范数的优化问题。但直接求解这个非凸问题非常困难。贪婪搜索每次找最坏的维度做最好的2维旋转是一种高效且实用的启发式方法。它每次迭代都能显著降低峰值通常几十步后就能得到非常平滑的分布。我们的实验表明128步已经足够继续增加步数收益甚微。3.3 第三步应用旋转与权重吸收得到旋转矩阵\hat{R}后我们将变换应用于线性层Y X · W (X · Λ^{-1} · \hat{R}) · (\hat{R}^T · Λ · W)令\hat{X} X · Λ^{-1} · \hat{R}\hat{W} \hat{R}^T · Λ · W。在线与离线成本分析在线推理时对于输入激活X我们需要计算X · Λ^{-1} · \hat{R}。Λ^{-1}是逐通道缩放成本极低。· \hat{R}是一个32x32的块对角矩阵乘法。由于\hat{R}是块对角的这个乘法可以完全在组内进行并行度极高并且可以利用硬件对小型稠密矩阵乘法的优化。相比原DuQuant的双旋转成本减半。离线量化准备时权重变换\hat{W} \hat{R}^T · Λ · W可以提前计算好。因为\hat{R}是正交矩阵这个变换是严格无损的。变换后的权重\hat{W}被量化存储。这意味着推理时模型加载的已经是变换并量化后的权重没有任何额外的旋转开销。旋转的成本被完全“吸收”到了权重中。一个重要的副作用权重平滑注意旋转不仅作用于激活也通过\hat{R}^T作用于权重。这带来了一个额外的好处权重分布也被平滑了。特别是在Down Projection层SmoothQuant的缩放可能会在权重中引入新的异常值。旋转操作可以有效地缓解这个问题使得权重本身也更容易被量化。3.4 与GPTQ等权重量化方法的结合DuQuant主要解决激活量化的问题。对于权重量化我们可以直接使用现成的、强大的方法如GPTQ。GPTQ通过二阶信息来迭代地补偿权重量化误差效果非常好。在DuQuant中我们有两种结合方式DuQuant仅使用上述的平滑和旋转处理激活权重使用简单的Round-To-NearestRTN量化。DuQuant*激活使用DuQuant处理权重则应用GPTQ进行量化。我们的实验结果表明见后文两者是互补的。DuQuant旋转为权重和激活创造了一个更易于量化的平滑分布而GPTQ在此基础上进一步精细地减少了权重量化误差从而实现了最佳的整体性能。实现陷阱与技巧校准数据的选择贪婪搜索依赖校准数据来构造旋转矩阵。校准数据必须有代表性。我们通常从验证集如WikiText-2中随机抽取128个长度为2048的序列。切忌使用训练集以免引入偏见。序列长度应覆盖模型典型的上下文长度。搜索步数K这是一个权衡超参数。步数越多平滑效果可能越好但搜索时间越长。我们发现对于LLaMA-3这类模型128步是一个很好的平衡点继续增加对最终量化精度提升不大。数值稳定性Givens旋转涉及三角函数计算。在实现时要使用双精度进行搜索和矩阵构造确保正交性。构造好的单精度矩阵\hat{R}在应用于FP16数据时是足够稳定的。块对角矩阵的乘法优化在实现X · \hat{R}时不要傻傻地用大的稀疏矩阵乘法。应该将输入X在通道维度上重塑为[..., K, 32]然后对最后两个维度进行批处理矩阵乘法torch.bmm或类似操作这样能利用硬件的最佳性能。4. 实验验证与结果分析数据说了算理论和方法再漂亮最终还是要看实际效果。我们在LLaMA-3模型家族上进行了全面的实验覆盖了预训练模型LLaMA3-8B, LLaMA3.2-3B和指令微调模型LLaMA3-8B-Instruct, LLaMA3.1-8B-Instruct均采用MXFP4 W4A4量化设置。4.1 量化误差的直观对比在我们论文的图1中我们可视化了LLaMA3-8B所有32层中三个关键位置QKV投影输入、O投影输入、Down投影输入的MXFP4组内归一化量化误差。对比了三组设置Original直接量化原始激活。Hadamard应用块大小为32的随机哈达玛德旋转MR-GPTQ/BRQ方法。DuQuant应用我们提出的、块大小为32的感知异常值旋转。结果一目了然原始激活误差最高且波动大尤其是在Down投影输入层误差显著高于其他位置印证了海量异常值的破坏力。随机哈达玛德旋转有效降低了误差说明旋转“搅匀”的思路是对的。DuQuant即DuQuant的旋转核心 consistently始终取得了最低的量化误差并且在所有层和所有位置上都最为稳定。在Down投影输入这个硬骨头上优势最为明显。这张图强有力地证明了针对异常值结构进行“精准打击”的旋转远优于“盲目搅匀”的随机旋转。4.2 端到端性能基准测试我们使用WikiText-2和C4的语言建模困惑度PPL以及7个零样本QA任务ARC-E, ARC-C, HellaSwag, WinoGrande, LAMBADA, PIQA, OpenBookQA的平均准确率作为评估指标。对比的基线包括QuaRot全局随机旋转、FlatQuant可学习旋转和MR-GPTQ块随机旋转GPTQ。核心结论如下数据见原文Table 1 21. DuQuant consistently achieves the best overall performance.DuQuant始终取得最佳综合性能在LLaMA3-8B上DuQuant*结合GPTQ取得了WikiText-2 PPL 6.88平均准确率67.1%。相比最强的基线MR-GPTQPPL 7.29准确率66.1%在PPL上领先0.41准确率领先1.0%。与FP16基线PPL 6.14准确率69.1%的差距缩小到仅0.74 PPL和2.0%准确率。在更小的LLaMA3.2-3B上DuQuant*将困惑度从QuaRot的17.95大幅降低至8.87相对提升超过50%并取得了最高的平均准确率61.8%。2. Fine-grained rotation is more effective than global rotation for MXFP4.细粒度旋转对MXFP4比全局旋转更有效QuaRot全局随机旋转在所有设置中表现都较差特别是在小模型上性能崩溃LLaMA3.2-3B上PPL高达17.95。这清晰地表明破坏MXFP4块结构的全局操作是低效甚至有害的。DuQuant的细粒度、块对齐旋转在保持硬件友好性的同时实现了最佳的精度-效率平衡。3. GPTQ provides complementary benefits.GPTQ提供互补性收益比较DuQuant和DuQuant*两行数据可以看到引入GPTQ进行权重量化在所有模型上都能一致地进一步提升PPL和准确率。例如在LLaMA3-8B上PPL从7.07降至6.88准确率从66.5%提升至67.1%。这证明激活平滑DuQuant和权重误差补偿GPTQ是两条正交的、可叠加的优化路径。4. Generalization to instruction-tuned models.泛化到指令微调模型DuQuant在指令微调模型LLaMA3-8B-Instruct, LLaMA3.1-8B-Instruct上同样保持了领先优势。例如在LLaMA3.1-8B-Instruct上DuQuant*取得了7.89的PPL非常接近FP16基线的7.21同时平均准确率仅下降1.9%。这说明从校准数据学习到的旋转模式对不同训练范式预训练 vs. 指令微调的模型都具有良好的泛化能力。4.3 消融实验与成本分析除了主实验我们还进行了一些内部消融实验这里分享一些关键发现旋转块大小B尝试了16, 32, 64, 128。B32对齐MXFP4始终是最优的。B16过于细碎旋转带来的收益难以抵消其开销B64或更大则粒度太粗无法精准处理每个MXFP4组内部的问题。共享旋转矩阵对比了“每层独立矩阵”、“每层共享矩阵”、“全局共享矩阵”。结果表明所有层共享同一个通过“最坏组”搜索得到的矩阵其效果与每层独立搜索相差无几但存储和计算成本大大降低。这支持了“异常值模式具有跨层相似性”的假设。在线计算开销实测表明DuQuant的在线旋转X · \hat{R}带来的延迟增加在A100/BLACKWELL等支持小型矩阵乘法的硬件上仅占整个推理时间的1%-3%。考虑到其带来的显著精度提升这个开销是完全可接受的。5. 常见问题、排查技巧与部署建议在实际尝试复现或部署DuQuant时你可能会遇到以下问题。这里我总结了一份“避坑指南”。5.1 精度复现问题问题我按照论文方法实现了但量化后的模型困惑度比论文报告的高不少。排查思路校准数据确认你的校准数据是否与论文一致WikiText-2128条序列长度2048。数据不同会导致学到的旋转矩阵有差异。确保不要使用训练数据。平滑参数α论文中默认使用α0.5。但对于某些模型或层可能需要微调。建议在0.4到0.6之间网格搜索选择在验证集上PPL最好的值。Down Projection层通常对α更敏感。旋转矩阵构造的“最坏组”确保你的贪婪搜索是针对激活张量的绝对值最大值进行的并且是在应用了平滑变换X · Λ^{-1}之后的数据上搜索。搜索的目标是最小化变换后该组的L∞范数。GPTQ集成如果使用DuQuant*确保GPTQ的量化过程是应用于旋转并缩放后的权重\hat{W}而不是原始权重W。同时GPTQ本身的参数块大小、阻尼因子等需要仔细设置。可以参考GPTQ官方实现或MR-GPTQ中对MXFP4的适配。量化细节MXFP4的舍入模式是“最近舍入”round-to-nearest。确保你的量化模拟器用于计算量化后权重/激活的前向传播严格遵循MXFP4的格式定义块大小32E8M0缩放因子。一个常见的错误是错误地实现了缩放因子的计算或表示范围。5.2 推理速度与内存问题问题加入在线旋转后推理速度变慢或者内存占用增加。排查与优化融合操作在线计算是X · Λ^{-1} · \hat{R}。Λ^{-1}是逐通道缩放可以非常容易地与LayerNorm的输出如果存在或者前一个算子的输出进行融合。· \hat{R}是块对角乘法。在推理框架中应将这两个操作融合成一个内核kernel来执行避免多次读写中间张量。利用硬件特性\hat{R}是32x32的小型稠密正交矩阵。现代GPU如NVIDIA Tensor Core对这类小型矩阵乘法有很高效率。确保你的实现使用高效的批处理GEMM通用矩阵乘法调用而不是用循环实现。权重存储\hat{W}是离线计算并量化的。存储的是MXFP4格式的\hat{W}而不是原始权重W。因此模型文件的大小就是标准的MXFP4量化模型的大小没有额外存储旋转矩阵\hat{R}。\hat{R}作为推理时的一个小常数矩阵32x32FP16或FP32内存占用可忽略不计。仅关键层应用如果对极致速度有要求可以分析哪些层量化误差最大通常是Attention中的QKV投影和FFN中的Down投影。可以只对这些层应用DuQuant旋转对其他层使用更简单的方法如仅SmoothQuant进行速度-精度权衡。5.3 扩展到其他模型与任务问题DuQuant在LLaMA上有效能用于其他架构如GPT、OPT、ChatGLM或其他任务视觉、多模态吗经验与建议架构泛化性DuQuant的核心思想——针对微缩格式的块对齐、感知异常值的旋转——是通用的。只要模型使用MXFP4或类似块共享缩放因子的格式如NVFP4且激活存在异常值该方法就适用。我们已在内部的一些GPT类模型和视觉Transformer上验证有效。多模态模型对于VLMs视觉语言模型图像编码器输出的特征图可能具有不同的异常值分布。建议分别对语言部分和视觉部分使用独立的校准集来构造旋转矩阵或者使用混合数据校准。超参数调整对于非LLaMA架构最优的平滑参数α和旋转搜索步数K可能需要重新调整。建议在一个小的开发集上进行快速的超参数扫描。5.4 与硬件部署的协同问题如何将DuQuant量化后的模型部署到实际支持MXFP4的硬件上部署流程建议量化与转换在PyTorch等训练框架中完成DuQuant的校准、旋转矩阵构造、权重变换和量化得到量化后的模型状态字典。模型导出将量化后的权重和必要的元数据如每层的缩放因子Λ、旋转矩阵\hat{R}导出为硬件厂商要求的格式如ONNX、TensorRT的.plan文件。注意Λ和\hat{R}需要作为常数或属性嵌入到计算图中。内核实现与硬件厂商或推理引擎团队协作实现融合算子Fused_Smooth_Rotate该算子接收输入X依次执行X · Λ^{-1} · \hat{R}。这个融合算子应该作为MXFP4线性层的前置操作。精度验证在目标硬件上运行量化模型并与FP16参考模型在标准数据集上的输出进行逐层或最终输出的数值对比确保误差在可接受范围内。最后我想分享一点个人体会。在低比特量化的道路上没有银弹。DuQuant的成功在于它没有试图用一个复杂通用的方法去解决所有问题而是深刻理解了MXFP4这个特定格式的“脾气”块内耦合块间独立并为之量身定制了一个简单而精准的解决方案块对齐的感知异常值旋转。这种“格式感知”的设计思路可能是未来面向多样化硬件定制化量化格式的关键。在实际工作中当你拿到一种新的硬件格式时第一件事应该是深入理解它的数值表示和计算特性然后思考你的算法如何与之契合而不是粗暴地把旧方法套用上去。DuQuant的代码已开源欢迎大家试用、反馈并在此基础上探索更多可能性。
DuQuant++:针对MXFP4激活异常值的块对齐旋转量化优化方案
发布时间:2026/6/1 8:28:00
1. 项目概述当MXFP4遇上激活异常值我们如何破局在大型语言模型LLM的实际部署中我们这些一线工程师和研究者最头疼的问题之一就是如何在有限的硬件资源上让这些“庞然大物”跑得又快又好。模型量化尤其是将权重和激活值都压缩到极低比特如W4A4几乎是必由之路。它背后的原理并不复杂本质上是通过一个缩放因子scale和零点zero point将高精度的浮点数映射到有限的整数或低精度浮点表示上从而大幅降低模型的内存占用和计算开销。然而理想很丰满现实却很骨感。当你真正动手把FP16的LLaMA模型往4比特上压时会发现性能掉得厉害而罪魁祸首往往就是激活张量里那些不听话的“异常值”。这些异常值有些是普遍偏大的“常规异常值”有些则是集中在少数token上、数值巨大的“海量异常值”。在传统的每通道或每令牌量化中它们已经够麻烦了但在像MXFP4这样的微缩格式里问题被进一步放大。MXFP4的设计很巧妙它将张量分成32个元素一组的小块组内共享一个E8M0格式的缩放因子。这个设计硬件友好在NVIDIA Blackwell Tensor Core上能有原生支持效率很高。但它的副作用也很明显只要一个组里出现一个异常值整个组的共享缩放因子就会被这个“坏家伙”撑大导致组内其他正常值的动态范围被严重压缩量化误差激增。这就好比一个木桶因为一块长板异常值的存在导致所有其他短板正常值的盛水能力表示精度都被迫拉高到不切实际的水平最终整体效果反而更差。现有的应对方法比如随机哈达玛德旋转或者可学习的全局旋转思路是通过正交变换把异常值的能量“摊平”到各个维度上。但我在实践中发现这些方法有个根本的缺陷它们是“数据无关”的。旋转矩阵要么是固定的随机矩阵要么是通过优化学习得到一个全局矩阵它们并不知道异常值具体藏在哪个通道里。这就好比用一把大扫帚漫无目的地扫地虽然也能扫到一些垃圾但效率低下对于顽固的污渍集中在特定通道的海量异常值往往力不从心。更重要的是全局旋转会破坏MXFP4格式固有的块间独立性给硬件实现和计算带来额外的复杂性。正是基于这些在实际量化工作中反复遇到的痛点我们提出了DuQuant。它的核心思想非常直接既然MXFP4以32个元素为一个组进行独立量化那我们的优化手段也应该精准地作用于这个“组”内部。我们将旋转的粒度与MXFP4的微缩组大小对齐B32为每个组设计一个能够感知组内异常值分布的数据依赖型旋转矩阵。这个设计带来一个关键简化因为每个MXFP4组有自己的缩放因子组与组之间的量化误差互不影响原来在整数量化中为了平衡组间方差而必需的“之字形”排列和第二轮旋转在这里变得多余了。因此DuQuant可以用一次精准的、感知异常值的旋转替代原先复杂的双旋转加排列流程在线计算成本直接减半同时还能更有效地平滑权重分布。下面我就结合大量实验和踩过的坑来详细拆解DuQuant的设计、实现细节以及那些论文里不会写的实操心得。2. 核心思路拆解为什么对齐块大小是关键一招要理解DuQuant为何有效我们需要深入MXFP4的量化机制和异常值的破坏原理。这不仅仅是理论推演更是在无数次实验失败后总结出的经验。2.1 MXFP4量化误差的放大效应MXFP4的量化过程可以简化为两步首先找到组内32个元素的绝对值最大值根据这个最大值计算出一个共享的缩放因子sj然后用这个缩放因子去归一化组内每一个元素并将其舍入到最接近的4比特浮点表示。公式虽然简洁但隐患就藏在sj的计算里。假设一个MXFP4组内的数值是[0.1, 0.2, 0.3, 1024.0, 0.4, ...]。那个1024.0的海量异常值会直接决定sj的大小。为了能表示1024.0sj必须足够大。当用这个巨大的sj去归一化0.1、0.2这些正常值时它们会被压缩到一个非常小的区间内。在4比特有限的表示精度下这些被压缩后的正常值在舍入时会产生巨大的相对误差。量化误差不再均匀分布而是异常值“绑架”了整个组的精度预算。我们在LLaMA-3的Down Projection层输入处观察到了大量这类现象这也是该层量化后性能损失最严重的根本原因。2.2 现有旋转方法的局限为何“数据无关”不行面对组内异常值一个直观的想法是“搅匀它”。随机哈达玛德旋转如MR-GPTQ、BRQ采用的方法确实能起到一定的均匀化作用。它像一个高速搅拌器把组内32个元素随机混合。但是它有两个问题盲目性它不知道异常值在哪个位置旋转是固定的、随机的可能一次旋转恰好把几个大值又凑到了一起反而加剧了问题。粒度不匹配有些方法使用全局旋转如QuaRot这破坏了MXFP4的块结构使得硬件无法高效利用其原生支持同时全局混合也可能把不同组的异常值问题耦合在一起增加了优化难度。可学习的旋转如FlatQuant虽然能根据数据优化但其优化目标通常是全局的量化损失计算开销大且学到的旋转矩阵可能对校准集过拟合泛化到新数据时效果不稳定。2.3 DuQuant的破局点粒度对齐与方差解耦DuQuant的灵感来源于我们之前的工作DuQuant但其简化得益于MXFP4的格式特性。原来的DuQuant针对整数量化设计需要两次旋转加一次排列核心是为了解决组间方差问题。因为整数量化通常使用全局或每通道的缩放因子一个组经过旋转平滑后可能把高方差转移到另一个组导致那个组的量化误差变大。所以需要排列操作来重新分配再用第二次旋转进行局部平滑。MXFP4格式天然解决了组间方差问题因为每个组32元素拥有完全独立的缩放因子sj。第1组的异常值只会撑大第1组的sj与第2组的sj毫无关系。这意味着我们只需要关心组内的分布是否平滑即可组与组之间是“老死不相往来”的。因此DuQuant的核心设计变得极其清晰粒度对齐将旋转的块大小B严格设置为32与MXFP4的微缩组大小一一对应。一个旋转块正好处理一个MXFP4组。单次精准打击为每个这样的块实际中所有块共享同一个设计好的矩阵构建一个数据依赖的、感知异常值的正交旋转矩阵\hat{R}。这个矩阵的构造目标非常明确找到组内异常值最集中的那个维度然后通过旋转将这个维度的能量即异常值分散到组内其他31个维度上去。流程简化由于无需处理组间影响复杂的之字形排列和第二次旋转被彻底移除。整个在线变换简化为X - X · \hat{R}。这个设计带来了双重好处计算成本减半一次旋转 vs. 两次旋转排列同时效果更精准旋转直接针对最严重的异常值通道。我们在LLaMA-3各层的量化误差分析中见图1清晰看到这种对齐的、感知异常值的旋转在QKV输入、O投影输入尤其是Down投影输入海量异常值重灾区上其组内归一化量化误差均显著且稳定地低于原始值和无目标的随机哈达玛德旋转。实操心得理解“独立缩放因子”是关键很多刚接触MXFP4的同行会下意识地用处理INT4量化如GPTQ、AWQ的思维来处理它总想着如何平衡不同通道或不同token之间的范围。这是一个误区。在MXFP4的语境下你的优化战场被清晰地划分为了一个个32元素的“独立王国”。你的所有战术旋转、平滑都应该以“王国”内部为边界。强行引入全局操作不仅可能无效还会增加不必要的开销并破坏硬件友好性。时刻记住MXFP4下没有“全局缩放因子”需要你去保护。3. 方法实现详解从平滑到旋转的完整流水线理解了“为什么”之后我们来看“怎么做”。DuQuant的整个流程可以无缝嵌入到标准的训练后量化PTQ流程中仅需一个小的校准集。下面我分步拆解并附上关键的实现细节和参数选择依据。3.1 第一步平滑变换——分担量化压力在应用旋转之前我们首先采用一个经典的预处理步骤SmoothQuant。这一步的目的是在权重和激活之间迁移量化难度。激活值中的异常值通常比权重中的更尖锐、更难量化。SmoothQuant通过一个逐通道的缩放矩阵Λ将激活值的幅度缩小同时将权重的幅度放大从而在数学等价的前提下让权重“分担”一部分量化压力。具体操作如下 对于线性层Y X · W我们将其重写为Y (X · Λ^{-1}) · (Λ · W)其中Λ是一个对角矩阵其第j个对角线元素Λ_j max(|X_j|)^α / max(|W_j|)^{1-α}。这里的α是一个超参数控制迁移的强度。α0.5表示平均分配。max(|X_j|)和max(|W_j|)是从校准数据中统计得到的该通道激活和权重的绝对值最大值。为什么先做平滑因为旋转操作尤其是我们后面要做的细粒度旋转其计算成本与数据范围有一定关系。先通过平滑把激活值的极端异常值压下来一些可以为后续的旋转创造一个数值上更“温和”的环境有时能让旋转搜索过程更稳定、更快收敛。但要注意平滑主要对付的是“常规异常值”对于那种突兀的“海量异常值”效果有限这就需要旋转出场了。3.2 第二步构造感知异常值的块对角旋转矩阵这是DuQuant的核心。我们的目标是构造一个块对角正交矩阵\hat{R}其每个块\hat{R}_bi的大小是32x32并且是数据依赖的。构造算法贪婪搜索假设我们有一个校准激活张量X_calib其形状为[序列长度, 通道数]。我们将通道维度按32分组。定位最坏组遍历所有32元素的组计算每个组原始激活的L∞范数即组内绝对值最大值。找到拥有最大L∞范数的那个组记为X_worst。这个组包含了当前最严重的异常值集中区域。初始化旋转矩阵从单位矩阵I_{32x32}开始。迭代优化进行最多K步例如128步的贪婪搜索。在每一步 a.寻找目标维度在当前X_worst中找到绝对值最大的那个元素所在的维度d即异常值最集中的通道。 b.生成候选旋转尝试将维度d与组内其他31个维度分别进行一次Givens旋转一种2x2的正交变换用于混合两个维度的值。每次旋转都会产生一个新的候选矩阵。 c.评估效果用每个候选矩阵左乘X_worst计算变换后张量的L∞范数。 d.选择最优选择能使L∞范数降低最多的那个Givens旋转。 e.更新矩阵将当前旋转矩阵与这个最优的Givens旋转矩阵相乘。 f.更新数据用这个最优Givens旋转更新X_worst。矩阵共享上述过程只针对那个“最坏组”X_worst进行搜索。搜索完成后我们得到最终的32x32旋转矩阵\hat{R}_b。关键的一步是我们将这个矩阵复用于所有其他组。即\hat{R} BlockDiag(\hat{R}_b, \hat{R}_b, ..., \hat{R}_b)。这是因为我们假设不同组的异常值分布模式是相似的共享矩阵极大地减少了存储开销从K个矩阵降到1个且在实践中被证明有效。为什么用贪婪搜索而不是优化求解理论上我们可以定义一个最小化变换后张量L∞范数的优化问题。但直接求解这个非凸问题非常困难。贪婪搜索每次找最坏的维度做最好的2维旋转是一种高效且实用的启发式方法。它每次迭代都能显著降低峰值通常几十步后就能得到非常平滑的分布。我们的实验表明128步已经足够继续增加步数收益甚微。3.3 第三步应用旋转与权重吸收得到旋转矩阵\hat{R}后我们将变换应用于线性层Y X · W (X · Λ^{-1} · \hat{R}) · (\hat{R}^T · Λ · W)令\hat{X} X · Λ^{-1} · \hat{R}\hat{W} \hat{R}^T · Λ · W。在线与离线成本分析在线推理时对于输入激活X我们需要计算X · Λ^{-1} · \hat{R}。Λ^{-1}是逐通道缩放成本极低。· \hat{R}是一个32x32的块对角矩阵乘法。由于\hat{R}是块对角的这个乘法可以完全在组内进行并行度极高并且可以利用硬件对小型稠密矩阵乘法的优化。相比原DuQuant的双旋转成本减半。离线量化准备时权重变换\hat{W} \hat{R}^T · Λ · W可以提前计算好。因为\hat{R}是正交矩阵这个变换是严格无损的。变换后的权重\hat{W}被量化存储。这意味着推理时模型加载的已经是变换并量化后的权重没有任何额外的旋转开销。旋转的成本被完全“吸收”到了权重中。一个重要的副作用权重平滑注意旋转不仅作用于激活也通过\hat{R}^T作用于权重。这带来了一个额外的好处权重分布也被平滑了。特别是在Down Projection层SmoothQuant的缩放可能会在权重中引入新的异常值。旋转操作可以有效地缓解这个问题使得权重本身也更容易被量化。3.4 与GPTQ等权重量化方法的结合DuQuant主要解决激活量化的问题。对于权重量化我们可以直接使用现成的、强大的方法如GPTQ。GPTQ通过二阶信息来迭代地补偿权重量化误差效果非常好。在DuQuant中我们有两种结合方式DuQuant仅使用上述的平滑和旋转处理激活权重使用简单的Round-To-NearestRTN量化。DuQuant*激活使用DuQuant处理权重则应用GPTQ进行量化。我们的实验结果表明见后文两者是互补的。DuQuant旋转为权重和激活创造了一个更易于量化的平滑分布而GPTQ在此基础上进一步精细地减少了权重量化误差从而实现了最佳的整体性能。实现陷阱与技巧校准数据的选择贪婪搜索依赖校准数据来构造旋转矩阵。校准数据必须有代表性。我们通常从验证集如WikiText-2中随机抽取128个长度为2048的序列。切忌使用训练集以免引入偏见。序列长度应覆盖模型典型的上下文长度。搜索步数K这是一个权衡超参数。步数越多平滑效果可能越好但搜索时间越长。我们发现对于LLaMA-3这类模型128步是一个很好的平衡点继续增加对最终量化精度提升不大。数值稳定性Givens旋转涉及三角函数计算。在实现时要使用双精度进行搜索和矩阵构造确保正交性。构造好的单精度矩阵\hat{R}在应用于FP16数据时是足够稳定的。块对角矩阵的乘法优化在实现X · \hat{R}时不要傻傻地用大的稀疏矩阵乘法。应该将输入X在通道维度上重塑为[..., K, 32]然后对最后两个维度进行批处理矩阵乘法torch.bmm或类似操作这样能利用硬件的最佳性能。4. 实验验证与结果分析数据说了算理论和方法再漂亮最终还是要看实际效果。我们在LLaMA-3模型家族上进行了全面的实验覆盖了预训练模型LLaMA3-8B, LLaMA3.2-3B和指令微调模型LLaMA3-8B-Instruct, LLaMA3.1-8B-Instruct均采用MXFP4 W4A4量化设置。4.1 量化误差的直观对比在我们论文的图1中我们可视化了LLaMA3-8B所有32层中三个关键位置QKV投影输入、O投影输入、Down投影输入的MXFP4组内归一化量化误差。对比了三组设置Original直接量化原始激活。Hadamard应用块大小为32的随机哈达玛德旋转MR-GPTQ/BRQ方法。DuQuant应用我们提出的、块大小为32的感知异常值旋转。结果一目了然原始激活误差最高且波动大尤其是在Down投影输入层误差显著高于其他位置印证了海量异常值的破坏力。随机哈达玛德旋转有效降低了误差说明旋转“搅匀”的思路是对的。DuQuant即DuQuant的旋转核心 consistently始终取得了最低的量化误差并且在所有层和所有位置上都最为稳定。在Down投影输入这个硬骨头上优势最为明显。这张图强有力地证明了针对异常值结构进行“精准打击”的旋转远优于“盲目搅匀”的随机旋转。4.2 端到端性能基准测试我们使用WikiText-2和C4的语言建模困惑度PPL以及7个零样本QA任务ARC-E, ARC-C, HellaSwag, WinoGrande, LAMBADA, PIQA, OpenBookQA的平均准确率作为评估指标。对比的基线包括QuaRot全局随机旋转、FlatQuant可学习旋转和MR-GPTQ块随机旋转GPTQ。核心结论如下数据见原文Table 1 21. DuQuant consistently achieves the best overall performance.DuQuant始终取得最佳综合性能在LLaMA3-8B上DuQuant*结合GPTQ取得了WikiText-2 PPL 6.88平均准确率67.1%。相比最强的基线MR-GPTQPPL 7.29准确率66.1%在PPL上领先0.41准确率领先1.0%。与FP16基线PPL 6.14准确率69.1%的差距缩小到仅0.74 PPL和2.0%准确率。在更小的LLaMA3.2-3B上DuQuant*将困惑度从QuaRot的17.95大幅降低至8.87相对提升超过50%并取得了最高的平均准确率61.8%。2. Fine-grained rotation is more effective than global rotation for MXFP4.细粒度旋转对MXFP4比全局旋转更有效QuaRot全局随机旋转在所有设置中表现都较差特别是在小模型上性能崩溃LLaMA3.2-3B上PPL高达17.95。这清晰地表明破坏MXFP4块结构的全局操作是低效甚至有害的。DuQuant的细粒度、块对齐旋转在保持硬件友好性的同时实现了最佳的精度-效率平衡。3. GPTQ provides complementary benefits.GPTQ提供互补性收益比较DuQuant和DuQuant*两行数据可以看到引入GPTQ进行权重量化在所有模型上都能一致地进一步提升PPL和准确率。例如在LLaMA3-8B上PPL从7.07降至6.88准确率从66.5%提升至67.1%。这证明激活平滑DuQuant和权重误差补偿GPTQ是两条正交的、可叠加的优化路径。4. Generalization to instruction-tuned models.泛化到指令微调模型DuQuant在指令微调模型LLaMA3-8B-Instruct, LLaMA3.1-8B-Instruct上同样保持了领先优势。例如在LLaMA3.1-8B-Instruct上DuQuant*取得了7.89的PPL非常接近FP16基线的7.21同时平均准确率仅下降1.9%。这说明从校准数据学习到的旋转模式对不同训练范式预训练 vs. 指令微调的模型都具有良好的泛化能力。4.3 消融实验与成本分析除了主实验我们还进行了一些内部消融实验这里分享一些关键发现旋转块大小B尝试了16, 32, 64, 128。B32对齐MXFP4始终是最优的。B16过于细碎旋转带来的收益难以抵消其开销B64或更大则粒度太粗无法精准处理每个MXFP4组内部的问题。共享旋转矩阵对比了“每层独立矩阵”、“每层共享矩阵”、“全局共享矩阵”。结果表明所有层共享同一个通过“最坏组”搜索得到的矩阵其效果与每层独立搜索相差无几但存储和计算成本大大降低。这支持了“异常值模式具有跨层相似性”的假设。在线计算开销实测表明DuQuant的在线旋转X · \hat{R}带来的延迟增加在A100/BLACKWELL等支持小型矩阵乘法的硬件上仅占整个推理时间的1%-3%。考虑到其带来的显著精度提升这个开销是完全可接受的。5. 常见问题、排查技巧与部署建议在实际尝试复现或部署DuQuant时你可能会遇到以下问题。这里我总结了一份“避坑指南”。5.1 精度复现问题问题我按照论文方法实现了但量化后的模型困惑度比论文报告的高不少。排查思路校准数据确认你的校准数据是否与论文一致WikiText-2128条序列长度2048。数据不同会导致学到的旋转矩阵有差异。确保不要使用训练数据。平滑参数α论文中默认使用α0.5。但对于某些模型或层可能需要微调。建议在0.4到0.6之间网格搜索选择在验证集上PPL最好的值。Down Projection层通常对α更敏感。旋转矩阵构造的“最坏组”确保你的贪婪搜索是针对激活张量的绝对值最大值进行的并且是在应用了平滑变换X · Λ^{-1}之后的数据上搜索。搜索的目标是最小化变换后该组的L∞范数。GPTQ集成如果使用DuQuant*确保GPTQ的量化过程是应用于旋转并缩放后的权重\hat{W}而不是原始权重W。同时GPTQ本身的参数块大小、阻尼因子等需要仔细设置。可以参考GPTQ官方实现或MR-GPTQ中对MXFP4的适配。量化细节MXFP4的舍入模式是“最近舍入”round-to-nearest。确保你的量化模拟器用于计算量化后权重/激活的前向传播严格遵循MXFP4的格式定义块大小32E8M0缩放因子。一个常见的错误是错误地实现了缩放因子的计算或表示范围。5.2 推理速度与内存问题问题加入在线旋转后推理速度变慢或者内存占用增加。排查与优化融合操作在线计算是X · Λ^{-1} · \hat{R}。Λ^{-1}是逐通道缩放可以非常容易地与LayerNorm的输出如果存在或者前一个算子的输出进行融合。· \hat{R}是块对角乘法。在推理框架中应将这两个操作融合成一个内核kernel来执行避免多次读写中间张量。利用硬件特性\hat{R}是32x32的小型稠密正交矩阵。现代GPU如NVIDIA Tensor Core对这类小型矩阵乘法有很高效率。确保你的实现使用高效的批处理GEMM通用矩阵乘法调用而不是用循环实现。权重存储\hat{W}是离线计算并量化的。存储的是MXFP4格式的\hat{W}而不是原始权重W。因此模型文件的大小就是标准的MXFP4量化模型的大小没有额外存储旋转矩阵\hat{R}。\hat{R}作为推理时的一个小常数矩阵32x32FP16或FP32内存占用可忽略不计。仅关键层应用如果对极致速度有要求可以分析哪些层量化误差最大通常是Attention中的QKV投影和FFN中的Down投影。可以只对这些层应用DuQuant旋转对其他层使用更简单的方法如仅SmoothQuant进行速度-精度权衡。5.3 扩展到其他模型与任务问题DuQuant在LLaMA上有效能用于其他架构如GPT、OPT、ChatGLM或其他任务视觉、多模态吗经验与建议架构泛化性DuQuant的核心思想——针对微缩格式的块对齐、感知异常值的旋转——是通用的。只要模型使用MXFP4或类似块共享缩放因子的格式如NVFP4且激活存在异常值该方法就适用。我们已在内部的一些GPT类模型和视觉Transformer上验证有效。多模态模型对于VLMs视觉语言模型图像编码器输出的特征图可能具有不同的异常值分布。建议分别对语言部分和视觉部分使用独立的校准集来构造旋转矩阵或者使用混合数据校准。超参数调整对于非LLaMA架构最优的平滑参数α和旋转搜索步数K可能需要重新调整。建议在一个小的开发集上进行快速的超参数扫描。5.4 与硬件部署的协同问题如何将DuQuant量化后的模型部署到实际支持MXFP4的硬件上部署流程建议量化与转换在PyTorch等训练框架中完成DuQuant的校准、旋转矩阵构造、权重变换和量化得到量化后的模型状态字典。模型导出将量化后的权重和必要的元数据如每层的缩放因子Λ、旋转矩阵\hat{R}导出为硬件厂商要求的格式如ONNX、TensorRT的.plan文件。注意Λ和\hat{R}需要作为常数或属性嵌入到计算图中。内核实现与硬件厂商或推理引擎团队协作实现融合算子Fused_Smooth_Rotate该算子接收输入X依次执行X · Λ^{-1} · \hat{R}。这个融合算子应该作为MXFP4线性层的前置操作。精度验证在目标硬件上运行量化模型并与FP16参考模型在标准数据集上的输出进行逐层或最终输出的数值对比确保误差在可接受范围内。最后我想分享一点个人体会。在低比特量化的道路上没有银弹。DuQuant的成功在于它没有试图用一个复杂通用的方法去解决所有问题而是深刻理解了MXFP4这个特定格式的“脾气”块内耦合块间独立并为之量身定制了一个简单而精准的解决方案块对齐的感知异常值旋转。这种“格式感知”的设计思路可能是未来面向多样化硬件定制化量化格式的关键。在实际工作中当你拿到一种新的硬件格式时第一件事应该是深入理解它的数值表示和计算特性然后思考你的算法如何与之契合而不是粗暴地把旧方法套用上去。DuQuant的代码已开源欢迎大家试用、反馈并在此基础上探索更多可能性。