ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

打破 INT4 的诅咒:基于数值聚类的分组量化,实现 7.06 bpp 下的近无损压缩

打破 INT4 的诅咒:基于数值聚类的分组量化,实现 7.06 bpp 下的近无损压缩 在大语言模型LLM的部署战场上量化技术早已不是新鲜事。从 FP16 到 INT8再到 INT4我们不断压榨模型的存储空间试图在精度损失与推理速度之间寻找那个微妙的平衡点。然而当我们把目光投向更低的比特宽度时往往会撞上一堵墙量化噪声。标准量化方法无论是对称还是非对称依赖于一个全局或分组的scale缩放因子而误差的来源恰恰就是这个scale。今天我们要深入解析一种名为聚类分组量化Clustering-based Group Quantization的创新方案。它抛弃了传统的“重要性分层”思维转而利用K-Means 聚类的数学美感在7.06 bpp每权重比特数的惊人密度下实现了近乎无损的模型性能困惑度损失仅 0.0018。这不仅仅是一个算法的改进更是对量化本质的一次深刻洞察。一、 量化之痛为什么标准方法不够好在深入新方案之前我们必须先理解传统量化的瓶颈在哪里。1. 误差的根源Scale 决定一切在对称量化中我们有一个经典的误差公式误差≈scale2(bit−1) \text{误差} \approx \frac{\text{scale}}{2^{(\text{bit} - 1)}}误差≈2(bit−1)scale​其中scalemax⁡(∣w∣) \text{scale} \max(|w|)scalemax(∣w∣)核心矛盾在于scale是由组内绝对值最大的权重决定的。如果一个权重组里大部分权重都很小比如 0.01但混进了一个异常值比如 10.0为了覆盖这个 10.0scale会被迫变得很大。结果就是那些 0.01 的小权重在量化时被巨大的scale淹没相对误差急剧增加。这就好比用一把丈量大象的尺子去量蚂蚁蚂蚁的尺寸自然就测不准了。2. 现有方案的挣扎为了缓解这一问题业界尝试了各种方法按重要性分层给重要的权重更多比特给不重要的权重更少比特。但这并没有解决“组内数值范围过大”的根本问题且在“不重要”的组内依然浪费了比特。Mask Outlier 保护专门标记并处理离群值。但这引入了复杂的控制流和额外的存储开销。我们需要一种更本质的解决方案如何让每一组内的权重数值范围尽可能小二、 破局之道数值聚类聚类分组量化给出的答案是让数值接近的权重自动归为一类。量化误差 scale / 2^(位宽)。把数值接近的权重归为一组组内范围最小 → scale 最小 → 量化步长最小 → 误差最小。这就是该方案的灵魂所在。它不再关心权重“重要不重要”只关心权重“像不像”。核心架构Mask Scale在这个方案中每个权重不再仅仅存储量化后的整数而是存储两部分信息Mask掩码/组索引这是一个指向“组别”的指针。组内低位整数该权重在其所属小组内的相对值。每组共享一个独立的scale和一个center中心点。三、 算法深潜它是如何工作的让我们拆解这个方案的执行流程你会发现它既优雅又高效。1. 编码阶段K-Means 聚类这是预处理阶段非推理阶段也是精度的保障。聚类 (Clustering)将扁平化的权重张量WWW送入 K-Means 算法。这里我们按数值大小进行聚类而不是按位置。算法会找到KKK个簇中心ckc_kck​。分配标签 (Labeling)对于每一个权重wiw_iwi​计算它与各个中心的距离将其分配到最近的中心所在的组。这个分配的编号就是mask[i]。mask[i]arg⁡min⁡k∣wi−ck∣ \text{mask}[i] \underset{k}{\arg\min} |w_i - c_k|mask[i]kargmin​∣wi​−ck​∣计算 Scale对于每个组kkk计算组内所有权重相对于中心ckc_kck​的最大残差以此作为该组的scale_k。scalekmax⁡(∣wi−ck∣),∀i∈group k \text{scale}_k \max(|w_i - c_k|), \quad \forall i \in \text{group } kscalek​max(∣wi​−ck​∣),∀i∈groupk2. 量化阶段组内低位编码有了中心和缩放因子我们就可以对残差进行低比特量化resiwi−ck \text{res}_i w_i - c_kresi​wi​−ck​qiround(resiscalek×qmax⁡) q_i \text{round}\left(\frac{\text{res}_i}{\text{scale}_k} \times q_{\max}\right)qi​round(scalek​resi​​×qmax​)其中qmax⁡2(b−1)−1q_{\max} 2^{(b-1)} - 1qmax​2(b−1)−1bbb是组内量化的比特数如 3 或 4。3. 解码阶段GPU 友好的 Gather推理时计算过程非常简单根据mask索引使用gather或index_select操作取出对应的组中心ckc_kck​和scale_k。计算wickqi/qmax⁡×scalekw_i c_k q_i / q_{\max} \times \text{scale}_kwi​ck​qi​/qmax​×scalek​。硬件友好性整个过程主要是查表和乘加运算没有复杂的分支判断非常适合 GPU 并行计算。四、 数据不会说谎惊人的实验结果理论再优美也需要数据支撑。在真实的 Transformer 权重和语料上进行测试结果令人震撼。1. 精度与压缩率的平衡艺术配置bpp (每权重比特数)困惑度损失 (Δ PPL)K16 组组内 4 bit8.060.0002K16 组组内 3 bit7.060.0018K32 组组内 3 bit8.120.0003K128 组组内 3 bit10.500.0000 (无损)解读7.06 bpp 是什么概念相比于原始的 FP1616 bit压缩率达到了2.27倍。0.0018 的困惑度损失意味着什么这意味着模型的表现几乎与原始模型无异。相比之下标准的 INT4 量化4.00 bpp通常会导致 0.2 甚至更高的损失。这是一种质的飞跃。2. 为什么 K16 是“甜点”实验发现分组数量KKK的选择至关重要K 太小如 K4组内不够“纯净”数值范围依然很大导致误差大。K 太大如 K128虽然精度趋近于无损但mask本身需要的比特数log⁡2K\log_2 Klog2​K显著增加导致整体 bpp 上升性价比降低。K16K16K16恰好在索引开销和组内纯度之间取得了最佳平衡。五、 横向对比为何它优于“重要性分层”为了凸显该方案的优越性我们将其与传统的“按重要性分层”方案进行对比维度按重要性分层聚类分组量化分组依据权重相对重要性权重数值接近度位宽分配重要者多 bit每组统一低 bit组内一致性差混合数值极高Range 极小Scale层级共享每组独立完美匹配结果8.10 bpp / Δ0.00107.06 bpp / Δ0.0018关键差异重要性分层试图用不同的精度去“适应”混乱的数值分布而聚类分组量化则是通过重新排列数值让简单的低比特量化就能完美适配。前者是“削足适履”后者是“量体裁衣”。六、 代码实现浅析文档中提供了一个精简的 PyTorch 实现帮助我们理解核心逻辑defcluster_quantize(w,K,bits):valsw.flatten()# 1. 初始化聚类中心 (使用分位数)centerstorch.quantile(vals,torch.linspace(0,1,K1)[1:-1])# 2. K-Means 迭代for_inrange(25):# E步: 分配标签labels(vals.unsqueeze(1)-centers.unsqueeze(0)).abs().argmin(1)# M步: 更新中心forkinrange(K):if(labelsk).any():centers[k]vals[labelsk].mean()# 3. 量化wiw.clone().flatten()qmax2**(bits-1)-1forkinrange(K):m(labelsk)ifm.any():resvals[m]-centers[k]rmaxres.abs().max().clamp_min(1e-30)# 组内低位量化rqtorch.round(res/rmax*qmax).clamp(-qmax,qmax)wi[m]centers[k]rq/qmax*rmaxreturnwi.view(w.shape)这段代码清晰地展示了如何通过迭代优化聚类中心并利用残差量化来最小化信息损失。七、 总结与展望聚类分组量化证明了通过优化数据的排列方式我们可以大幅降低表示的复杂度。它将量化的视角从“如何分配比特”转变为“如何组织数据”。这种基于数值相似度的分组策略有效地将大的数值范围分解为多个小的、可控的范围从而让低比特量化成为可能。局限与未来当然该方法并非完美聚类开销K-Means 需要离线计算但对于一次性部署来说是可接受的。静态聚类目前的聚类是基于权重的静态分析未来可以探索激活感知的聚类考虑激活值的分布。未来的方向十分广阔动态 K 值不同层具有不同的数值分布可以为每一层自适应选择最优的KKK。与无损压缩结合组内的残差可以进一步通过熵编码如算术编码压缩。硬件原生支持设计支持“查表低位乘法”的专用硬件单元。写在最后在追求极致压缩的道路上我们常常以为瓶颈在于算法殊不知瓶颈在于我们对数据结构的理解。聚类分组量化给我们的最大启示或许是当数据被合理地组织起来时最简单的工具如 3-bit 整数也能发挥出惊人的威力。你是否也在为模型部署的显存发愁不妨试试这种基于聚类的量化思路。欢迎在评论区留下你的看法
返回列表