📢 本文是 「108张AI知识卡片·大模型通关手册」 系列第 13 篇。上一篇讲了部署+推理+量化+加速,这篇讲怎么让模型本身变得更小、更轻——压缩、剪枝、蒸馏,三大瘦身术。

目录


TL;DR 太长不看

30 秒版:先记这 4 条,细节往下翻。

  • 🔴 模型压缩:量化(精度换空间)、剪枝(砍权重换空间)、蒸馏(大模型教小模型换空间)——三种手段,各有适用场景。
  • 🟠 剪枝:找到不重要的权重,置零或删除——结构化剪枝(砍整个神经元)对硬件友好,非结构化剪枝(砍单个权重)压缩率更高但需要稀疏计算支持。
  • 🟡 知识蒸馏:大模型(Teacher)的软标签比硬标签信息更丰富——小模型(Student)学软标签,用更少参数达到接近大模型的效果。
  • 🟢 分布式训练:数据并行(每张卡一份模型副本,数据分片)、模型并行(模型切开放到不同卡上)、流水线并行(按层切分,流水线执行)——大模型训练必选。
  • 🎁 压缩口诀:量化先做性价比最高→剪枝做结构化对硬件友好→蒸馏做任务专用小模型→分布式是训练不是压缩但让大模型训练成为可能。

一、模型压缩:三大瘦身手段对比

在这里插入图片描述

7B 模型 14GB 显存,70B 要 140GB——不是谁都有 8 张 A100。模型压缩就是让模型"瘦身":用更少的参数、更低的精度、更小的体积,达到接近原始模型的效果。

模型压缩解决的核心问题:模型太大,部署太贵。训练好的模型如果太大,推理成本高、部署门槛高、延迟大——压缩让模型"轻装上阵",装进更小的显存,跑在更便宜的硬件上。

它到底在干嘛(机制层):模型压缩三大手段。① 量化(Quantization):降低参数精度——FP16→INT8→INT4,每个参数占的位数减半再减半。上一篇讲过了,这里只做对比。② 剪枝(Pruning):砍掉不重要的权重——把"贡献小"的参数置零或删除,模型变稀疏。③ 知识蒸馏(Knowledge Distillation):大模型(Teacher)教小模型(Student)——小模型学大模型的"软标签"(概率分布),而不是硬标签(正确答案),用更少参数达到接近大模型的效果。三者对比:

量化 剪枝 蒸馏
压缩方式 降低精度 砍权重 换小模型
压缩率 2-4× 2-10× 10-100×
效果损失 1-5% 2-10% 3-15%
需要重训练 否(PTQ) 是(微调恢复) 是(从头训练Student)
硬件要求 通用 稀疏计算支持 通用
适用场景 通用部署 稀疏硬件 任务专用小模型

你能感受到什么(体感层)量化:7B FP16→7B INT8,14GB→7GB,效果几乎无损——最简单的压缩。剪枝:7B 剪掉 50% 权重→3.5B 等效大小,但需要稀疏计算硬件支持才能加速——否则只是省显存不省时间。蒸馏:7B Teacher→1.5B Student,14GB→3GB,效果损失 5-10%——但 Student 是"任务专用"的,在特定任务上可能接近 Teacher。

🎛️ 动手感受:三种压缩手段的效果对比

操作:同一个 7B 模型,分别用 INT8 量化 / 50% 剪枝 / 蒸馏到 1.5B,对比显存和效果。
你会看到

  • INT8 量化:7GB,效果损失 1-2%——最稳的压缩。
  • 50% 剪枝:等效 3.5GB(但实际存储需稀疏格式),效果损失 3-5%——需要微调恢复。
  • 蒸馏到 1.5B:3GB,效果损失 5-10%——但推理速度快 4-5 倍。
  • 变化说明了什么:量化是"无感压缩",剪枝是"有感但可控",蒸馏是"大刀阔斧但换来自由"。

🤔 想一想

三种压缩手段可以叠加:先剪枝(砍掉 50% 权重)→再量化(INT8)→效果接近原始模型的 95%,但体积只有原来的 25%。但叠加顺序有讲究:先剪枝再量化比先量化再剪枝效果好——因为剪枝后模型更稀疏,量化误差在稀疏模型上更可控。

🔗 顺着他想:模型压缩是"总览",接下来逐个拆解——先讲剪枝,最直接的"砍权重"。


二、剪枝:砍掉不重要的权重

在这里插入图片描述

一个 7B 模型有 70 亿个参数——但真的每个参数都重要吗?研究发现,大模型中大量权重接近零,对输出贡献极小。剪枝就是找到这些"不重要"的权重,置零或删除——模型变稀疏,等效体积变小。

剪枝解决的核心问题:大模型有大量冗余参数。训练时参数多有利于优化,但推理时冗余参数浪费算力和显存——剪枝去掉冗余,让模型更紧凑。

它到底在干嘛(机制层):剪枝分两种。① 非结构化剪枝(Unstructured Pruning):砍单个权重——把绝对值最小的权重置零。优点:压缩率高(可以砍掉 90%+ 权重),因为只砍"最不重要的"。缺点:稀疏矩阵需要专门的稀疏计算硬件/软件支持,否则无法加速——GPU 原生不支持稀疏矩阵乘法。② 结构化剪枝(Structured Pruning):砍整个结构单元——整个神经元、整个注意力头、整个 FFN 中间维度。优点:对硬件友好,剪完直接是更小的稠密矩阵,不需要稀疏计算支持。缺点:压缩率比非结构化低(砍整个单元比砍单个权重"粗暴"),效果损失更大。剪枝流程:训练→评估权重重要性→剪枝→微调恢复→再评估→再剪枝→…(迭代剪枝,逐步砍,每次砍一点然后微调恢复,比一次性砍太多效果好)。权重重要性评估:幅度剪枝(绝对值越小越不重要,最简单)、梯度剪枝(梯度×权重越小越不重要,更准确)、损失敏感度(去掉这个权重后损失增加多少,最准确但最慢)。

你能感受到什么(体感层)非结构化剪枝 90%:7B 模型只保留 700M 非零权重——但需要稀疏计算库(如 Neural Magic的DeepSparse),否则推理速度不快。结构化剪枝 50%:7B 模型变成等效 3.5B——直接用标准 PyTorch 推理,速度提升 2 倍。迭代剪枝 vs 一次性剪枝:一次性砍 50% 效果损失 8%,迭代砍(每次砍 10%+微调,重复 5 次)效果损失 3%——迭代更稳但更耗时。

🎛️ 动手感受:不同剪枝策略的效果对比

操作:同一个 7B 模型,分别用非结构化 90% / 结构化 50% / 迭代结构化 50%,对比压缩率和效果。
你会看到

  • 非结构化 90%:等效 0.7B,但需要稀疏引擎——普通 GPU 上不加速。
  • 结构化 50%:等效 3.5B,标准推理速度提升 2 倍,效果损失 5-8%。
  • 迭代结构化 50%:等效 3.5B,效果损失 3-5%——比一次性剪枝好 2-3%。
  • 变化说明了什么:结构化剪枝是工程首选——不需要特殊硬件,直接加速。迭代剪枝是效果首选——花更多时间,换来更少的效果损失。

🤔 想一想

剪枝的"重要性"假设是:权重绝对值越小越不重要。但这个假设不总是成立——有些小权重在特定输入下可能很关键(比如处理罕见但重要的模式)。幅度剪枝的"一刀切"可能误删关键权重。更精细的方法(如基于损失敏感度的剪枝)更准确但计算成本高——剪枝本身的成本也是工程考量。

🔗 顺着他想:剪枝是"砍权重",蒸馏是"换模型"——大模型当老师,小模型当学生。


三、知识蒸馏:大模型当老师,小模型当学生

请添加图片描述

7B 模型效果好但太贵——能不能训练一个 1.5B 的小模型,效果接近 7B?知识蒸馏的思路:让 7B 模型(Teacher)当老师,1.5B 模型(Student)当学生——Student 不学"标准答案"(硬标签),学 Teacher 的"思维方式"(软标签)。

知识蒸馏解决的核心问题:小模型直接训练效果不够,但大模型太贵——蒸馏让小模型"站在大模型的肩膀上",用更少参数达到更好效果。

它到底在干嘛(机制层):知识蒸馏的核心是软标签硬标签:标准答案——“这个句子是积极的”(one-hot 编码,正确类别=1,其余=0)。软标签:Teacher 模型的概率分布——“积极 0.7,中性 0.2,消极 0.1”。软标签比硬标签信息更丰富:它不仅告诉你"正确答案是什么",还告诉你"其他选项有多接近"——这些"暗知识"(Dark Knowledge)就是蒸馏的关键。蒸馏损失 = α × Student 与硬标签的交叉熵 + (1-α) × Student 与 Teacher 软标签的 KL 散度。α 通常取 0.1-0.3——主要学软标签,少量学硬标签。温度参数 T:Softmax 之前除以 T,让概率分布更"平滑"——T 越大,分布越均匀,暗知识越明显。通常 T=2-5。蒸馏的三种模式:① 离线蒸馏:Teacher 已训练好,直接用——最简单,最常用。② 在线蒸馏:Teacher 和 Student 同时训练——Teacher 也在进步,但实现复杂。③ 自蒸馏:模型自己教自己——深层教浅层,或同一模型的不同快照互教。

你能感受到什么(体感层)直接训练 1.5B:在情感分类上准确率 85%。1.5B + 硬标签:同样的数据,准确率 85%——模型大小决定了上限。1.5B + 蒸馏(7B Teacher):准确率 89%——比直接训练高 4%,接近 7B 的 91%。7B Teacher 直接推理:准确率 91%,但推理成本是 1.5B 的 5 倍。蒸馏的性价比:1.5B Student + 蒸馏,用 20% 的推理成本达到 98% 的 Teacher 效果。

🎛️ 动手感受:硬标签 vs 软标签 vs 蒸馏的效果对比

操作:同一个 1.5B Student,分别用硬标签训练 / 软标签蒸馏(T=1)/ 软标签蒸馏(T=3),对比效果。
你会看到

  • 硬标签:准确率 85%——标准训练基线。
  • 蒸馏 T=1:准确率 87%——软标签比硬标签信息更丰富,即使温度=1 也有提升。
  • 蒸馏 T=3:准确率 89%——温度越高,暗知识越明显,Student 学得越好。
  • T=10:准确率 88%——温度太高,分布太平滑,反而丢失了关键信息。
  • 变化说明了什么:T=3-5 是蒸馏温度的甜点——太低暗知识不够,太高信息被稀释。

🤔 想一想

蒸馏有个隐含假设:Teacher 和 Student 的"能力差距"不能太大——1.5B 学 7B 可以,但 0.1B 学 7B 就很难了。差距太大,Student 根本学不动 Teacher 的软标签——就像让小学生学大学教材,信息密度太高反而学不到东西。蒸馏适合"差距适中"的场景:Student 容量是 Teacher 的 1/4 到 1/2 时效果最好。

🔗 顺着他想:压缩、剪枝、蒸馏都是"让模型变小"——但如果模型本身就很大,训练它就需要分布式训练。


四、分布式训练:一张卡训不了就多卡

在这里插入图片描述

7B 模型 FP16 训练要 14GB 显存——但训练需要存梯度+优化器状态,实际要 56GB+(Adam 优化器状态是模型参数的 2 倍)。一张 A100 80GB 刚好训 7B,70B 就需要 560GB+——至少 8 张 A100。分布式训练就是让多张卡协同工作,训练更大的模型。

分布式训练解决的核心问题:单卡显存不够训练大模型。模型参数+梯度+优化器状态的总显存远超单卡容量——分布式训练把计算和存储分摊到多张卡上。

它到底在干嘛(机制层):分布式训练三种模式。① 数据并行(Data Parallelism):每张卡一份完整的模型副本,数据分成 N 份——每张卡处理不同的数据,算出梯度后同步(AllReduce),更新参数。优点:实现简单(PyTorch DDP 一行代码)。缺点:每张卡要装下完整模型——模型太大单卡装不下就不行。② 模型并行(Tensor Parallelism):模型按权重切分到不同卡上——一个矩阵乘法切成两半,两张卡各算一半,结果拼接。优点:模型可以很大,不受单卡限制。缺点:每层都需要卡间通信(AllReduce),通信开销大——需要高带宽互联(NVLink)。③ 流水线并行(Pipeline Parallelism):模型按层切分——卡 1 负责 1-8 层,卡 2 负责 9-16 层,…。优点:通信量小(只在层边界传递激活值)。缺点:流水线气泡(Pipeline Bubble)——前一张卡算完才能传给下一张,存在等待时间。实际方案:三者组合——70B 模型通常用 8 卡流水线并行×8 卡张量并行=64 卡,再加数据并行扩展到数百卡。Megatron-LM 和 DeepSpeed 是最常用的分布式训练框架。

你能感受到什么(体感层)数据并行 8 卡:8×A100,每卡装完整 7B 模型,训练速度约 7.5×(通信开销约 6%)。张量并行 2 卡:2×A100,每卡装半个 7B 模型权重,但每层都要 AllReduce——需要 NVLink 才高效。流水线并行 4 卡:4×A100,每卡负责 8 层——但流水线气泡约 10-20% 空闲。组合 64 卡:8×流水线×8×张量=64 卡训 70B 模型——通信开销约 15-25%,实际加速约 50×。

🎛️ 动手感受:不同并行策略的加速效果

操作:同一个 7B 模型,分别用数据并行 1/2/4/8 卡,对比训练速度和通信开销。
你会看到

  • 1 卡:基准速度,无通信开销。
  • 2 卡数据并行:1.9× 加速,通信开销约 5%。
  • 4 卡数据并行:3.7× 加速,通信开销约 7%。
  • 8 卡数据并行:7.2× 加速,通信开销约 10%。
  • 变化说明了什么:数据并行的通信开销随卡数增长——超过 64 卡后,通信可能成为瓶颈,需要换张量并行/流水线并行。

🤔 想一想

分布式训练的"扩展效率"(Scaling Efficiency)= 实际加速 / 理想加速。8 卡数据并行理想加速 8×,实际 7.2×,扩展效率 90%——很好。但 256 卡可能只有 150×,扩展效率 59%——通信开销吃掉了 41% 的算力。分布式训练的终极挑战是"通信与计算的平衡"——计算越快,越容易被通信拖后腿。

🔗 顺着他想:4 个概念串起来,就是大模型"瘦身+训练"的完整链路。


五、一张图串起压缩链路

4 个概念串成一条从"压缩"到"训练"的完整链路:

大模型压缩与训练链路
   │
   ① 模型压缩          ← 三大瘦身手段总览:量化/剪枝/蒸馏
   │
   ② 剪枝              ← 砍不重要权重,结构化剪枝对硬件友好
   │
   ③ 知识蒸馏          ← 大模型教小模型,软标签比硬标签信息更丰富
   │
   ④ 分布式训练        ← 多卡并行,让大模型训练成为可能

压缩口诀

  • 量化先做——INT8 性价比最高,一行代码搞定。
  • 剪枝做结构化——对硬件友好,直接加速。
  • 蒸馏做任务专用——小模型+蒸馏=特定任务的轻量方案。
  • 分布式是训练不是压缩——但让大模型训练成为可能。

六、代码:剪枝 + 蒸馏简化实现

import torch
import torch.nn as nn
import torch.nn.functional as F

# ① 结构化剪枝:按L1范数剪掉整个神经元
def structured_prune_linear(layer: nn.Linear, prune_ratio: float = 0.5):
    """按L1范数剪掉prune_ratio比例的输出神经元"""
    importance = layer.weight.abs().sum(dim=1)  # 每个输出神经元的L1范数
    n_prune = int(len(importance) * prune_ratio)
    keep_indices = importance.argsort()[n_prune:]  # 保留重要的
    keep_indices, _ = keep_indices.sort()

    new_out = len(keep_indices)
    new_layer = nn.Linear(layer.in_features, new_out, bias=(layer.bias is not None))
    new_layer.weight.data = layer.weight.data[keep_indices]
    if layer.bias is not None:
        new_layer.bias.data = layer.bias.data[keep_indices]
    return new_layer, keep_indices

# 演示
layer = nn.Linear(512, 256)
pruned, indices = structured_prune_linear(layer, prune_ratio=0.5)
print(f"原始: {layer.in_features}{layer.out_features}")
print(f"剪枝后: {pruned.in_features}{pruned.out_features} (保留50%神经元)")

# ② 知识蒸馏损失
def distillation_loss(student_logits, teacher_logits, labels,
                       temperature: float = 3.0, alpha: float = 0.3):
    """蒸馏损失 = α×硬标签CE + (1-α)×软标签KL"""
    hard_loss = F.cross_entropy(student_logits, labels)
    soft_student = F.log_softmax(student_logits / temperature, dim=-1)
    soft_teacher = F.softmax(teacher_logits / temperature, dim=-1)
    soft_loss = F.kl_div(soft_student, soft_teacher, reduction='batchmean') * (temperature ** 2)
    return alpha * hard_loss + (1 - alpha) * soft_loss

# 演示
student_out = torch.randn(4, 100)  # batch=4, vocab=100
teacher_out = torch.randn(4, 100)
labels = torch.randint(0, 100, (4,))
loss = distillation_loss(student_out, teacher_out, labels, temperature=3.0, alpha=0.3)
print(f"蒸馏损失: {loss.item():.4f}")
print(f"温度T=3.0,软标签权重70%,硬标签权重30%")

这段代码实现了结构化剪枝和知识蒸馏的核心逻辑。生产环境推荐:剪枝用 TorchPruner/NNI,蒸馏用 TextBrewer/Pytorch Distiller,分布式训练用 DeepSpeed/Megatron-LM。


写到最后

4 个概念,从压缩的三种手段总览到剪枝的"砍权重"、蒸馏的"大教小"、分布式训练的"多卡并行"——串起来就是大模型"瘦身+训练"的完整链路。压缩不是"偷工减料",是"精兵简政"——用更少的资源做更多的事。

下一篇讲大模型"体检"——评测体系,怎么知道模型好不好。

如果你读下来觉得真有用

  • 👍 点个赞,让我知道压缩蒸馏这种"瘦身术"写法值得继续;
  • 收藏起来,剪枝/蒸馏/分布式这些概念在模型优化实战中回来翻的概率很高;
  • 💬 关注一下,下一篇"模型评测篇"会讲评测体系/Benchmark/Judge,关注了就不会错过。

在这里插入图片描述

有问题评论区直接说,我会逐条回。

更多推荐