1525 字
8 分钟
模型压缩:量化与蒸馏

为什么需要压缩#

大模型部署受两类资源限制:

  • 显存:模型权重、KV Cache 和激活值要同时放进 GPU;
  • 带宽与算力:Decode 阶段每生成一个 token 都要读取大量权重,访存带宽常成为瓶颈。

压缩的目标是在尽量保持效果的前提下,减少存储和计算量。两种主要手段是量化(降低每个参数的位数)和蒸馏(把大模型的能力迁移到小模型)。

量化#

量化把浮点数映射为低位整数。最常用的是均匀量化:

q=clip⁡(round⁡(rS)+Z,  qmin⁡,  qmax⁡)q = \operatorname{clip}\left(\operatorname{round}\left(\frac{r}{S}\right) + Z,\; q_{\min},\; q_{\max}\right)r≈S(q−Z)r \approx S(q - Z)

其中:

  • rr 是量化前的浮点值;
  • SS 是缩放因子,把浮点范围映射到整数范围;
  • ZZ 是零点,用于表示浮点零对应的整数,支持非对称范围;
  • qmin⁡,qmax⁡q_{\min}, q_{\max} 是量化后的整数范围,例如 int8 为 [−128,127][-128, 127];
  • clip⁡\operatorname{clip} 防止超出范围。

对称量化令 Z=0Z=0,常用于权重量化;非对称量化保留零点偏移,适合分布偏斜的激活值。

量化粒度#

粒度做法特点
Per-tensor整个张量共用一组 S,ZS, Z实现简单,精度较低
Per-channel / per-token每个通道或每个 token 单独量化更精细,适合权重/激活分布差异大的情况
Per-group把通道分成大小为 gg 的组,每组一组参数在精度和开销之间折中

组越小,量化越精细、精度越高,但需要存储更多缩放因子。g=1g=1 退化为逐通道,gg 等于通道数时退化为逐张量。

量化对象#

  • 权重量化:减少模型存储和加载带宽,是部署中最常见的做法;
  • 激活值量化:减少每层中间结果的存储和计算,难度更大,因为激活值中存在离群点。

训练时机#

  • QAT(量化感知训练):训练时就模拟量化,前向用伪量化值,反向仍用浮点梯度,让模型适应低精度;
  • QAF(量化感知微调):在微调阶段加入量化感知,兼顾压缩和效果;
  • PTQ(训练后量化):直接对训练好的模型量化,实现简单、成本低,但会带来精度损失。

大模型通常先用 PTQ;精度不够时再考虑 QAT/QAF。

常见 PTQ 方法#

LLM.int8()#

观察:激活值中存在少量数值很大的离群特征,它们拉伸了量化范围,导致其他值有效位数不足。LLM.int8() 把离群特征保持 FP16 单独计算,其余特征用 int8 矩阵乘,最后把两部分结果相加。

GPTQ#

GPTQ 逐层量化,目标是让量化后的层输出尽量接近原始层输出:

min⁡W^∥XW−XW^∥22\min_{\hat{\mathbf{W}}} \left\|\mathbf{X}\mathbf{W} - \mathbf{X}\hat{\mathbf{W}}\right\|_2^2

它利用 Hessian 近似估计每个权重对输出的影响,按列量化并在量化后补偿误差。GPTQ 可以把权重压到 3–4 bit,推理时反量化计算。

SmoothQuant#

激活值难量化、权重容易量化。SmoothQuant 引入平滑因子 ss,做等效变换:

Y=(XW)=(Xdiag⁡(s)−1)(diag⁡(s)W)\mathbf{Y} = (\mathbf{X}\mathbf{W}) = \left(\mathbf{X}\operatorname{diag}(s)^{-1}\right)\left(\operatorname{diag}(s)\mathbf{W}\right)

让激活值除以 ss 缩小离群点影响,权重乘以 ss 承担一部分难度,从而把“激活难量化、权重易量化”变成两者都较容易量化。

SpQR#

SpQR 识别对量化误差特别敏感的少量权重(约 top 1%),用稀疏矩阵高精度保存,其余权重压到 3–4 bit。它通过校准输入评估每个权重的敏感度,实现接近无损的压缩。

AWQ#

AWQ(Activation-aware Weight Quantization)认为只需保护少量关键权重就能显著减少误差。它根据激活值和权重的大小寻找缩放因子,保护重要通道,而不是单独存储离群权重,因此实现更简单、推理更高效。

知识蒸馏#

蒸馏把复杂教师模型的知识迁移到更小的学生模型。学生不只学习真实标签,还学习教师输出的软标签(概率分布),其中包含类别之间的相似性信息。

设教师输出 pTp_T、学生输出 pSp_S,温度为 τ\tau 时:

L=(1−α)CE⁡(y,pS)+ατ2KL⁡(pT(τ) ∥ pS(τ))\mathcal{L} = (1-\alpha)\operatorname{CE}(y, p_S) + \alpha \tau^2 \operatorname{KL}\left(p_T^{(\tau)} \,\|\, p_S^{(\tau)}\right)

α\alpha 平衡真实标签损失和蒸馏损失,τ\tau 软化概率分布,让学生看到“哪些错误答案也比较接近”。

白盒与黑盒#

  • 白盒蒸馏:可以访问教师内部结构和中间层,例如 MiniLLM 用反向 KL 散度让学生匹配教师的分布,避免学生在教师低概率区域分配过多概率;
  • 黑盒蒸馏:只能访问教师的输入和输出,例如 GKD 对学生生成的序列进行采样,用教师打分来构造训练信号。

涌现能力的蒸馏#

大模型的上下文学习(ICL)、思维链(CoT)、指令遵循(IF)等能力通常在规模达到一定程度后才出现。蒸馏不只迁移最终答案,还可以迁移:

  • 教师的推理过程(思维链);
  • 教师对示例的使用方式;
  • 教师的指令遵循行为。

这比只拟合输出分布更难,因为学生需要学习“如何思考”,而不只是“答案是什么”。

取舍#

方法压缩对象优点局限
量化权重/激活显著降低显存和带宽,推理快低位量化可能损失精度
蒸馏模型规模学生模型小、推理便宜需要教师和训练数据,能力上限受教师限制

量化通常不需要重新训练,适合快速部署;蒸馏需要训练学生模型,但能得到结构更小、延迟更低的新模型。实际部署中两者可以叠加,例如先蒸馏得到小模型,再做 4-bit 量化。

相关阅读#

模型压缩:量化与蒸馏
https://biscuit0613.github.io/posts/nlp/11-02-quantization-distillation/
作者
Biscuit
发布于
2026-10-20
许可协议
CC BY-NC-SA 4.0
大模型推理部署:KV Cache、PagedAttention 与推理框架
提示工程:从手工模板到自动优化