Repository navigation
MO #471
Copy link
Copy link
Open
Description
模型性能优化技术
- 量化 - 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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity