01 · 模型为什么可以变小,代价在哪里
假设每次请求都需要执行一套很大的参数矩阵。优化kernel能更快完成这些乘法;模型压缩则尝试让部署时需要的结构本身更小。剪枝从已有模型删部分权重或结构;蒸馏用教师输出等信号训练学生,可以从小模型出发,也可以恢复剪枝后的模型。
二者不是必须同时使用,也不是保持原模型逐项输出的等价执行变换。要先定义允许的质量损失、部署硬件与目标负载,再决定压缩方案。准备时的校准、教师推理、学生训练和评测都要计成本。
02 · 权重为零,与矩阵真的变小,是两回事
| 路线 | 矩阵或计算路径发生什么 | 速度条件 |
|---|---|---|
| 非结构化剪枝 | 删散落权重,通常保存mask或稀疏表示 | 普通dense GEMM仍遍历原shape;需要合适稀疏表示和执行。 |
| 受约束的结构稀疏 | 每组按特定模式保留权重,如2:4 | 需模型/精度/形状与稀疏kernel及设备匹配。 |
| 结构化宽度剪枝 | 删通道、MLP中间单元、部分头等,并同步相关矩阵 | 真正缩小shape后普通dense计算也可少做,但tile利用率可能下降。 |
| 深度剪枝 | 移除部分层或块,连接前后路径 | 减少串行层,通常需恢复训练与任务评测。 |
只乘mask,或把mask永久折入原权重,未必改变矩阵尺寸。PyTorch剪枝教程展示了mask、重参数化和移除重参数化;这与重建更窄的模块不是同一动作。
依据:PyTorch · mask、剪枝重参数化与移除教程 ↗
剪注意力头时,要同时处理投影、输出拼接和KV头映射;剪隐藏维度可能牵连残差、归一化、Embedding和输出头。不能只删一张矩阵几列就认为整个Transformer可运行。
03 · 手算一个可真正缩小shape的例子
取没有bias的MLP:X→W1→ReLU→W2。输入与输出维度均4,中间维度H=8;W1为4×8,W2为8×4。共有64个参数,每个token执行64次乘法。若保留4个中间单元,就同时选择W1的对应列和W2的对应行,变成4×4与4×4,共32个参数和32次乘法。
原路径:Y = ReLU(X @ W1) @ W2
保留中间索引keep
W1_small = W1[:, keep]
W2_small = W2[keep, :]
Y_small = ReLU(X @ W1_small) @ W2_small
# 无bias教学例;有bias时还需取对应bias并处理其他依赖。缩小后的路径应与“原shape但屏蔽已删中间单元”的路径一致。它通常不与未剪的原模型一致。这两个对照分别检查改写正确性与质量变化,不能混用。
保留相同单元,矩阵shape是否真的变了?
无bias、输入/输出4维,原中间8维;参数量和乘法按矩阵shape计。masked使用普通dense乘法;不模拟稀疏kernel、填充或速度。输出语义以同一删除策略对照。04 · 蒸馏让学生学什么,为什么不只看正确类别
分类或同词表token级蒸馏中,教师给出各候选的概率。只给正确标签C,学生只知道“C是目标”;软分布还会表达教师对其他候选的相对倾向。教师通常固定,不通过学生Loss更新;学生执行前向和反向。
一个常用定义:温度T下p_T=softmax(z_teacher/T),q_T=softmax(z_student/T)。Loss=(1−α)×CE(y,q_1)+α×T²×KL(p_T||q_T),其中KL方向是教师到学生。教师熵对学生梯度为常数,因此软标签交叉熵与此KL有相同学生梯度。
教师:固定参数,前向得到z_teacher(或读取离线目标)
学生:前向得到z_student
p_T = softmax(z_teacher / T)
q_T = softmax(z_student / T)
L = (1-alpha)*CE(label, softmax(z_student))
+ alpha*T*T*sum(p_T*log(p_T/q_T))
仅对学生求梯度 → optimizer更新学生依据:Hinton等 · Distilling the Knowledge in a Neural Network ↗
T>1让分布更平缓;T²是这份Loss配方对温度造成梯度缩放的补偿,不是越大越好,也不是推理时必须用同一温度。不同配方的α约定可能相反,比较实现先对公式。
05 · 三个候选的数值与梯度
自设教师logits=[2,1,0]、学生=[0,0,0],T=2。教师概率约[0.5065,0.3072,0.1863],学生各1/3。仅软项T²KL时,对学生logit梯度为T×(q_T−p_T),约[−0.3463,0.0523,0.2940]。梯度下降会提高第一个logit,并降低另外两个,幅度也有区别。
若硬标签选第一个,普通交叉熵梯度为[−2/3,1/3,1/3];它不表达教师更偏向第二个而非第三个的差别。混合Loss将两种信号按α结合。教师也可能错,学生容量有限,学软分布不保证所有任务都更好。
只优化三维学生logits的教学步骤:
grad[i] = (1-alpha)*(q_1[i]-onehot_y[i])
+ alpha*T*(q_T[i]-p_T[i])
student_logits[i] -= lr*grad[i]
# 真实网络还需通过logits对学生参数链式求导。06 · LLM蒸馏还有哪些路线
| 路线 | 目标来源 | 额外条件 |
|---|---|---|
| token级软目标 | 教师在同一前缀上的词表分布 | token对齐、词表映射、有效位置mask;完整logits可能很大。 |
| 序列级目标 | 教师生成的回答/推理样本作为训练文本 | 可只保存文本,但不再等同于完整软分布匹配。 |
| 中间特征匹配 | 隐藏状态、Attention等表征 | 维度/层数不同时需要对齐或投影,增加训练计算。 |
| 剪枝后恢复 | 剪出的学生再用教师/标签训练 | 恢复质量需要数据、训练预算及独立评测。 |
在线教师会增加每个训练step的前向成本;离线目标把成本提前到数据生成,并增加存储、版本与数据处理。自设软目标有10万条、每条100位置、词表5万、每概率2B,完整原始载荷约1 TB;稀疏top-k等压缩又改变保存信息与Loss定义。
NVIDIA Model Optimizer提供LLM结构剪枝与蒸馏示例;示例配方与支持矩阵不是任意模型、设备和数据的效果保证。
07 · CPU验证结构改写和蒸馏梯度
下载脚本用无bias两层ReLU MLP比较真正缩小矩阵与同shape屏蔽单元,展示未剪输出差异和保留错行的反例。蒸馏部分对混合Loss做有限差分梯度核对,并多步优化学生logits,包含温度1/2/4和数值稳定Softmax。它不训练真实LLM、不运行剪枝搜索或设备内核。
先记录未压缩质量/延迟/吞吐/容量基线
选定结构与部署shape,按校准数据确定保留项
完成所有依赖矩阵改写,验证屏蔽参考的一致性
按明确Loss与数据预算蒸馏/恢复
导出到目标引擎,测真实负载与质量
核对准备成本,决定是否值得部署依据:PyTorch · mask、剪枝重参数化与移除教程 ↗ · NVIDIA Model Optimizer · LLM结构剪枝与蒸馏示例 ↗
08 · 验收:少参数、少运算、少时间各有证据
- 改写:索引、形状、残差/头映射,和相同删除策略的参考输出。
- 蒸馏:教师固定、KL方向、温度/权重、token对齐、mask与数据覆盖。
- 质量:任务、长上下文、稀有能力和生成行为;不能只看训练Loss。
- 硬件:真实shape、dtype、稀疏支持、Prefill/Decode及并发下延迟与吞吐。
- 总成本:校准/教师生成/恢复训练/评测与部署运行之和。
若压缩准备新增成本C,每个业务请求节省s,简化回本量为C/s;二者必须使用同一成本单位,并计质量约束。GPU/NPU上相同shape减少可能有不同收益,稀疏格式更不能直接跨平台套用。
- 为什么将一半权重置零,dense GEMM可能仍没有变快?
- 怎样区分“结构改写正确”与“压缩后质量可接受”?
- 蒸馏教师更大,为什么训练可能更贵而部署推理更便宜?
流程位置与关联方法
这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。
资料与核查范围
原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-10。引用 main / latest 文档时,实际接口以安装版本为准。
- NVIDIA Model Optimizer · LLM结构剪枝与蒸馏示例 ↗
- PyTorch · mask、剪枝重参数化与移除教程 ↗
- Hinton等 · Distilling the Knowledge in a Neural Network ↗
代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。