一、模型压缩(Model Compression)
是什么
在尽量不损失模型精度的前提下,减小模型的体积 / 内存占用 / 推理延迟,使其能在手机、边缘设备或低算力服务器上运行。核心矛盾是 精度 vs 体积。
主要子技术
| 子技术 | 原理 | 典型做法 |
|---|---|---|
| 剪枝(Pruning) | 删掉"不重要"的权重或整个神经元/通道 | 权重绝对值小 → 置零;结构化剪枝删整个 filter/channel |
| 量化(Quantization) | 用低位宽整数代替 FP32 权重 | FP32 → INT8(PTQ 训练后量化);QAT 量化感知训练 |
| 低秩分解 | 把大矩阵拆成两个小矩阵相乘 | SVD 分解全连接层 |
| 权重共享 | 多个权重共用一个值 | HashedNet、Product Quantization |
| 紧凑网络设计 | 直接设计小网络 | MobileNet(深度可分离卷积)、ShuffleNet |
需要掌握的知识
- 线性代数(矩阵分解、SVD)
- 深度学习基础(CNN / Transformer 结构、反向传播)
- 某一框架的量化/剪枝工具链:PyTorch 的
torch.quantization、TensorRT、ONNX Runtime - 硬件基础:了解 GPU / NPU / CPU 对 INT8 / FP16 的支持差异
- 评估指标:精度损失、FLOPs、延迟、模型大小
二、模型蒸馏(Knowledge Distillation)
是什么
模型蒸馏是模型压缩的一种重要方法,由 Hinton 2015 年提出。核心思想:用一个大而强的教师模型(Teacher)指导一个小而快的Student 模型(Student),让 Student 学习 Teacher 的"暗知识(soft labels)",而非只学硬标签。
工作原理
scss
Teacher (大模型) ──→ soft logits (温度 T 软化)
│
Student (小模型) ──→ soft logits ──→ KL 散度损失
│
└──→ hard labels ──→ 交叉熵损失
总 Loss = α * KL(student_soft || teacher_soft) + (1-α) * CE(student, hard_label)
温度参数 T 软化概率分布,使 Student 能学到类间相似度等"暗知识"。
变体
| 变体 | 说明 |
|---|---|
| 特征蒸馏 | Student 对齐 Teacher 的中间层特征(FitNets) |
| 注意力蒸馏 | 对齐 Teacher 的 attention map |
| Logit 蒸馏 | 经典 Hinton 方法 |
| 多教师蒸馏 | 多个 Teacher 共同指导 |
| 自蒸馏 | Teacher 和 Student 是同一网络的不同深度 |
需要掌握的知识
- 信息论基础:KL 散度、交叉熵、softmax 温度
- 深度学习训练流程:前向/反向传播、损失函数设计
- 框架实操:PyTorch / TensorFlow 实现自定义 loss
- 了解不同蒸馏策略的适用场景(CV / NLP / 多模态)
- 大模型时代:用 GPT-4 蒸馏小模型(如 Alpaca、Vicuna 的思路)
三、分布式模型训练(Distributed Training)
是什么
单机单卡放不下或训练太慢时,用多机多卡协同训练一个大模型。核心挑战是通信开销 和同步一致性。
两大范式
1. 数据并行(Data Parallelism)
- 每张卡持有完整模型副本,各卡处理不同 batch
- 前向各自算,反向梯度 AllReduce 求平均后同步更新
- 代表:PyTorch DDP、Horovod
- 问题:模型太大单卡放不下 → 需要模型并行
2. 模型并行(Model Parallelism)
| 方式 | 说明 |
|---|---|
| 张量并行(Tensor Parallelism) | 把单个矩阵乘法切到多卡(Megatron-LM 的列并行/行并行) |
| 流水线并行(Pipeline Parallelism) | 按层切分到不同卡,用 micro-batch 填充流水线(GPipe、PipeDream) |
| 序列并行 | 按序列长度切分(长上下文场景) |
3. 混合并行(3D Parallelism)
大模型训练通常组合:数据并行 + 张量并行 + 流水线并行(如 Megatron-DeepSpeed)。
关键技术点
- 通信原语:AllReduce、AllGather、ReduceScatter、Broadcast(NCCL / Gloo)
- 梯度同步策略:同步 SGD(等所有卡)vs 异步 SGD(不等待,有 staleness)
- ZeRO 优化 (DeepSpeed):将优化器状态 / 梯度 / 参数分片到多卡,逐级省显存
- ZeRO-1:分片优化器状态
- ZeRO-2:+ 分片梯度
- ZeRO-3:+ 分片模型参数(相当于模型并行)
- 混合精度训练:FP16/BF16 前向 + FP32 主权重
- 梯度累积:小 batch 多次累积再更新,等效大 batch
需要掌握的知识
- 计算机网络基础:带宽、延迟、拓扑结构
- MPI / NCCL 通信原语
- PyTorch Distributed(
torch.distributed、DDP、torchrun) - DeepSpeed / Megatron-LM / FSDP 框架使用
- GPU 架构基础:显存层次、SM、NVLink
- 性能分析:计算/通信比、scaling efficiency
四、大模型微调(Fine-Tuning)
是什么
在预训练大模型(如 LLaMA、GPT、GLM)基础上,用特定领域数据继续训练,使其适配下游任务。预训练赋予通用能力,微调注入领域知识或对齐人类偏好。
微调方式谱系
css
全量微调(Full FT) ──→ 更新所有参数,效果最好但成本高
│
PEFT(参数高效微调)
├── LoRA ──→ 冻结原权重,旁路低秩矩阵 A·B
├── QLoRA ──→ LoRA + 4bit 量化基座
├── Adapter ──→ 在层间插入小 MLP
├── Prefix-Tuning ──→ 学习虚拟前缀向量
└── P-Tuning v2 ──→ 每层加可训练 prefix
│
对齐微调
├── SFT(监督微调) ──→ 指令-回答对训练
├── RLHF(人类反馈强化学习)──→ RM + PPO
└── DPO(直接偏好优化) ──→ 无需 RM,直接用偏好对训练
LoRA 详解(当前最主流)
css
原始: h = W·x (W ∈ R^{d×k}, 参数量 d×k)
LoRA: h = W·x + B·A·x (A ∈ R^{r×k}, B ∈ R^{d×r}, r << d)
训练时只更新 A、B,推理时可将 B·A 合并回 W,无额外延迟
需要掌握的知识
- Transformer 架构深入理解(Self-Attention、KV Cache、RMSNorm)
- 预训练 vs 微调 vs 对齐的定位差异
- 损失函数:SFT 的 causal LM loss、DPO 的 Bradley-Terry loss
- 框架工具:HuggingFace Transformers + PEFT + TRL + Datasets
- 显存管理:梯度检查点(gradient checkpointing)、混合精度、CPU offload
- 数据工程:指令数据构造、数据清洗、过拟合防范
- 评估方法:perplexity、BLEU/ROUGE、人工评估、LLM-as-Judge
四者关系总览
scss
┌──────────────┐
│ 预训练大模型 │
└──────┬───────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
分布式训练 大模型微调 模型蒸馏
(训练阶段加速) (适配下游任务) (大→小迁移知识)
│ │ │
│ ▼ ▼
│ 全量/LoRA/QLoRA Student 小模型
│ │
└────────────────────────┤
▼
模型压缩
(剪枝/量化/低秩)
│
▼
部署推理
| 技术 | 解决什么问题 | 阶段 |
|---|---|---|
| 分布式训练 | 模型太大,单卡训不动 | 训练 |
| 大模型微调 | 通用模型不适配特定任务 | 训练后 |
| 模型蒸馏 | 大模型推理太慢/太大 | 训练→压缩 |
| 模型压缩 | 部署体积/延迟过大 | 压缩→部署 |