Skip to content

MO #471

Open
Open

Description

@junxnone

模型性能优化技术

  • 量化 - Quantization
  • 稀疏 - Pruning/Sparsity
  • 蒸馏 - Distillation

三者都是让模型变得更小/更快的手段,但作用的维度不同,互相正交、可以组合使用:

技术 压缩的是什么 典型压缩率 是否需要训练
量化 Quantization 数值精度(FP32→INT8/INT4) 2-4 倍 不一定(PTQ 不需要,QAT 需要)
剪枝 Pruning/Sparsity 参数数量 非结构化可达 50-90%+ 稀疏度;结构化通常 20-60% 通常需要微调恢复精度
蒸馏 Distillation 模型架构(换成更小的学生网络) 由架构设计决定,可达数倍到数十倍 需要(训练学生模型)

业界常见组合拳:先剪枝/蒸馏把模型本身缩小,再量化部署;或者剪枝后用蒸馏损失辅助恢复精度。详见 知识蒸馏、量化。

量化

  • Post Training Quantization
    • 静态量化
    • 动态量化
    • 仅权重量化(LLM)
  • During training quantization(训练过程中模拟量化过程)
    • Quantization-aware training:训练时插入"伪量化"节点模拟低精度带来的误差,让权重在训练中就适应这个误差,通常比同等比特下的 PTQ 精度更高,代价是需要训练数据和算力;核心技术细节(Straight-Through Estimator 怎么解决 round() 不可导)见 量化
  • Mixed-Precision
    • 引入不同数据类型

静态量化

  • 不需要 Fine-tune
  • 在 Calibration Dataset 上做前向推理,收集 Tensor 分布,计算可以量化的层的 min/max, 获取 zero point 和 scale , FP32-> INT8/INT4
  • 运行在 INT8 上
  • 输入和权重 都量化
  • One scale for weight
  • Per output channel scale for weight

动态量化

  • 不需要数据调校
  • 根据 mini-batch 统计数据分布,获取 min/max -> zero point/scale,实时转换 tensor FP32 -> INT8

仅权重量化

  • 压缩到 INT4 ,计算式转到 FP32
  • 放在 Cache 中,节省 Memory 移动时间 [Cacheline 时间]
  • LLM 场景下的具体算法(GPTQ/AWQ)和文件格式(GGUF)见 量化

非对称量化和对称量化

  • Asymmetric quantization - 通常用于输入
  • Symmetric quantization - 通常用于权重

稀疏/剪枝(Pruning/Sparsity)

把网络里不重要的部分直接去掉,减少参数数量和计算量。

结构化 vs 非结构化

  • 非结构化剪枝:逐个移除单独的权重,掩码在矩阵里不规则分布。压缩率可以很高(权重数量减少 90%+ 精度基本不变),但剪完是不规则稀疏矩阵,普通稠密 GEMM 内核吃不到这种稀疏性,需要专用稀疏内核(如 cuSPARSE)才能真正换成延迟/显存收益——没有专用硬件支持时经常是"稀疏了但不快";
  • 结构化剪枝:整块移除(通道/filter/attention head/整层),剪完仍是规则稠密矩阵,直接 reshape 成更小的模型即可在任何硬件上获得加速,但同等参数预算下精度损失通常更大(移除粒度更粗);
  • 本质权衡:压缩率 vs 硬件友好度。

经典剪枝准则

  • 幅度剪枝(magnitude pruning):剪掉绝对值最小的权重,实现最简单,至今仍是强基线;
  • 彩票假说(Lottery Ticket Hypothesis):Frankle & Carbin(ICLR 2019)发现,稠密随机初始化网络里存在"中奖子网络"——若单独用原始初始化训练,能达到和原网络相当的精度。找中奖票的方法是迭代幅度剪枝(IMP):训练→剪掉最小幅度权重→剩余权重重置回初始值→重复;
  • 梯度/泰勒展开重要性评分:用权重对损失的一阶(梯度×权重)或泰勒展开估计移除某权重/通道引起的损失变化,常用于结构化剪枝的通道排序;
  • Optimal Brain Damage / Optimal Brain Surgeon(LeCun et al. 1989、Hassibi & Stork 1993):用 Hessian(对角近似/完整逆矩阵)估计移除权重的代价,精度更高但计算量远大于幅度剪枝,是 SparseGPT 等现代方法的理论源头。

剪枝发生的时机

  • 训练前:如 SNIP,用单批数据的梯度估计"连接敏感度",一次性剪枝后从头训练;
  • 训练中:渐进式幅度剪枝(Gradual Magnitude Pruning),稀疏度随训练步数从 0 逐步升到目标值;
  • 训练后:一次性或迭代式剪枝预训练好的模型,再微调恢复精度——这是 LLM 时代的主流范式。

现代 LLM 剪枝

  • SparseGPT(2023):单次前向、无需梯度/重训练,逐层求解局部二次优化问题补偿剩余权重,可把 175B 级模型剪到 50% 稀疏度且精度几乎不降;
  • Wanda(2024):评分 = 权重幅度 × 对应输入激活的 L2 范数,无需梯度/权重更新,比 SparseGPT 快约 300 倍,效果相当;
  • 结构化 LLM 剪枝:LLM-Pruner(构建依赖图整组移除 + LoRA 恢复)、Sheared-LLaMA(端到端剪掉层/头/维度得到目标形状再继续预训练);
  • N:M 结构化稀疏:连续 M 个权重中保留 N 个非零(如 2:4,每 4 个权重留 2 个),是"规则到可被硬件识别"又"细到接近非结构化压缩率"的折中。NVIDIA Ampere 及以上的 Sparse Tensor Core 原生支持 2:4,通过 cuSPARSELt 库可实现理论 2 倍吞吐,是少数能把稀疏度直接兑现为真实加速的通用方案。

验证要点

剪枝(+必要微调)后要在 held-out 测试集/下游任务上评估精度,确认相对稠密模型的损失在可接受范围。关键陷阱:非结构化剪枝即使稀疏度很高,如果没有专用稀疏内核或 2:4 结构化稀疏硬件支持,实际推理延迟往往没有改善——必须同时报告"真实延迟/吞吐"而不是只报告稀疏度百分比。

蒸馏(Distillation)

用一个训练好的大模型(Teacher)指导一个小模型(Student)训练,让 Student 学到 Teacher 的泛化能力而不只是硬标签。蒸馏范式分类、发展历史、LLM 时代的应用(如 DeepSeek-R1 的推理能力蒸馏)详见 知识蒸馏。

Reference

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions