大模型量化技术简介
大模型量化 是一种模型压缩技术,其核心思想是使用更低精度的数据类型(如8位整数INT8)来表示和计算原本更高精度的数据类型(如32位浮点数FP32或16位浮点数BF16/FP16)的模型参数和激活值。目前发现不使用4字节FP32精度转而使用2字节FP16半精度可以获得几乎相同的推理结果,这样就可以部署在存储空间不大,计算速度不快的设备上了(如手机,嵌入式设备,边缘计算);如果每个参数占的字节数少点
大模型量化 是一种模型压缩技术,其核心思想是使用更低精度的数据类型(如8位整数INT8)来表示和计算原本更高精度的数据类型(如32位浮点数FP32或16位浮点数BF16/FP16)的模型参数和激活值。
模型参数和激活值 数值范围:
模型参数(Weights):通常范围较小且稳定,例如在 [-1.0, 1.0] 或 [-2.0, 2.0] 附近呈高斯分布。容易量化。
激活值(Activations):范围动态变化且高度依赖于输入。通常包含显著的异常值,某些通道或token的值可能比其他大几个数量级(例如 [-100, 100])。这是量化的主要难点。
内存占用比例:
在推理过程中,尤其是处理长序列时,激活值的内存占用通常远大于模型参数。
先说一下数据类型
类型 | 位数 | 内存 | 数值范围 |
---|---|---|---|
FP32 | 32位 | 4字节 | 1.2e-38 ~ 3.4e38 |
FP16 | 16位 | 2字节 | 5.96e-8 ~ 65,504 |
INT8 | 8位 | 1字节 | -128 到 +127 |
P32 和 P16 比较容易理解,
INT8是如何表示小数的;
通过量化参数(一个缩放因子Scale)将浮点数范围线性映射到整数台阶上。
例如,FP32的权重范围是[-2.0, 5.0],共7.0的跨度。要映射到[-128, 127]共256个台阶上。
缩放因子 = (5.0 - (-2.0)) / (127 - (-128)) ≈ 7.0 / 255 ≈ 0.02745
那么,一个FP32的数值1.5被量化为:round(1.5 / 0.02745) = round(54.64) ≈ 55
反过来,INT8的数值55反量化为:55 * 0.02745 ≈ 1.50975(引入了误差)
模型大小(字节) ≈ 参数量 × 每个参数所占的字节数
大模型参数量通常以B为为单位(10亿)
如果每个参数占的字节数少点的话,那么模型的大小就能小点了;
人们发现使用4字节FP32精度的参数和使用2字节FP16
目前发现不使用4字节FP32精度转而使用2字节FP16半精度可以获得几乎相同的推理结果,
那用一个字节表示参数呢? 那0.5个字节呢?于是就有了INT8和INT4;
那能不能更低,理论上也不是不行,
4K和2K的视频我们在电视上看几乎没什么影响;
压缩到720P,也勉强能看,360P呢?极端场景也能接受!
但是你都压缩成马赛克了我还怎么看?
现在讲一下为什么要量化,
量化后的模型,存储空间上变小, 计算速度能加快
这样就可以部署在存储空间不大,计算速度不快的设备上了(如手机,嵌入式设备,边缘计算);
量化方法分类:
1. 按执行时机分类
训练后量化(Post-Training Quantization, PTQ)
优点:简单、快速、高效,是目前最主流、最常用的方法。
缺点:精度损失可能相对较大,尤其在低比特(如4bit)量化时。
代表技术:
GPTQ: 通过对权重矩阵进行逐层优化,寻找最优的量化参数,使得最终输出的误差最小。尤其擅长4bit(INT4)权重量化,几乎无损。
AWQ (Activation-aware Weight Quantization)核心思想是保护那些对激活值影响大的重要权重,给它们更高精度,而对不重要的权重进行更低比特的量化。平衡性能和效率。
SmoothQuant:解决激活值量化难题的PTQ方法。通过数学变换将激活值中的异常值“平滑”地迁移到权重上,从而实现对激活值的无损8bit量化(W8A8)。
量化感知训练(Quantization-Aware Training, QAT
在模型的训练(或微调)过程中,插入模拟量化的操作(称为“伪量化节点”),让模型从一开始就“感知”到量化会带来的误差,从而自适应地调整权重,以在量化后获得最佳性能。
优点:通常能获得最高的精度,量化损失最小,尤其适合极低比特(如2bit, 3bit)量化。
缺点:过程复杂,成本高昂,需要完整的训练数据、pipeline和大量的计算资源与时间。
代表技术:QLoRA 它用4bit量化加载基础模型,再通过一小组可训练的LoRA适配器(通常用BF16)来恢复性能,实现了高效且高性能的微调
2. 按量化粒度分类
这指的是为多少参数共享一套量化参数(缩放因子Scale和零点Zero-point)。
每张量量化(Per-Tensor):一个完整的Tensor(例如,模型的一层权重)使用同一套量化参数。
优点:计算简单,硬件支持友好。
缺点:粒度粗,如果Tensor内数值分布差异大,精度损失会较大。
每通道量化(Per-Channel):对卷积或线性层的每个输出通道使用不同的量化参数。
优点:更精细,能更好地适应权重在不同通道上的分布差异,精度保留更好。
缺点:计算稍复杂,需要硬件支持。
注意:这是目前权重量化的主流做法。
每组量化(Per-Group/Block):将Tensor分成更小的组(Group)或块(Block),每个组有自己的量化参数。这是比每通道更细的粒度。
优点:在极低比特量化时能极大保留精度。
缺点:计算开销和复杂性最高。
3. 按量化对象分类
仅权重量化(Weight-only Quantization):只将模型的权重转换为低精度,前向计算过程中的激活值仍保持高精度(如FP16)。
优点:简单,能大幅减少模型存储空间和加载时间。
缺点:无法加速计算(因为计算依赖激活值),无法减少运行时内存(激活值占用的内存)。
代表:GPTQ主要用于权重量化。
权重和激活值全量化(Weight-and-Activation Quantization):将权重和激活值都进行量化。
优点:这是真正能同时节省内存和加速计算的方法。
缺点:难度更大,尤其是激活值动态范围大且包含异常值,使其难以量化。
代表:SmoothQuant 的核心目标就是实现成功的全量化(W8A8)。
4. 按权重共享程度分类
对称量化(Symmetric Quantization):将数值范围对称地映射到整数范围(例如 [-127, 127])。此时零点(Zero-point)为0。
优点:计算更简单,不需要处理零点的额外计算,推理速度快。
缺点:如果原始数据分布不对称,会浪费一部分量化区间。
非对称量化(Asymmetric Quantization):根据实际最小/最大值确定映射范围,整数范围不对称(例如 [0, 255])。零点不为0。
优点:能更充分地利用整个量化区间,精度更高。
缺点:计算时需要处理零点,引入额外计算开销。
更多推荐
所有评论(0)