EN

AI模型压缩:剪枝、量化和知识蒸馏

在不牺牲准确率的前提下部署更小、更快的AI模型

返回教程列表🌐 Read in English
高级42 分钟

AI模型压缩:剪枝、量化和知识蒸馏

在不牺牲准确率的前提下部署更小、更快的AI模型

模型压缩三大手段:量化(GPTQ/AWQ/GGUF、8·4bit)、剪枝(结构化/非结构化)、知识蒸馏。讲原理、真实工具与精度/速度/显存权衡。

大模型部署到生产环境时,显存占用和推理延迟是两大瓶颈。模型压缩通过减少参数冗余或降低数值精度,在不显著损害能力的前提下让模型跑得更快、更省显存。主流方向有三个:量化、剪枝、知识蒸馏。下面逐一拆解原理、工具和常见坑。

量化:用更低精度换速度与显存

量化将模型权重和激活值从 FP16/BF16 压缩到 INT8、INT4 甚至更低精度。核心思想是:神经网络对数值误差有一定容忍度,用更少的比特表示参数,可以大幅减少显存占用并利用硬件整数计算加速。

#### 主流量化方法

  • GPTQ:基于 Hessian 矩阵的逐层后训练量化。先校准一小批数据,然后对每层权重做最优量化,尽量保留原始输出的分布。适用于 GPU 推理,支持 4bit 和 8bit。
  • AWQ:感知激活的量化。通过观察激活值中哪些通道更重要,对重要通道保留更高精度,次要通道用更低比特。比 GPTQ 在同等比特下通常保留更多精度。
  • GGUF:专为 CPU 和混合设备设计的量化格式(源自 llama.cpp 生态)。支持从 Q2 到 Q8 多种级别,量化后模型可直接在 CPU 上运行,适合本地部署。
  • bitsandbytes:Hugging Face 生态中的 8bit/4bit 量化库,通过 load_in_8bitload_in_4bit 参数一键加载量化模型。底层使用分块量化(block-wise quantization)和双重量化(double quantization)减少精度损失。
  • #### 精度与速度的定性权衡

  • 8bit 量化:精度损失极小(通常 <1%),显存减半,推理速度提升 1.5-2 倍。
  • 4bit 量化:精度损失明显但可接受(常见任务下降 1-3%),显存降至 1/4,推理速度提升 2-3 倍。
  • 更低比特(2-3bit):精度下降显著,仅适合对质量要求不高的场景。
  • #### 常见坑

  • 校准数据不匹配:GPTQ/AWQ 需要校准数据集(如 wikitext、c4)。如果校准数据与下游任务分布差异大,量化后精度会意外下降。
  • 激活值量化更敏感:权重量化通常比激活值量化更安全。激活值量化(如 INT8 动态量化)在 Transformer 模型中容易导致注意力分布失真。
  • 硬件兼容性:不是所有 GPU 都支持 INT4 矩阵乘法。NVIDIA 从 Ampere 架构(RTX 30 系列)开始支持 INT8,INT4 需要 Turing 或更新架构。CPU 上 GGUF 的 Q4 级别通常比 FP16 快 3-4 倍,但依赖 AVX2 指令集。
  • 剪枝:去掉冗余参数

    剪枝移除对模型输出贡献小的参数(权重或神经元),减少计算量和显存。分为结构化剪枝和非结构化剪枝。

    #### 结构化剪枝

    移除整个神经元、注意力头或层。优点是剪枝后模型结构规整,可以直接用标准推理框架加速。缺点是灵活性低,容易导致精度骤降。

  • 方法:基于幅度剪枝(Magnitude Pruning)—— 移除 L2 范数最小的神经元;或基于重要性评分(如 SNIP、GraSP)—— 用梯度或 Hessian 信息判断哪些结构更重要。
  • 工具:PyTorch 的 torch.nn.utils.prune 支持结构化剪枝;Intel Neural Compressor、NVIDIA TensorRT 也提供结构化剪枝接口。
  • #### 非结构化剪枝

    移除单个权重,保留稀疏矩阵。优点是灵活,可以保留更多精度。缺点是稀疏矩阵在通用硬件上加速困难,需要专用稀疏计算库(如 NVIDIA cuSPARSE、Intel MKL)。

  • 方法:幅度剪枝(移除绝对值最小的权重)、迭代剪枝(逐步剪枝并微调)。
  • 工具:SparseML(Neural Magic 出品)支持非结构化剪枝并导出为 ONNX 格式,配合 CPU 上的稀疏推理加速。
  • #### 常见坑

  • 剪枝率过高导致精度崩塌:非结构化剪枝超过 70-80% 后,精度通常急剧下降。结构化剪枝更脆弱,移除 20-30% 的神经元就可能需要大量微调补偿。
  • 微调不足:剪枝后必须微调(fine-tune)几轮,否则精度损失无法恢复。微调学习率通常设为原始训练的 1/10。
  • 稀疏加速依赖硬件:非结构化剪枝在 GPU 上加速有限,除非使用 NVIDIA 的稀疏张量核心(Ampere 架构支持 2:4 结构化稀疏)。CPU 上稀疏矩阵乘法比稠密慢,除非矩阵稀疏度 >90%。
  • 知识蒸馏:用小模型学大模型

    知识蒸馏(Knowledge Distillation)让一个小的学生模型模仿大教师模型的输出分布,从而在更小参数量的情况下接近教师的能力。

    #### 原理

  • 软标签:教师模型输出 logits(未归一化的分数),学生模型学习这些 logits 的分布,而不是硬标签(one-hot 类别)。温度参数 T 控制软标签的平滑度:T 越高,分布越均匀,学生学到更多类间关系。
  • 中间层蒸馏:除了输出层,还可以让学生模型模仿教师模型的中间层特征(如 Transformer 的 hidden states),提升知识迁移效果。
  • 关系蒸馏:让学生模型学习教师模型中样本之间的关系(如 pairwise similarity),适用于检索或对比学习任务。
  • #### 工具

  • Hugging Face Transformers:内置 Trainer 支持蒸馏,通过 DistilBertForSequenceClassification 等预蒸馏模型可直接使用。
  • Textbooks Are All You Need(Phi-1/Phi-2 系列):微软用合成数据 + 蒸馏训练小模型,证明高质量蒸馏数据比模型大小更重要。
  • TinyBERT / MobileBERT:专门为 BERT 设计的蒸馏方案,分别压缩 7.5x 和 4x,精度损失在 1-2% 以内。
  • #### 常见坑

  • 教师模型与学生模型架构差异大:如果教师是 70B 的 LLaMA,学生是 1B 的 TinyLLaMA,直接蒸馏输出 logits 效果差。建议先让学生模型在教师生成的软标签上训练,再微调。
  • 温度 T 选择不当:T 太小(如 1)接近硬标签,失去蒸馏优势;T 太大(如 20)分布过于平滑,学生学不到细节。通常 T=4-8 是安全起点。
  • 蒸馏数据质量:教师模型在蒸馏数据上的表现直接影响学生。如果教师对某些样本预测错误,学生会继承这些错误。建议用教师模型在干净数据上生成软标签,或使用数据增强。
  • 三种方法的组合使用

    实际部署中,三种方法常组合使用:

  • 先蒸馏:用大模型训练一个小模型,减少参数量。
  • 再剪枝:对小模型做结构化剪枝,移除冗余神经元。
  • 最后量化:对剪枝后的模型做 INT8 或 INT4 量化,进一步压缩显存。
  • 例如,Hugging Face 的 optimum-intel 库支持蒸馏 + 量化流水线;NVIDIA TensorRT 支持剪枝 + 量化联合优化。但注意:组合使用会放大精度损失,每步后都需要验证并微调。

    FAQ

    Q:量化后的模型还能微调吗? A:可以,但需要小心。INT4 量化模型通常不支持反向传播(bitsandbytes 的 4bit 量化只支持推理)。如果想微调,建议用 QLoRA:保持 4bit 权重不变,插入可训练的 LoRA 适配器,只更新适配器参数。

    Q:剪枝和量化哪个对精度影响更大? A:通常量化(尤其是 8bit)比剪枝更安全。8bit 量化几乎不损失精度,而剪枝即使 20% 也可能需要微调。但 4bit 量化损失可能超过 50% 剪枝。具体取决于模型和任务。

    Q:知识蒸馏需要多少数据? A:至少需要教师模型训练数据的 10-20%。数据量太少,学生模型容易过拟合到教师的软标签。如果数据有限,可以用教师模型生成合成数据(如 Self-Instruct 方法)。

    Q:GGUF 和 GPTQ 哪个更好? A:取决于部署场景。GGUF 针对 CPU 优化,适合本地推理(如 llama.cpp);GPTQ 针对 GPU 优化,适合云端推理。精度上,同比特下 GPTQ 通常略优于 GGUF,但差距很小。

    Q:结构化剪枝后模型结构变了,如何部署? A:剪枝后的模型需要导出为支持动态形状的格式(如 ONNX 或 TensorRT engine)。如果剪枝移除了注意力头,需要修改模型配置文件(如 config.json 中的 num_attention_heads)。建议用 torch.jit.scriptonnx.export 导出时指定动态轴。

    *最后更新:2026 年 7 月。请以各工具官方文档为准。*

    相关工具

    pytorchonnxtfliteauto-gptq
    所属主题:模型微调与训练