GPTQ - 生成式预训练 Transformer 的精确训练后压缩
flyfish
曾经是 https://github.com/AutoGPTQ/AutoGPTQ
现在是https://github.com/ModelCloud/GPTQModel
对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》
生成式预训练Transformer模型(如GPT或OPT)凭借在复杂语言建模任务中的突破性性能脱颖而出,但也因其极高的计算和存储成本而备受关注。具体而言,由于其庞大的模型规模,即使是高精度的大型GPT模型进行推理也可能需要多块高性能GPU,这极大限制了这类模型的实际应用。尽管目前有通过模型压缩缓解这一压力的研究,但现有压缩技术的适用性和性能受限于GPT模型的规模与复杂度。
针对这一挑战,本文提出了一种基于近似二阶信息的新型一次性权重量化方法——GPTQ。该方法兼具高精度和高效性:
- 能够在约4个GPU小时内完成对1750亿参数GPT模型的量化
- 将权重位宽压缩至3-4位/权重
- 与未压缩基线相比仅产生可忽略的精度损失
相较于此前提出的一次性量化方法,我们的方法在保持精度的同时将压缩增益提高了一倍以上,首次实现了在单块GPU上运行1750亿参数模型进行生成推理。此外,我们还证明了该方法在极端量化场景下仍能保持合理精度,可将权重量化至2位甚至三进制水平。实验表明:
- 相比FP16精度,使用高端GPU(NVIDIA A100)可实现约3.25倍的端到端推理加速
- 使用更具成本效益的GPU(NVIDIA A6000)可实现约4.5倍的推理加速
该技术突破为在资源受限设备上部署超大规模语言模型开辟了新路径。
GPTQModel 最初是 AutoGPTQ 的重大重构版本,如今已发展为功能全面的替代方案。它拥有更简洁的 API 接口、支持最新模型架构、具备更快的推理速度和更高质量的量化效果。
公开测试数据及 ModelCloud 内部测试均表明,GPTQ 在 4 位量化领域展现出卓越性能:其模型质量恢复能力与生产级推理速度(令牌延迟及每秒请求数)均达到或超越同类技术。在真实生产部署场景中,GPTQ 实现了模型质量与推理速度的完美平衡,是工业级大模型部署的理想选择
pip 安装 gptqmodel
包
pip install -v --no-build-isolation gptqmodel
或者
pip install -v --no-build-isolation gptqmodel[vllm,sglang,bitblas,ipex,auto_round]
命令
-
-v 或 –verbose:
- 这个选项表示“详细模式”。使用
-v
可以让 pip 输出更详细的日志信息,帮助用户了解安装过程中的每一个步骤。这对于调试安装问题非常有用。
- 这个选项表示“详细模式”。使用
-
–no-build-isolation:
- 默认情况下,pip 使用 build isolation(构建隔离),这意味着在构建过程中会创建一个临时的、独立的环境来安装构建所需的依赖项。这个选项禁用了这种隔离,允许你在全局环境中使用已有的依赖项进行构建。这在某些情况下可以帮助解决依赖冲突的问题。
-
gptqmodel[vllm,sglang,bitblas,ipex,auto_round]:
- 这一部分指定了要安装的包及其额外的可选特性或模块。
- gptqmodel: 这是要安装的主要包的名字。
- 方括号
[...]
内的内容指定了该包的一些额外功能或插件,这些被称为“extras”:- vllm: 表示安装支持 vLLM 推理的额外组件。
- sglang: 支持 SGLang 推理的额外组件。
- bitblas: 支持 Microsoft/BITBLAS 格式的额外组件。
- ipex: Intel IPEX 加速量化/推理的支持。
- auto_round: 提供 Intel/AutoRound 替代 GPTQ 推理兼容的量化方法。
GPTQModel特性:
-
生态兼容性
深度集成Hugging Face生态(Transformers/Optimum/Peft主分支),支持vLLM和SGLang推理框架,可直接加载FORMAT.GPTQ格式模型,实现跨平台开发与部署。 -
模型支持广度
覆盖30+主流模型架构,包括多模态模型(Ovis VL/Qwen2-VL)、商业模型(Hymba/IBM Granite)及开源模型(Llama系列/GLM等),满足多样化业务需求。 -
全平台适配
支持Linux/MacOS/Windows系统,兼容Nvidia CUDA、AMD ROCm、Intel XPU/MPS及Apple Silicon等异构计算环境,实现CPU/GPU全场景加速。 -
动态量化引擎
独创模块级动态量化控制,可对每个神经网络层独立配置量化参数(如4位/8位混合量化),或完全跳过敏感模块,在性能与精度间实现最优平衡。 -
硬件加速方案
针对Intel平台深度优化,支持AVX/AMX/XMX指令集及Arc GPU加速;通过IPEX框架实现CPU推理优化,结合BITBLAS动态编译技术提升计算效率。 -
工程化保障
采用100% CI单元测试覆盖,确保量化质量稳定性;支持模型分片加载与哈希校验,保障大模型部署的可靠性;通过lm_head量化进一步降低显存占用。 -
性能优化成果
在Llama 3.1 8B模型量化中实现45%打包速度提升,OPT模型PPL计算加速50%;结合Intel AutoRound技术,可提供与GPTQ兼容的替代量化方案。
该工具通过算法创新与工程优化,为企业级大模型部署提供了完整解决方案,在保持模型精度的同时显著降低算力成本,推动生成式AI技术的工业化落地。
-
基本思想
GPTQ的基本思想是将模型权重矩阵 W W W 量化为低比特表示 W ^ \hat{W} W^,使得量化后的模型在特定的校准数据集上与原始模型的输出尽可能接近。具体而言,它通过最小化量化误差来找到最优的量化参数。
量化过程
1. 选择校准数据集
从训练数据或验证数据中选取一小部分样本作为校准数据集。这部分数据用于在量化过程中估计量化误差,通常不需要太多样本,因为主要目的是捕捉模型的统计特性。
2. 逐层量化
GPTQ通常采用逐层量化的方式,即对模型中的每一层分别进行量化操作。以线性层为例,假设输入为 X X X,权重矩阵为 W W W,输出为 Y Y Y,则有 Y = X W Y = XW Y=XW。在量化时,我们要找到一个量化后的权重矩阵 W ^ \hat{W} W^,使得 Y Y Y 和 X ^ W ^ \hat{X}\hat{W} X^W^ 之间的差异尽可能小,其中 X ^ \hat{X} X^ 是输入 X X X 的量化表示(在某些情况下,输入也可以不进行量化)。
3. 量化误差的定义
为了衡量量化误差,GPTQ通常使用均方误差(Mean Squared Error, MSE)作为损失函数。对于一个线性层,量化误差可以表示为:
L = 1 N ∑ i = 1 N ∥ X i W − X i W ^ ∥ 2 2 L = \frac{1}{N} \sum_{i=1}^{N} \| X_i W - X_i \hat{W} \|_2^2 L=N1i=1∑N∥XiW−XiW^∥22
其中, N N N 是校准数据集中样本的数量, X i X_i Xi 是第 i i i 个样本的输入, ∥ ⋅ ∥ 2 \|\cdot\|_2 ∥⋅∥2 表示L2范数。
4. 求解最优量化参数
为了找到最优的量化后的权重矩阵 W ^ \hat{W} W^,GPTQ采用了一种基于梯度的优化方法。具体来说,它通过迭代地更新量化参数,使得损失函数 L L L 最小化。在每次迭代中,根据当前的量化参数计算损失函数的梯度,并使用梯度下降等优化算法更新量化参数。
5. 量化方式
GPTQ可以采用对称量化或非对称量化。对称量化假设权重的分布关于零对称,而非对称量化则允许权重的分布具有非零的均值。非对称量化通常可以提供更高的量化精度,但计算复杂度也相对较高。
优化技巧
- 分块量化:为了降低计算复杂度,GPTQ通常将权重矩阵划分为多个小块,对每个小块分别进行量化。这样可以减少每次迭代中需要处理的参数数量,提高量化效率。
- 快速二阶近似:在计算损失函数的梯度时,GPTQ采用了一种快速二阶近似方法,避免了直接计算Hessian矩阵,从而显著降低了计算复杂度。
快速二阶近似
二阶信息在优化中的作用
在优化问题里,目标是最小化一个损失函数(例如GPTQ中衡量量化误差的均方误差)。梯度下降是常见的优化方法,它只使用了损失函数的一阶导数(梯度)信息,根据梯度的反方向更新参数。然而,一阶方法在某些情况下收敛速度较慢。二阶方法会考虑损失函数的二阶导数(Hessian矩阵),能提供关于函数曲率的信息,从而更准确地预估函数的局部形状,通常可以让优化过程收敛得更快。
传统二阶方法的问题
对于大规模的神经网络模型,直接计算Hessian矩阵并利用它进行优化存在很大的挑战。Hessian矩阵的规模是参数数量的平方,这会导致极高的存储需求和计算复杂度,在实际应用中往往不可行。
GPTQ的快速二阶近似
GPTQ采用了快速二阶近似方法来解决上述问题,避免了直接计算完整的Hessian矩阵。
原理
它通过对Hessian矩阵进行近似和简化,只计算和使用与优化相关的部分信息。具体而言,GPTQ利用了权重矩阵的结构特点和量化问题的特性,在每一步迭代中,对当前块的权重计算一个近似的二阶信息。这个近似过程基于一些合理的假设和简化,使得计算量大幅降低。
操作方式
- 分块处理:将大的权重矩阵分成多个小块,对每个小块分别进行量化和优化。在处理每个小块时,只考虑该小块对应的局部二阶信息,而不是整个模型的全局Hessian矩阵。
- 低秩近似:利用低秩矩阵来近似表示Hessian矩阵的关键部分。低秩矩阵可以用较少的参数来描述,从而减少存储和计算成本。
- 迭代更新:在每次迭代中,根据当前的近似二阶信息和梯度信息,更新量化参数。这个过程不断重复,直到损失函数收敛到一个满意的值。
快速二阶近似的优势
- 计算效率提升:避免了直接计算和存储完整的Hessian矩阵,大大减少了计算量和内存需求,使得量化过程能够在合理的时间内完成。
- 收敛速度加快:相比于仅使用一阶信息的方法,结合近似二阶信息可以更准确地引导参数更新,加快优化过程的收敛速度,提高量化的精度和效率。
剪枝(OBD/OBS)→ 量化(OBQ)→ 动态量化(GPTQ)
演进逻辑:
-
OBD(1989)——量化的萌芽
- 首次提出基于Hessian矩阵的结构化剪枝方法
- 通过计算参数对损失函数的二阶导数(Hessian值)评估重要性
- 核心思想:删除对模型性能影响最小的连接(权重参数)
- 问题:剪枝后模型稀疏度过高,推理加速有限
-
OBS(1990)——剪枝技术的进化
- 改进OBD的剪枝策略,提出"Optimal Brain Surgeon"
- 动态调整剪枝阈值,保留更重要的参数
- 引入参数恢复机制,在剪枝后微调恢复性能
- 成果:在ImageNet等任务上实现30%参数缩减而不损失精度
-
OBQ(2015)——量化技术的突破
- 首次将量化与剪枝结合,提出"Optimal Brain Quantizer"
- 创新点:将浮点权重压缩为低精度定点数(如8bit)
- 关键技术:
- 基于KL散度的量化误差最小化
- 动态调整量化步长
- 引入参数重训练(fine-tuning)补偿精度损失
- 意义:开创了低比特量化的先河,为后续研究奠定基础
-
GPTQ(2022)——工业级量化方案
- 革命性的4bit量化技术,实现:
- 动态量化:逐通道/逐组调整量化参数
- 精度补偿:基于泰勒展开的误差校正
- 高效推理:支持CUDA kernel优化
- 关键突破:
- 混合精度量化策略(FP32/FP16/INT4混合存储)
- 自适应量化步长计算
- 推理速度提升5-10倍的同时保持接近FP16的精度
- 应用场景:LLM部署(Llama2-70B量化后可在消费级GPU运行)
- 革命性的4bit量化技术,实现:
GPTQ 混合量化方案(W4A16)
一、总述
GPTQ 采用 int4/fp16 (W4A16) 的混合量化方案,其中模型权重被量化为 int4 数值类型,而激活值则保留在 float16。在推理阶段,模型权重被动态地反量化回 float16 并在该数值类型下进行实际的运算.
二、训练阶段:权重量化准备
在训练阶段,首先要对模型的权重进行一系列预处理操作,为后续的量化做准备。
- 动态范围分析:对模型中每个权重矩阵进行统计分析,找出其最大值和最小值。例如,某一层的权重值分布在 -3.2 到 4.1 这个区间内。这一步的目的是确定权重的变化范围,为后续的量化映射提供基础。
- 量化参数计算:根据动态范围分析得到的最大值和最小值,计算两个重要的量化参数——缩放因子和零点。缩放因子的计算方法是用最大值与最小值的差值除以 int4 所能表示的最大正数(对于 4 位整数,即 2 的 3 次方减 1,也就是 15)。零点则是用于处理负数的偏移量,它确保量化后的数值能够准确反映原始权重的信息。
- 量化映射:通过编写函数,将原始的浮点型权重按照计算得到的缩放因子和零点进行量化,转换为 int4 类型。例如使用
np.round(weight / scale + zero_point).astype(np.int8)
这样的代码,就能把权重转换为对应的量化值。
三、存储优化:int4 权重存储
量化后的权重在存储方面有很大优势,GPTQ 采用了一系列优化策略。
- 内存布局优化:为了进一步节省存储空间,GPTQ 把 4 个 int4 数值打包成 1 个字节(8 位)。这样一来,原本需要大量空间存储的权重,现在占用的空间大幅减少。比如一个有 1 亿个参数的模型,原本使用 float32 存储需要 400MB 空间,量化后使用 int4 并打包存储,只需要 50MB,存储空间直接压缩为原来的八分之一。
- 存储格式示例:可以通过一个表格清晰地看到原始的 float32 值、量化后的 int4 值以及打包后的字节形式之间的对应关系。例如,原始的 0.5 量化后为 3,和其他量化值一起打包成一个字节如 0b00110100 进行存储。
四、推理阶段:动态反量化与计算
在推理阶段,为了保证计算精度,需要将量化后的权重反量化回 float16 进行实际运算。
- 硬件级反量化:当计算单元(如 GPU 内核)从内存中加载权重时,会自动对打包的字节进行解包操作,将其还原为 int4 形式,再进一步反量化为 float16。例如,读取到 0b00110100 这个字节,就会解包出对应的量化值 3、 -5 等,然后反量化为对应的 float16 数值。
- 混合精度计算流程:推理过程遵循特定的流程。首先输入的激活值保持为 float16 类型,然后解包后的权重也转换为 float16 类型,接着进行矩阵乘法运算,最后经过激活函数处理得到输出结果。整个过程可以用一个流程图来清晰展示,输入激活值经过解包权重、矩阵乘法、激活函数这几个步骤,最终完成推理计算。
- 计算优化策略:为了提高推理速度,采用了多种计算优化策略。利用 GPU 的 Tensor Core 来加速 float16 运算,优化内存访问方式以减少从 DRAM 到 SRAM 的数据传输量,还通过并行计算的方式同时处理多个 int4 权重组,从而提高整体的计算效率。
五、关键技术细节
- 量化粒度选择:量化粒度的选择对模型精度有重要影响。GPTQ 通常采用每通道量化的方式,相比于每层量化,这种方式能减少精度损失。一般典型的配置是每通道 4096 个参数为一组进行量化。
- 误差补偿机制:量化过程不可避免地会带来一定的误差,为了减少误差对模型性能的影响,采用了误差补偿机制。动态调整量化参数,通过误差反馈校准的方法,对量化过程中的误差进行修正,尽量保持模型的精度。
- 激活值保留 fp16 的原因:激活值之所以保留为 float16 类型,是因为激活值的动态范围通常较大,例如 ReLU 激活函数的输出可能接近输入的最大值。而且在计算过程中,中间结果需要更高的精度来避免误差累积,从而保证最终的推理结果准确可靠。
解释
量化与混合量化方案
- 量化:在深度学习中,量化是一种将高精度数据(如32位浮点数,即
float32
)转换为低精度数据(如整数)的技术。其目的是减少模型的存储需求和计算量,从而提高模型的推理速度和降低硬件资源的消耗。 - 混合量化方案:不同的数据类型在模型的不同部分使用。在
int4/fp16 (W4A16)
这种混合量化方案里,“W4” 表示权重(weights)采用 4 位整数(int4
)进行量化,“A16” 表示激活值(activations)采用 16 位浮点数(float16
)来表示。
模型权重
- 定义:在神经网络中,权重是神经元之间连接的强度。它是模型学习到的参数,用于调整输入信号的重要性。例如,在一个简单的全连接层中,输入向量会与权重矩阵相乘,从而得到输出向量。模型训练的过程就是不断调整这些权重,使得模型的输出尽可能接近真实标签。
- 量化为
int4
:将原本使用高精度(如float32
)表示的权重,转换为 4 位整数(int4
)。4 位整数可以表示的数值范围是有限的,这样可以显著减少权重的存储空间。例如,原本一个float32
类型的权重需要 32 位来存储,而量化为int4
后只需要 4 位,存储空间减少为原来的 1/8。
激活值
- 定义:激活值是神经元在接收到输入信号并经过加权求和后,再通过激活函数处理得到的输出值。激活函数的作用是引入非线性因素,使得神经网络能够学习到更复杂的模式。常见的激活函数有 ReLU(Rectified Linear Unit)、Sigmoid 等。例如,在一个多层感知机中,每一层神经元的输出就是激活值,这些激活值会作为下一层的输入。
- 保留为
float16
:激活值在计算过程中对精度要求相对较高,因为它们会直接影响后续层的输入和最终的输出结果。所以在这种混合量化方案中,激活值仍然使用 16 位浮点数(float16
)来表示,以保证模型的计算精度。
推理阶段与反量化
- 推理阶段:是指模型在训练完成后,对新的输入数据进行预测的过程。在这个阶段,模型使用已经学习到的权重和结构来生成输出结果。
- 反量化:由于量化后的权重是
int4
类型,而在实际的计算中,硬件通常更擅长处理浮点数运算,所以在推理阶段,需要将量化后的int4
权重动态地转换回float16
类型,这个过程就是反量化。反量化的目的是为了在保证计算精度的前提下,利用硬件的浮点运算能力进行高效的计算。