Infra Quant I
🐼 Optimal Brain Compression
模型压缩中最常见的两类方法是剪枝与量化:剪枝通过将部分神经网络权重置零来移除这些权重,量化则通过降低神经网络权重与激活在存储和计算过程中所采用的数值精度来减少资源开销
- 围绕这两类方法,研究界已经提出并分析数百种方案,其总体目标是在尽可能提高压缩率的同时,获得能够保持原有准确率的高效深度神经网络版本
- 尽管该领域已经取得显著进展,模型压缩仍然是一个较为繁琐的过程:剪枝和量化通常彼此独立地进行,而压缩后模型精度的恢复往往还需要对压缩模型进行部分甚至完整的重新训练
一种更具挑战性的替代场景是训练后压缩。在这种设定下,仅拥有一个已经训练完成但尚未压缩的模型,以及少量校准数据,并需要在不进行重新训练、且计算成本受限的条件下,通过一次压缩过程直接生成具有较高准确率的压缩模型
- OBS 利用二阶曲率与参数耦合关系评估权重删除后的最小可补偿损失,较幅值剪枝具有更准确的敏感度刻画。后续方法借助 Hessian 或 Fisher 信息近似将其扩展到现代网络规模,但通常依赖渐进式剪枝和充分微调,因而难以满足少量校准数据、无重新训练的严格训练后压缩条件
- 逐层重构为该场景提供更适合的建模方式:依据校准数据保持各层输入输出映射,将剪枝和量化统一为带不同离散约束的局部逼近问题。量化要求权重落入低比特网格,剪枝要求部分权重固定为零,二者可以共享误差度量与补偿机制。这种统一既提高压缩流程的可组合性,也契合 CPU 和 GPU 对稀疏、低比特格式的联合支持,为复合压缩与实际加速提供算法和硬件基础
提出一种统一处理剪枝与量化的数学压缩框架,并在具有挑战性的训练后压缩场景中取得领先的准确率—压缩率权衡。该框架从前述逐层压缩问题出发:无论全局压缩任务采用剪枝还是量化,首先都依据各层在校准数据上的行为,将其分解为一系列逐层子问题
- 对于由权重
定义、输入为
的第
层,希望在对压缩权重
施加固定压缩约束的条件下,找到一个压缩后的权重版本,使其相对于原始未压缩层的输出差异最小。该差异通过原始层与压缩层作用于校准输入后的平方误差
来衡量
- 尽管在稀疏约束或量化约束下全局最优地求解这一问题属于 NP-hard 问题,但它构成当前先进训练后压缩方法的核心步骤。在逐层求解之后,可以通过组合各层的压缩结果构造完整模型的压缩方案;这种处理方式尤其适合非均匀压缩,因为不同层可以采用不同的压缩强度
逐层压缩问题的求解质量仍有显著提升空间。总体而言,作者将 OBS 框架专门应用于上述平方误差目标。由于该目标具有严格的二次结构,OBS 理论上可以产生精确的逐步贪心解;然而,直接实现需要四次方量级的计算成本,其中表示该层的参数维度,因此难以应用于现代神经网络
- 主要技术贡献是一系列不引入额外近似的高效算法,它们将总体计算成本降低为
,其中
是权重矩阵的列维度。借助这些改进,能够在单张 GPU 上、合理时间内,对包含数千万参数的现代深度神经网络精确执行 OBS 的贪心过程:算法每次只剪除一个权重,并在每一步之后更新全部相关的剩余权重
- OBQ 根据不同权重量化后对损失增长的影响,逐次选择并量化一个权重;随后利用闭式解更新其余尚未量化的权重,以进一步补偿量化误差并降低损失
- 通过这种方式,剪枝与量化得以在同一二阶优化框架下被高效、统一地处理,作者将这一统一框架称为 Optimal Brain Compressor,即 OBC
🦊 Related Work
在逐层压缩框架下,以精确二阶优化替代固定 Hessian、幅值启发式或梯度近似,同时保持各层压缩结果相互独立
- 在 OBS 相关工作中,经典 OBS 依赖完整二阶信息,最初只能处理极小规模网络。WoodFisher 等方法通过块对角 Fisher 近似和逆 Fisher 高效计算,将其扩展到深度网络;L-OBS 进一步把 OBS 应用于逐层二次损失,但只计算一次 Hessian,并据此完成后续全部剪枝。OBC 同样采用逐层 OBS,却在每次删除一个权重后重新更新当前二阶问题和剩余权重,因此获得更准确的贪心剪枝轨迹
- 在训练后量化方面,AdaRound、AdaQuant 和 BRECQ 代表逐层重构路线。AdaRound 优化权重的舍入方向,AdaQuant 允许浮点权重在量化优化过程中继续调整,BRECQ 则引入二阶敏感性并联合优化相关层块。这些方法通常按网络顺序逐层量化,使后续层吸收前层累积误差,精度较高,但层与层之间形成依赖关系;一旦修改某层位宽,后续过程可能需要重新执行。OBC 强调每层独立压缩,使不同层的候选结果可以直接组合,并通过校正 BatchNorm 等统计量缩小与顺序方法之间的差距
- 在训练后稀疏化方面,AdaPrune 先依据权重幅值生成剪枝模式,再重新优化剩余权重以恢复层输出。后续研究表明,剪枝与重优化交替得越频繁,效果通常越好。OBC 将这一思想推进到最细粒度:每删除一个权重便立即对剩余权重进行完整闭式补偿,同时使用包含二阶信息的选择指标,综合评估权重幅值、输入相关性与可补偿性
- 非均匀压缩部分关注如何在延迟、能耗或模型大小预算下为不同层分配不同压缩强度。现有方法分为搜索式和求解器式两类:前者通过强化学习或遗传算法探索逐层配置,后者先构造可求解的松弛问题,再用动态规划等方法选择全局组合。OBC 更适合求解器路线,因为每层都能独立生成多种高质量候选结果;当资源预算或目标硬件变化时,只需重新组合候选配置,无需重新执行整个压缩流程
🦁 Problem Definition and Background
逐层压缩在满足压缩约束的同时,最小化输出重构误差。对于第层,将其表示为作用于输入
、由权重
参数化的函数
。逐层压缩的目标是寻找压缩权重
,使压缩层与原始层的输出尽可能接近,同时满足相应的压缩约束
- 对层输入的期望通常使用少量
个校准样本的平均值近似。现有工作主要压缩线性层和可展开为线性形式的卷积层,并采用平方损失衡量近似误差。本文遵循这一设定,其中
为
的权重矩阵,
的维度为
,对应问题为
Optimal Brain Surgeon 框架:OBS用于准确剪枝已经训练完成的稠密神经网络。它从当前参数点处的 Taylor 近似出发,并假设该点的梯度可以忽略,从而给出应删除的单个权重以及补偿该删除操作的剩余权重更新
- 设
为当前稠密模型损失的 Hessian,则造成最小损失增长的待剪权重及对应更新为
- 其中,
表示逆 Hessian 的第
个对角元素,
表示其第
列
OBS 用于逐层剪枝:上式损失是二次函数,初始稠密权重取得最小损失零,因此 OBS 的假设在该问题中完全成立,其公式对于这一逐层压缩目标是精确
- 通过反复应用 OBS、每次删除一个权重,可以得到逐层剪枝问题的精确贪心解,即每一步都作出当前局部最优决策。该贪心过程不能保证得到全局最优解,但适用于规模过大、无法使用精确全局方法求解的问题
🦉 An Optimal Greedy Solver for Sparsity
ExactOBS 的计算挑战:以经典形式逐个剪除权重并使用式(3)的精确更新,计算成本极高。若一层权重矩阵包含个参数,则完整 Hessian 的尺寸为
。在最多
个剪枝步骤中,每一步都需要更新并求逆 Hessian,单次求逆成本为
,因而总时间复杂度达到
,无法处理现代神经网络中参数量达到
至
的大型层
- ExactOBS 在不引入近似的条件下,将总体复杂度降低至
,显存复杂度降低至
。其关键是利用逐层平方误差的行级可分解结构,以及高效维护删除变量后的逆 Hessian
处理单个权重行:逐层平方误差可以写成各输出行误差之和
- 删除权重
只影响对应输出行
,因此不同行之间不存在 Hessian 交互。每个权重行只需要维护一个
Hessian。由于每一行都作用于相同输入
,所有行共享同一个初始 Hessian 矩阵
- 对于剪枝掩码 M,剩余权重对应的
只是完整 Hessian 中相应行列组成的子矩阵。因此,完整 Hessian 只需计算一次,之后根据当前掩码提取对应部分即可
- 逆矩阵不能采用同样的直接截取方式,因为

引理 1(行列删除)。给定一个可逆的矩阵
及其逆矩阵
,现需高效计算从
中删除第
行和第
列后所得矩阵的逆。将删除后的矩阵记为
,则其逆可由下式获得
- 该公式等价于先在
上对第
行和第
列执行一次高斯消元,消除它们与其余行列之间的耦合,随后将第
行和第
列完全删除。由于主要计算是逆矩阵第
列与第
行的外积,因此该更新的时间复杂度为
对完整权重矩阵执行 OBS 时,每一步需要从所有行中选择全局剪枝代价最低的权重。若为每一行同时保存一个逆 Hessian,显存需求将达到
,通常难以承受
- 由于不同行之间不存在 Hessian 交互,一行的最终权重只取决于该行被剪除的权重数量;某一步的损失增长也只依赖该行此前的剪枝状态。因此,每一行内部的剪枝顺序可以独立确定
- ExactOBS 对每一行分别运行完整剪枝过程,并记录每一步的损失增量
完成全部行的处理后,算法获得整层所有
个权重的剪枝代价,再从每一行当前尚未选取的下一个候选中,逐次选择代价最小的权重,并保持各行原有的剪枝顺序,从而恢复完整矩阵上的全局 OBS 掩码。该过程只需要额外的
内存
- 当每一行的最终剪枝集合
已知后,可以利用组 OBS 公式直接求解权重增量(更新时将该增量加到原权重上)
实际计算中,Hessian 可能因校准样本不足、输入通道失活或输入线性相关而不可逆
- 样本不足可以通过增加校准样本或数据增强缓解;数值奇异问题可以通过在 Hessian 对角线上加入小的阻尼项解决
- 直接实现逐权重更新会产生大量小型 CUDA 调用。论文通过批量并行处理多个权重行,减少 kernel 启动开销并提高 GPU 利用率
- 对于已经稀疏的矩阵,可以只提取每一行的非零元素构造较小的稠密子问题,算法成本会随行密度呈三次方下降
块剪枝要求零权重以大小为的连续块出现,常用于 CPU 加速。此时需要联合考虑同一块内多个权重之间的相关性。设
为一个块对应的索引集合,则目标块选择和补偿更新分别为
- 选中一个块后,可以对其中所有
依次应用式(4),从逆 Hessian 中删除对应变量。块大小为
时,每行的步骤数下降为
,但每一步需要执行
次逆 Hessian 更新,因此总体渐近复杂度仍保持不变
🐼 The Optimal Brain Quantizer (OBQ)
在通常假设当前参数点处梯度可以忽略的条件下,OBS 中最优待剪权重
及其对应更新
的公式,可以通过求解一个局部二次优化问题得到。该问题要求更新向量的第
个分量等于
,从而保证更新后第
个权重恰好变为零。对应的拉格朗日函数为
- 其中
表示参数点
处的 Hessian,
表示第
个标准基向量。最优解可以通过令
求出
,再将结果代回拉格朗日函数并求解
得到
- 现考虑将某一层的权重量化到间隔为
的固定量化网格,同时最小化量化引起的损失。为将 OBS 推广到量化投影,只需把式(6)中的约束目标由
替换为
,其中
表示量化舍入后的权重值。这样,更新后的第
个权重将恰好等于
若采用逐权重迭代量化,则可以类似地推导出当前步骤中使损失增长最小的待量化权重,以及对其余未量化权重的最优更新
- 由于经典 OBS 推导中的
始终作为常数出现,因此只需在最终结果中将其替换为
。由此得到的公式构成标准 OBS 剪枝公式的推广:当量化函数始终将权重映射为零时,式(7)便退化为原始 OBS
- OBQ首先根据式(7)的指标,贪心地量化当前最容易处理的权重;随后调整其余尚未量化的权重,以补偿本次量化造成的精度损失。由于这些未量化权重的数值会随补偿更新发生变化,它们后续对应的量化值也可能随之改变。算法随后继续选择下一个权重并重复这一过程
这一贪心量化方案存在一个实际问题,尤其是在量化网格允许少量权重落在表示范围之外、以降低大多数权重量化误差的常见设定中
- 由于离群权重通常具有较大的量化误差,它们往往会被推迟到量化过程的后期。此时,尚未量化、可用于补偿该大误差的权重已经很少,因此量化离群值造成的损失难以充分吸收。中间补偿更新还可能将某些权重进一步推离量化网格,从而加重这一问题
- 论文采用一种简单有效的启发式策略:一旦出现离群权重,便立即对其进行量化。例如,当某个权重的量化误差大于
时,将其视为离群值并优先处理,其中
表示相邻量化值之间的距离。此类情况通常在每一层中只出现少数几次
🦁 GPTQ
GPT、OPT 等模型在语言建模任务上取得突破性性能,但其参数存储和推理成本极高
- 以 1750 亿参数模型为例,即使使用 FP16 格式,模型权重仍占用约 326GB 显存,单张高端 GPU 无法容纳,推理通常依赖复杂的多卡部署
- 重新训练或量化感知训练在这规模下成本过高,而当时能够扩展到千亿参数模型的方法主要采用最近邻舍入,虽然可以支持 8 bit 量化,却难在 3~4 bit 条件下保持模型精度
- 如何在不重新训练的前提下实现高压缩率、高精度且可扩展的低比特量化,构成论文试图解决的核心问题
论文提出 GPTQ,一种基于近似二阶信息的一次性权重量化方法
- GPTQ 沿用逐层输出重构范式:利用少量校准数据,为每层寻找量化权重,使压缩层输出尽可能接近原始全精度输出,再将各层量化结果组合为完整模型
- 其理论基础来自 OBQ,即逐次量化权重并根据输入特征之间的二阶相关结构调整尚未量化的权重,从而补偿局部量化误差。GPTQ 保留这种二阶补偿能力,同时重新组织量化顺序和矩阵更新,使每层计算复杂度相较 OBQ 降低约一个权重矩阵短边维度的因子,实践中通常获得约三个数量级的加速
- 论文还进一步处理低计算—内存访问比以及大规模逆矩阵运算中的数值稳定性问题,使复杂的二阶量化方法能够真正扩展到千亿参数模型
🌿 Related Work
量化方法大体可以分为两类:训练过程中量化,以及训练后量化
- 前者通常在大规模重新训练或微调过程中完成模型量化,并通过某种近似求导机制处理舍入操作的不可导问题
- 训练后量化,也称一次性量化,仅使用有限的计算资源对预训练模型进行压缩,通常只需要数千个数据样本和数小时计算。对于超大规模模型而言,完整训练乃至微调都可能需要极其高昂的资源成本,因此训练后量化具有尤为重要的应用价值
从历史上看,训练后量化研究主要集中于视觉模型,高精度方法通常以单层或若干连续层组成的小型模块为单位执行量化
- AdaRound 通过对惩罚项进行退火,学习依赖数据的权重舍入策略,使权重逐渐趋向量化网格上的离散点
- BitSplit 以残差平方误差为目标,逐比特构造量化值
- AdaQuant 则借助直通估计器优化量化值
- BRECQ 将 Fisher 信息引入优化目标,并对同一残差块内的多层进行联合优化
- Optimal Brain Quantization 则将经典 Optimal Brain Surgeon 的二阶权重剪枝框架推广至量化场景。OBQ 按照量化误差确定处理顺序,逐个量化权重,并同步调整其余尚未量化的权重
随着 BLOOM 和 OPT-175B 等模型陆续开源,研究者开始探索能够以较低成本压缩此类超大模型、服务于推理部署的方法
- ZeroQuant 还提出类似 AdaQuant 的逐层知识蒸馏方法,但其能够应用的最大模型仅包含 13 亿参数。即便在这一规模下,量化过程也需要约 3 小时
- LLM.int8() 观察到,少数特征维度中的激活离群值会破坏大模型量化,因此将这些维度保留为较高精度
- nuQmm 则针对基于二进制编码的量化方案开发高效 GPU 内核,在低比特条件下单独执行某一层时,相较全精度计算能够获得显著加速
- GPTQ 相比此前方法将压缩收益提高一倍以上,并首次实现每个权重 3~4 bit 的高精度量化,从而带来显著的实际部署收益
🌊 Layer-Wise Quantization
从整体上看,GPTQ 遵循当前先进训练后量化方法的基本框架,即逐层执行量化,并针对每一层求解相应的重构问题
- 具体而言,令
表示第
个线性层的权重,令
表示少量
个数据样本经过网络后形成的该层输入。目标是寻找量化权重矩阵
,使其相对于全精度层输出的平方误差最小。形式化地,该问题可写为
OBQ 用于求解上述逐层量化问题,而本文对其进行一系列重要改进,使其能够扩展到大语言模型,并获得超过三个数量级的计算加速
- OBQ 首先观察到,式(1)可以分解为权重矩阵
各行平方误差之和。因此,OBQ 可以独立处理每个权重行
:算法每次量化一个权重,并持续更新所有尚未量化的权重,以补偿单个权重量化所引入的误差
- 对应的目标函数是二次函数,其 Hessian 为
其中
表示当前仍保持全精度的权重集合,下一步应当量化的贪心最优权重
,以及集合
中所有权重的最优更新
,可由下式给出
- 其中,
表示将权重
舍入到量化网格上距离最近的数值
OBQ 反复应用上述两个公式,以迭代方式量化权重,直至权重行中的全部权重均完成量化。为避免代价高昂的
完整重计算,在量化权重
后,算法直接在逆矩阵中通过一次高斯消元删除
的第
行和第
列。更新后的逆矩阵为
- 对于尺寸为
的权重矩阵
,OBQ 的运行时间对输入维度具有三次依赖
因此,将原始 OBQ 直接应用于拥有数十亿参数的模型在计算上不可行
⚙️ The GPTQ Algorithm
OBQ 按照贪心顺序量化权重,即在每一步都选择当前会引起最小额外量化误差的权重。值得注意的是,尽管这种自然的策略确实具有良好表现,但与按照任意顺序量化权重相比,其改进通常较为有限,尤其是在规模较大且高度过参数化的网络层中
- 一种可能的解释是,贪心顺序虽然能够在一定程度上减少具有较大单点量化误差的权重数量,但这些权重往往会被推迟到量化过程的后期。此时,仅剩少量尚未量化的权重可以通过调整来补偿其量化误差,从而抵消贪心排序带来的部分收益。由此产生的一个重要观察是:对于大模型而言,任意固定的量化顺序也可能取得较好的结果,而这一观察将带来重要的算法影响
- 原始 OBQ 方法分别独立量化权重矩阵
的各个行,并依据相应的量化误差为每一行确定特定的量化顺序。相比之下,GPTQ 使所有权重行按照相同的顺序进行量化,并表明这种处理通常能够获得与原始 OBQ 解相近的最终平方误差
- 由此,在量化过程的任意阶段,所有权重行都具有相同的未量化权重集合
,对应的逆 Hessian
也对所有行保持一致。其原因在于
仅依赖当前未量化权重所对应的层输入
,而各个输出行共享相同的输入;它并不依赖具体的权重数值
- 因此,式(3)中的
更新只需执行
次,即每个权重列执行一次,而不再需要执行
次,即为每个标量权重分别执行一次。这样,总体运行复杂度由
降低为
相当于获得
倍的渐近加速
首先,直接实现上述方案在实际中仍然无法获得较高速度,因为该算法的计算量与内存访问量之比较低。例如,式(3)需要更新一个可能非常庞大的矩阵中的全部元素,但对每个元素仅执行少量浮点运算。这类操作无法充分利用现代 GPU 强大的计算能力,其性能会受到显著较低的显存带宽限制
- 第
列的最终舍入决策只会受到作用于该列本身的更新影响,因此,在当前处理阶段,对后续列的更新与第
列的舍入结果无关。这使得多个更新可以被批量合并,从而显著提高 GPU 利用率
- 具体而言,GPTQ 每次处理
个连续权重列,并在处理过程中将更新限制在这些列以及
中相应的
子块内。只有当整个列块完成量化后,算法才使用式(2)和式(3)的多权重推广形式,对完整的
和
矩阵执行全局更新。其中
表示当前列块对应的索引集合,
表示删除集合
所对应行列后的逆矩阵
- 尽管这一策略并未减少理论上的总计算量,但它有效缓解内存吞吐瓶颈。通过将大量细粒度更新合并为较大规模的矩阵运算,该方法能够显著提高 GPU 的数据复用率和计算利用率。在超大模型上,这一设计可在实践中带来约一个数量级的加速,因此构成 GPTQ 算法的关键组成部分
最后一个需要解决的技术问题来自数值误差。在现有大模型的规模下,这类误差可能变得十分严重,尤其是在与前一步中的分块更新结合使用时
- 具体而言,剩余未量化权重所对应的逆 Hessian 可能在计算过程中失去正定性并变为不定矩阵。作者观察到,这会使算法沿错误方向对剩余权重施加过大的更新,进而导致相应层的量化结果严重恶化。在实践中,该问题的发生概率会随模型规模增长而提高;对于参数量超过数十亿的模型,几乎可以确定至少有少数层会出现这一现象。其主要原因似乎在于式(5)的反复应用会持续累积数值误差,尤其是其中附加的矩阵求逆操作
- 对于较小模型,通常可以通过阻尼缓解这一问题,即在 Hessian 的对角元素上加入一个较小的常数。本文始终将该常数设为 Hessian 平均对角值的 1%。然而,仅依赖阻尼不足以保证大模型量化过程的稳定性,因此还需要更加稳健和通用的处理方式
- 作者首先注意到,在量化第
个权重时,算法从当前未量化权重集合对应的逆 Hessian 中实际需要的信息仅为第
行;更准确地说,只需要该行从对角元素开始向后的部分。因此,可以采用数值上更加稳定的方法预先计算所有这些行,而不会显著增加内存开销
- 对于对称的逆 Hessian,式(3)所执行的逐步行列删除,本质上与 Cholesky 分解中的消元过程相对应。二者仅存在一个细微差异:Cholesky 分解会使用当前对角元素的平方根对第
行进行归一化
- 基于这一关系,GPTQ 可以直接利用成熟且高度优化的 Cholesky 内核,预先计算后续量化过程中所需的全部逆 Hessian 信息。结合轻度阻尼后,该方法具有足够的数值稳定性,可以可靠应用于超大规模模型;与此同时,高度优化的 Cholesky 实现还能够带来额外的运行加速
🌿 GPTAQ: Efficient Finetuning Free Quantization For Asymmetric Calibration
本文聚焦于免微调量化,即绕过基于梯度的优化,转而通过前向传播进行校准计算。近期文献已提出多种此类方法。其中,GPTQ 在速度与精度之间实现尤为有效的兼顾,因此在机器学习社区得到广泛应用
GPTQ 中的一个关键问题,将其称为对称校准。对称校准问题源于每一层均以为优化目标,其中输入
来自前一量化层的输出。该输入与原始模型的输入激活
存在偏差。作者的优化目标引入全精度模型的输入激活,将这一方式称为非对称校准。同时提出 GPTAQ 来解决非对称校准问题
- 分析非对称校准,并表明,最优的权重更新需要同时考虑量化误差、Hessian 逆矩阵以及输入偏差
- 提出通过若干改进实现非对称校准,包括对所有输出通道进行高效并行处理,以及将残差误差分解到各个通道维度,以提高效率

🍄 Related Work And Background
免微调量化:鉴于预训练大模型的庞大规模,免微调量化因能够直接导出量化后的模型检查点而受到广泛关注
- 一类经典的免微调方法是利用偏置和缩放因子校正分布。AWQ、SmoothQuant、Outlier Suppression 和 Outlier Suppression+ 提出缓解语言 Transformer 中离群值问题的方法。其他方法则涉及架构修改,例如通道拆分与合并
- 近期,QuIP 提出通过非相干化处理,将权重分布转换为更适合量化的形式。QuIP# 采用 Hadamard 变换提高变换效率,QuaRot 进一步引入在线操作,将其扩展至激活变换
- 异构处理方法,例如 LLM.int8()、BiLLM 和 Slim-LLM,为重要元素分配更多的量化表示空间,即更高的精度,但这需要复杂的硬件设计
- 作为本文方法的前身,GPTQ利用闭式解优化权重元素,因此不需要反向传播
最优脑外科方法:该方法最初应用于仅包含数百个权重的小型网络。已有研究致力于降低较大模型中 Hessian 矩阵的估计复杂度,例如 Fisher 近似和 K-FAC 近似。作者的方法扩展最优脑压缩(Optimal Brain Compression),后者使用层输入的 Gram 矩阵作为 Hessian 矩阵,执行逐层量化。关键区别在于,作者为真实目标对应的输入引入一个校正项,从而形成非对称校准框架
- 将浮点模型参数
从 FP16 转换为整数表示
,需要通过校准过程保持模型的行为。最优脑量化(Optimal Brain Quantization,OBQ)框架对这一校准过程进行形式化描述,而 GPTQ 则针对大模型高效地实现该框架。OBQ 校准过程的核心是最小化原始层输出与量化层输出之间的差异
- 借助 OBS 框架,OBQ 以迭代方式求解这一优化问题。对于每个权重
,它计算最优量化值及相应的调整量
- 其中,
表示 Hessian 逆矩阵。每量化一个权重后,便利用高斯消元高效更新 Hessian 逆矩阵,以排除已量化的元素
- 尽管 OBQ 提供闭式解,但对于拥有数十亿参数的 Transformer 模型,其计算成本高得难以承受。GPTQ 通过增强并行化,并借助 Cholesky 重构提高数值稳定性,克服这一局限,使该方法能够实用且稳健地应用于拥有数千亿参数的模型
🌿 GPTAQ Methodology
作者认为,GPTQ 和原始 OBQ 的一个关键局限在于对输入激活采取对称处理,未能考虑量化层如何逐步改变激活模式。随着量化推进至更深的网络层,这一问题变得尤为突出。因此,引入非对称校准框架,旨在保留浮点模型中各层输入的特征。优化目标变为
- 在实际应用中,差异
既可能来自前面各层的激活量化,也可能来自权重量化。这种偏差随着网络深度的增加而系统性地累积
- 在 GPTQ 量化过程中,激活的平均绝对误差(MAE)损失随 Transformer 块的加深而持续增大,揭示对称校准中的根本性偏差
针对非对称校准问题推导求解方法。首先考虑单个输出通道,即一行权重的优化。引入表示输出激活残差
,从而将目标改写为
该最优框架以迭代方式运行:首先计算,随后将第
个权重量化为
,最后利用
更新其余全精度权重。重复这一过程,直至所有权重元素均完成量化
- 对于第
个权重的量化,引入约束
,其中
表示第
个位置为 1、其余元素均为 0 的单位向量。由此得到一个嵌套优化问题
- 为求解这一约束优化问题,构造其拉格朗日函数
- 将上述导数设为零,即可得到最优权重更新量
- 其中,根据式(3),
表示通过高斯消元将第
行和第
列置零后得到的 Hessian 逆矩阵
将这一直接实现应用于大型 Transformer 模型时,会面临显著的效率挑战。这不仅源于计算每个权重对应的 所需的开销,还因为不同输出通道具有不同的最优
顺序,从而阻碍有效的 GPU 并行化。由于每个权重的处理都涉及多次
矩阵乘法,计算负担尤为严重,对于大型基础模型而言,其成本高得难以承受。此外,每次权重更新都需要重新估计输出残差
。为克服这些局限,提出四个优化步骤,使其效率能够与 GPTQ 相当
🚀 Efficient Solution
步骤 I:大规模基础模型庞大的参数空间启发一项重要优化:可以按照任意顺序处理权重,而不必严格遵循由
-
在量化单个权重元素时,广阔的权重空间提供足够的灵活性来补偿量化误差。GPTQ 的实证结果支持这一认识:与任意顺序相比,遵循
的最优降序排列仅能带来有限的改进 -
以任意顺序处理权重还具有一项实际优势:它允许并行处理所有行,从而高效利用 GPU 的计算能力。因此,采用 GPTQ 的列处理顺序,即从第一列到最后一列依次处理。对于每个
,通过下式同时计算所有行的权重更新量
- 其中,
表示所有行,即所有输出通道的输出残差。采用这一形式,只需维护一份 ,因为对于给定的 ,它在所有行之间保持不变。尽管这一方法实现行之间的并行处理,但仍存在两项显著的计算挑战:每次迭代都需要估计新的残差 ,以及矩阵乘法 带来的计算负担。要使该方法在大规模模型上达到实际可用的效率,必须解决这些问题
步骤 II:通过逐通道分解,避免每轮迭代重新计算完整输出残差
- 尽管
能够有效缩小量化模型与全精度模型输出之间的差距,但每次新的迭代都需要重新估计输出残差 。将输入激活的残差记为 ,其更新公式为:
- 这一操作会产生较大的计算开销,其复杂度为
,其中 为 token 长度与校准样本数量的乘积。对 的依赖给大型基础模型带来特殊挑战,因为 通常是 和 的 倍。提出一种替代方法,以避免重新计算输出残差 。关键认识在于,残差可以分解为来自不同神经元的 个独立分量:
- 通过这一分解,只需在层校准之前估计一次
。因此,在第 次迭代中,前 列已经完成量化,专注于量化第 列,同时最小化与其对应的残差分量:
- 类似地,第
次迭代的最优权重更新量变为:
-
其中,
表示经过 次迭代消元后的 Hessian 逆矩阵,因此 。值得注意的是,式(15)的第一项与 GPTQ 相同,而第二项用于最小化第 个神经元的残差误差。由于 已经通过先前的 得到更新,因此无需重新估计残差误差 -
此外,残差分解还带来显著的计算优势,使第二项的计算复杂度降至原来的
。这是因为 是一个行向量,而 是一个列向量,因此计算第二项仅需 的复杂度。进一步注意到, 与权重更新无关,因此可以预先计算每一行并存储在矩阵 中。这样,在第 次迭代中,就可以通过 高效计算第二项
步骤 III:通过 Cholesky 重构,在保持数值稳定性的同时高效计算残差校正矩阵
- 重复的高斯消元会累积数值误差。对 Hessian 逆矩阵进行 Cholesky 分解
,其中 为下三角因子。通过该因子的切片与乘法计算 ,可将 改写为:
- 由于
,式(16)使用完整的 。预先计算 ,再利用 的下三角结构,在 GPU 上并行计算 的各行
步骤 IV:预先计算矩阵
- 与 GPTQ 一样,第
列的量化结果仅受该列自身更新的影响,因此在当前处理阶段,对后续列的更新与该列的量化结果无关。由此,可以对两个更新项都采用延迟批量处理,以提高 GPU 利用率。具体而言,给定一个列块 ,首先利用切片后的 和 更新块内各列,再通过下式更新块外的其余权重:
🧮 Appendix
本节给出最优框架的详细推导。为求解拉格朗日函数的局部极小值,令偏导数为零
- 求解第一个方程,得到
- 在两侧右乘 Hessian 逆矩阵,得到
- 将上式代入式(A.1)的第二个方程,得到
- 将上式代入式(A.3)的第二行,可得
- 将最优
代入损失函数 ,得到
- 首先化简
- 将该结果代回式(A.8)的最后一个等式,得到
- 由于
的第 行已被消去, 为全零向量,因此式(A.10)最后一个等式中的第一项为零。又因 ,最后一项可改写为 。进一步化简
- 最终,
可化简为
A.2 Proof Of Lemma 4.1
引理 4.1:给定完整 Hessian 逆矩阵
- 证明 不失一般性,首先证明
的情形。对 进行 Cholesky 分解,有 ,其中 为下三角矩阵。因此,Cholesky 因子可改写为
- 将上式代入
,得到
- 由此可构造如下线性方程组
- 求解该方程组,得到
- 回顾
,该式对第一行和第一列执行高斯消元,结果对应 。式(A.16)的第三个方程实质上对应移除第一行和第一列后的 ,因此有 。递归移除当前 Hessian 逆矩阵的第一行和第一列,即得 ,引理得证
A.3 Proof Of Theorem 4.2
定理 4.2:矩阵
- 证明 首先计算矩阵
的各行,其表达式为
- 对于矩阵
,仅当 时,第 列才含有非零元素,因此 的元素可写为
- 其中,
是前三项乘积中的元素。矩阵 仅在 时于第 列含有非零元素,因此 可计算为
- 因此,将
的下三角区域掩去,即可得到
- 由于
的下三角区域为零,可直接将 与 相乘得到
- 因此,
,定理得证