参考:
https://zhuanlan.zhihu.com/p/662881352
https://www.53ai.com/news/qianyanjishu/1072.html
1. 模型量化的基础
模型量化是将神经网络的权重和激活值从高精度(如FP32)转换为低精度(如INT8、INT4甚至二值化)的技术。目的是优化模型在推理阶段的性能,适用于大模型(如LLM)在资源受限环境下的部署。
1.1 核心概念
- 量化映射:
- \( x_{\text{float}} \)(浮点值) → \( x_{\text{quant}} \)(整数值)
- 公式:\( x_{\text{quant}} = \text{round} \left( \frac{x_{\text{float}} - z}{s} \right) \)
- 反量化:\( x_{\text{float}} \approx s \cdot x_{\text{quant}} + z \)
- \( s \)(scale):缩放因子,决定量化范围。
- \( z \)(zero point):零点,处理非对称分布。
- 量化范围:
- 对称量化:\( z = 0 \),范围为 \([-s \cdot 127, s \cdot 127]\)(INT8为例)。
- 非对称量化:范围为 \([s \cdot (-128 + z), s \cdot (127 + z)]\)。
- 精度损失:量化会引入误差(rounding error),目标是最小化误差对模型性能的影响。
1.2 量化粒度
- 逐层(Per-Layer):每层独立的 \( s \) 和 \( z \)。
- 逐通道(Per-Channel):卷积核的每个通道有独立的 \( s \) 和 \( z \),精度更高。
- 逐张量(Per-Tensor):整个张量共享 \( s \) 和 \( z \),计算简单但灵活性低。
2. 量化方法分类
以下是常见的具体量化方法,从基础到高级逐一展开。
2.1 训练后量化(Post-Training Quantization, PTQ)
- 定义:在预训练模型上直接量化,无需重新训练。
- 流程:
- 收集校准数据集(通常几百到几千个样本)。
- 统计每一层的权重和激活值分布。
- 计算 \( s \) 和 \( z \):
- Min-Max方法:\( s = \frac{\text{max} - \text{min}}{2^b - 1} \),\( z = -\text{round}(\text{min}/s) \)(\( b \)为位宽,如INT8用8)。
- KL散度方法:最小化量化前后分布的差异。
- 将权重和激活值映射到整数域。
- 优点:简单快速,无需训练数据。
- 缺点:对动态范围大的模型(如LLM)精度损失明显。
- 变种:
- 静态量化:权重和激活值都量化,需校准数据。
- 动态量化:仅权重量化,激活值在推理时动态计算(适用于LSTM等)。
2.2 量化感知训练(Quantization-Aware Training, QAT)
- 定义:在训练时模拟量化效应,使模型适应低精度。
- 流程:
- 在前向传播中插入伪量化节点:
- \( x_{\text{quant}} = \text{clamp}(\text{round}(x/s) + z, \text{min}, \text{max}) \)
- \( \text{clamp} \)限制整数范围(如INT8为-128到127)。
- 反向传播仍使用FP32梯度(直通估计器,STE):
- \( \frac{\partial L}{\partial x} \approx \frac{\partial L}{\partial x_{\text{quant}}} \)。
- 训练完成后导出量化模型。
- 在前向传播中插入伪量化节点:
- 优点:精度接近原始模型。
- 缺点:需要完整训练流程,计算成本高。
- 应用:Transformer模型(如BERT)常用QAT优化部署。
2.3 二值化和三值化(Binary/Ternary Quantization)
- 二值化(BNN, Binary Neural Network):
- 权重和激活值量化到 {-1, +1}。
- 计算:用位运算(如XNOR和popcount)替代乘法。
- 公式:\( w_{\text{binary}} = \text{sign}(w) \)。
- 优点:极低的计算和存储需求。
- 缺点:精度损失严重,仅适用于简单任务。
- 三值化(TNN, Ternary Neural Network):
- 权重量化到 {-1, 0, +1}。
- 优点:在二值化和更高精度间平衡。
- 方法:通过阈值(如\( |w| > \Delta \))确定非零值。
2.4 混合精度量化(Mixed Precision Quantization)
- 定义:不同层或操作使用不同精度(如FP16、INT8、INT4)。
- 实现:
- 分析每层的量化敏感性(sensitivity analysis)。
- 对敏感层保留高精度(如注意力机制用FP16),非敏感层用低精度(如全连接层用INT8)。
- 工具:NVIDIA TensorRT支持自动混合精度优化。
- 应用:LLM中常用于平衡速度和精度。
2.5 向量量化(Vector Quantization, VQ)
- 定义:将权重或激活值聚类为离散的码本(codebook),用索引表示。
- 流程:
- 用K均值聚类训练码本。
- 将每个值替换为最近的码本索引。
- 优点:压缩率高,适合超大模型。
- 缺点:实现复杂,推理时需查表。
- 应用:VQ-VAE、产品量化(Product Quantization)。
2.6 平滑量化(SmoothQuant)
- 定义:针对LLM设计的量化方法,通过平滑激活值分布减少量化误差。
- 原理:
- 激活值动态范围大(如Transformer中的softmax输出),难以直接量化。
- 通过线性变换(如\( Y = X / \alpha, W = W \cdot \alpha \))平滑分布。
- 优点:显著提升INT8量化后的性能。
- 应用:Hugging Face的LLM量化优化。
2.7 GPTQ(Generalized Post-Training Quantization)
- 定义:专为大语言模型设计的PTQ方法,基于逐层误差补偿。
- 流程:
- 对权重矩阵逐行量化。
- 用Hessian矩阵估计量化误差,调整后续权重。
- 优点:在INT4/INT3下仍保持较高精度。
- 应用:GPT系列模型的低精度部署。
2.8 AWQ(Activation-aware Weight Quantization)
- 定义:根据激活值的重要性自适应调整权重量化。
- 原理:
- 识别对激活值影响大的权重,保留更高精度。
- 对次要权重使用更低位宽。
- 优点:针对LLM的稀疏性优化效果好。
- 应用:与GPTQ结合使用。
2. 具体量化方法(扩展)
以下是新增和补充的量化方法,包括 QLoRA、BitFit 等,以及其他前沿技术。
2.1 QLoRA(Quantized Low-Rank Adaptation)
- 定义:QLoRA 是一种高效微调大语言模型(LLM)的方法,结合了低秩适配(LoRA)和量化技术。
- 原理:
- LoRA:通过在权重矩阵上添加低秩更新(如 \( W = W_0 + AB \)),只微调 \( A \) 和 \( B \)(小矩阵),而冻结 \( W_0 \)。
- 量化:将预训练权重 \( W_0 \) 量化为低精度(如INT4),微调时仍保持高精度更新(如FP16)。
- 公式:\( W_{\text{quant}} = \text{quantize}(W_0, 4-bit) + AB \)。
- 流程:
- 将预训练模型权重量化为INT4(如使用GPTQ方法)。
- 在冻结的量化权重上添加LoRA层。
- 用少量数据微调LoRA参数。
- 优点:
- 内存占用极低(如13B模型可在单GPU上微调)。
- 微调效率高,精度接近全参数微调。
- 缺点:依赖预训练模型的质量,量化误差可能累积。
- 应用:Hugging Face的PEFT库支持QLoRA,常用于LLM(如LLaMA)的任务适配。
2.2 BitFit(Bias-only Fine-Tuning with Quantization)
- 定义:BitFit 是一种轻量级微调方法,只调整模型的偏置参数(bias),结合量化进一步减少开销。
- 原理:
- 冻结大部分权重(如Transformer的 \( W \)),只微调偏置项(如 \( b \))。
- 将冻结的权重量化为低精度(如INT8)。
- 公式:\( y = W_{\text{quant}} \cdot x + b_{\text{tuned}} \)。
- 流程:
- 对预训练模型权重进行PTQ(如INT8)。
- 解冻偏置参数,用目标任务数据微调。
- 优点:
- 参数更新极少(仅偏置,约占0.1%参数)。
- 计算和存储需求低。
- 缺点:表达能力有限,适合小规模任务调整。
- 应用:小型设备上的LLM微调,或与QLoRA结合使用。
2.3 GPTQ(Generalized Post-Training Quantization)
- 定义:专为LLM设计的训练后量化方法,通过逐层误差补偿实现低位宽量化(如INT4/INT3)。
- 原理:
- 逐行量化权重矩阵。
- 使用Hessian矩阵估计量化误差,调整后续权重以补偿。
- 公式:\( W_{\text{quant}} = \arg\min \| W - W_{\text{quant}} \|_H^2 \)。
- 流程:
- 输入校准数据,计算每层权重分布。
- 逐层量化,优化误差。
- 输出低精度模型。
- 优点:支持极低位宽(如INT3),精度损失小。
- 应用:广泛用于GPT系列模型的压缩。
2.4 AWQ(Activation-aware Weight Quantization)
- 定义:根据激活值的重要性自适应调整权重量化。
- 原理:
- 通过分析激活值分布,识别对输出影响大的权重。
- 对重要权重保留高精度(如INT8),次要权重用低精度(如INT4)。
- 流程:
- 收集激活值统计数据。
- 计算权重对激活的敏感性。
- 自适应分配位宽。
- 优点:针对LLM的稀疏性优化效果显著。
- 应用:常与GPTQ结合,提升超低精度性能。
2.5 SmoothQuant
- 定义:通过平滑激活值分布,优化LLM的低精度量化。
- 原理:
- LLM激活值范围差异大(如softmax输出)。
- 用线性变换平滑:\( Y = X / \alpha, W = W \cdot \alpha \)。
- 流程:
- 统计激活值分布,确定平滑因子 \( \alpha \)。
- 调整权重和激活,进行量化。
- 优点:显著减少INT8量化的精度损失。
- 应用:Hugging Face支持的LLM优化。
2.6 LSQ(Learned Step Size Quantization)
- 定义:量化感知训练的一种改进,通过学习缩放因子 \( s \) 优化量化。
- 原理:
- 将 \( s \) 视为可训练参数,在QAT中优化。
- 公式:\( x_{\text{quant}} = \text{round}(x / s) \)。
- 流程:
- 初始化 \( s \)(如min-max方法)。
- 在训练中联合优化权重和 \( s \)。
- 优点:自适应性强,精度高。
- 缺点:训练复杂度增加。
- 应用:CNN和Transformer模型。
2.7 PACT(Parameterized Clipping Activation)
- 定义:通过参数化激活值的剪切范围,优化量化效果。
- 原理:
- 动态调整激活值的上下界(如 \( \text{clip}(x, -\alpha, \alpha) \))。
- \( \alpha \) 在训练中学习。
- 流程:
- 在QAT中插入PACT层。
- 联合优化 \( \alpha \) 和权重。
- 优点:减少激活值溢出,提升INT8性能。
- 应用:适用于激活值分布不均匀的模型。
2.8 ZeroQ
- 定义:一种无需校准数据的PTQ方法,通过生成合成数据量化模型。
- 原理:
- 用模型统计信息生成伪输入数据。
- 根据伪数据估计量化参数。
- 优点:无需真实数据,隐私友好。
- 缺点:精度依赖生成数据的质量。
- 应用:数据受限场景下的LLM量化。
2.9 BinaryConnect 和 XNOR-Net
- BinaryConnect:
- 权重量化为 {-1, +1},训练时保留FP32副本。
- 优点:位运算加速。
- XNOR-Net:
- 权重和激活值均为二值,推理用XNOR和popcount。
- 缺点:精度低,需大量调整。
3. 方法对比
方法 | 类型 | 位宽 | 精度损失 | 计算复杂度 | 适用场景 |
---|---|---|---|---|---|
QLoRA | QAT | INT4+FP16 | 小 | 中 | LLM微调 |
BitFit | QAT | INT8 | 中 | 低 | 轻量微调 |
GPTQ | PTQ | INT4/3 | 小 | 中 | LLM压缩 |
AWQ | PTQ | INT4/8 | 小 | 中 | LLM稀疏优化 |
SmoothQuant | PTQ/QAT | INT8 | 小 | 中 | LLM激活优化 |
LSQ | QAT | INT8 | 小 | 高 | 高精度量化 |
PACT | QAT | INT8 | 小 | 高 | 激活值优化 |
ZeroQ | PTQ | INT8 | 中 | 中 | 无数据量化 |
BinaryConnect | QAT | 1-bit | 大 | 低 | 极致压缩 |
4. 大模型量化的实现
- QLoRA:Hugging Face PEFT库,结合bitsandbytes实现INT4量化。
- BitFit:PyTorch自定义冻结权重,微调bias。
- GPTQ/AWQ:AutoGPTQ库支持。
- SmoothQuant:参考原论文实现,或用Optimum库。
3. 大模型量化的挑战与解决方案
3.1 挑战
- 动态范围问题:LLM的注意力机制和激活值范围变化大。
- 精度敏感性:微小误差可能影响语义理解。
- 硬件适配:低精度计算需专用硬件支持(如GPU的INT8单元)。
3.2 解决方案
- 逐头量化:对Transformer的每个注意力头单独量化。
- 平滑技术:如SmoothQuant,减少激活值异常。
- 误差补偿:如GPTQ,通过数学优化抵消误差。
4. 量化工具与实现
- PyTorch:
torch.quantization
,支持静态/动态量化。 - TensorFlow:TFLite,内置量化转换。
- ONNX:QuantizeLinear/DequantizeLinear算子。
- NVIDIA TensorRT:INT8/FP16优化,自动混合精度。
- Hugging Face:Optimum库,支持LLM量化(如GPTQ、AWQ)。
5. 面试问题与答案
Q1: QLoRA与LoRA的区别?
- 答:QLoRA在LoRA基础上将预训练权重量化为INT4,减少内存需求,适合单GPU微调。
Q2: BitFit的优势是什么?
- 答:只微调偏置参数,更新量少,计算开销低,适合轻量任务。
Q3: GPTQ如何保证低位宽精度?
- 答:通过Hessian矩阵逐层补偿量化误差。
Q1: 二值化与INT8量化的区别?
- 答:二值化将值量化为{-1, +1},用位运算加速,但精度低;INT8量化为-128到127,精度更高但计算复杂。
Q2: 如何选择量化方法?
- 答:根据任务需求:PTQ适合快速部署,QAT适合高精度,GPTQ/AWQ针对LLM,低位宽(如二值化)用于极致压缩。
Q3: SmoothQuant如何工作?
- 答:通过线性变换平滑激活值分布,使其更适合低精度量化,减少误差。
6. 复习建议
- 实践:用PyTorch对BERT做PTQ和QAT,比较结果。
- 阅读:SmoothQuant、GPTQ的论文。
- 准备:熟悉公式推导和工具使用。