Featured image of post 深度学习八股-量化

深度学习八股-量化

参考:

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)

  • 定义:在预训练模型上直接量化,无需重新训练。
  • 流程
    1. 收集校准数据集(通常几百到几千个样本)。
    2. 统计每一层的权重和激活值分布。
    3. 计算 \( s \) 和 \( z \):
      • Min-Max方法:\( s = \frac{\text{max} - \text{min}}{2^b - 1} \),\( z = -\text{round}(\text{min}/s) \)(\( b \)为位宽,如INT8用8)。
      • KL散度方法:最小化量化前后分布的差异。
    4. 将权重和激活值映射到整数域。
  • 优点:简单快速,无需训练数据。
  • 缺点:对动态范围大的模型(如LLM)精度损失明显。
  • 变种
    • 静态量化:权重和激活值都量化,需校准数据。
    • 动态量化:仅权重量化,激活值在推理时动态计算(适用于LSTM等)。

2.2 量化感知训练(Quantization-Aware Training, QAT)

  • 定义:在训练时模拟量化效应,使模型适应低精度。
  • 流程
    1. 在前向传播中插入伪量化节点:
      • \( x_{\text{quant}} = \text{clamp}(\text{round}(x/s) + z, \text{min}, \text{max}) \)
      • \( \text{clamp} \)限制整数范围(如INT8为-128到127)。
    2. 反向传播仍使用FP32梯度(直通估计器,STE):
      • \( \frac{\partial L}{\partial x} \approx \frac{\partial L}{\partial x_{\text{quant}}} \)。
    3. 训练完成后导出量化模型。
  • 优点:精度接近原始模型。
  • 缺点:需要完整训练流程,计算成本高。
  • 应用: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)。
  • 实现
    1. 分析每层的量化敏感性(sensitivity analysis)。
    2. 对敏感层保留高精度(如注意力机制用FP16),非敏感层用低精度(如全连接层用INT8)。
  • 工具:NVIDIA TensorRT支持自动混合精度优化。
  • 应用:LLM中常用于平衡速度和精度。

2.5 向量量化(Vector Quantization, VQ)

  • 定义:将权重或激活值聚类为离散的码本(codebook),用索引表示。
  • 流程
    1. 用K均值聚类训练码本。
    2. 将每个值替换为最近的码本索引。
  • 优点:压缩率高,适合超大模型。
  • 缺点:实现复杂,推理时需查表。
  • 应用: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方法,基于逐层误差补偿。
  • 流程
    1. 对权重矩阵逐行量化。
    2. 用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 \)。
  • 流程
    1. 将预训练模型权重量化为INT4(如使用GPTQ方法)。
    2. 在冻结的量化权重上添加LoRA层。
    3. 用少量数据微调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}} \)。
  • 流程
    1. 对预训练模型权重进行PTQ(如INT8)。
    2. 解冻偏置参数,用目标任务数据微调。
  • 优点
    • 参数更新极少(仅偏置,约占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 \)。
  • 流程
    1. 输入校准数据,计算每层权重分布。
    2. 逐层量化,优化误差。
    3. 输出低精度模型。
  • 优点:支持极低位宽(如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 \)。
  • 流程
    1. 统计激活值分布,确定平滑因子 \( \alpha \)。
    2. 调整权重和激活,进行量化。
  • 优点:显著减少INT8量化的精度损失。
  • 应用:Hugging Face支持的LLM优化。

2.6 LSQ(Learned Step Size Quantization)

  • 定义:量化感知训练的一种改进,通过学习缩放因子 \( s \) 优化量化。
  • 原理
    • 将 \( s \) 视为可训练参数,在QAT中优化。
    • 公式:\( x_{\text{quant}} = \text{round}(x / s) \)。
  • 流程
    1. 初始化 \( s \)(如min-max方法)。
    2. 在训练中联合优化权重和 \( s \)。
  • 优点:自适应性强,精度高。
  • 缺点:训练复杂度增加。
  • 应用:CNN和Transformer模型。

2.7 PACT(Parameterized Clipping Activation)

  • 定义:通过参数化激活值的剪切范围,优化量化效果。
  • 原理
    • 动态调整激活值的上下界(如 \( \text{clip}(x, -\alpha, \alpha) \))。
    • \( \alpha \) 在训练中学习。
  • 流程
    1. 在QAT中插入PACT层。
    2. 联合优化 \( \alpha \) 和权重。
  • 优点:减少激活值溢出,提升INT8性能。
  • 应用:适用于激活值分布不均匀的模型。

2.8 ZeroQ

  • 定义:一种无需校准数据的PTQ方法,通过生成合成数据量化模型。
  • 原理
    • 用模型统计信息生成伪输入数据。
    • 根据伪数据估计量化参数。
  • 优点:无需真实数据,隐私友好。
  • 缺点:精度依赖生成数据的质量。
  • 应用:数据受限场景下的LLM量化。

2.9 BinaryConnect 和 XNOR-Net

  • BinaryConnect
    • 权重量化为 {-1, +1},训练时保留FP32副本。
    • 优点:位运算加速。
  • XNOR-Net
    • 权重和激活值均为二值,推理用XNOR和popcount。
    • 缺点:精度低,需大量调整。

3. 方法对比

方法类型位宽精度损失计算复杂度适用场景
QLoRAQATINT4+FP16LLM微调
BitFitQATINT8轻量微调
GPTQPTQINT4/3LLM压缩
AWQPTQINT4/8LLM稀疏优化
SmoothQuantPTQ/QATINT8LLM激活优化
LSQQATINT8高精度量化
PACTQATINT8激活值优化
ZeroQPTQINT8无数据量化
BinaryConnectQAT1-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. 量化工具与实现

  • PyTorchtorch.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的论文。
  • 准备:熟悉公式推导和工具使用。
使用 Hugo 构建
主题 StackJimmy 设计