混合精度训练(Mixed Precision Training)是一种在深度学习训练过程中,同时使用不同数值精度(如 FP16、FP32、BF16 等)来加速训练、减少显存占用,同时尽量保持模型精度的方法。
一、为什么要用混合精度
- FP32(单精度):稳定,但占用显存大、计算慢
- FP16(半精度):速度快、显存省,但容易溢出/舍入误差
- BF16:动态范围同 FP32,比 FP16 更稳定
混合精度 = 该用低精度就用低精度,关键地方保留高精度
二、核心思想
- 用 FP16 / BF16 做前向和反向计算(快、省显存)
- 用 FP32 保存模型权重和优化器状态(保证数值稳定)
- 通过一些技巧避免低精度问题
三、典型训练流程(以 FP16 为例)
- 权重副本(Master Weight)
- 模型有 FP16 权重(用于计算)
- 同时保留 FP32 权重(用于更新)
- 前向传播
- 输入、激活用 FP16
- 得到 loss(可能用 FP32 防溢出)
- 反向传播
- 梯度处理
- 梯度可能乘以 Loss Scaling(放大 loss,防梯度下溢)
- 参数更新
- 梯度转回 FP32
- 更新 FP32 权重
- 再转回 FP16 用于下一步
四、关键技术点
1. Loss Scaling(损失缩放)
loss *= scale
反向后 gradient /= scale
2. Master Weights
3. 数值敏感层用 FP32
- softmax、loss、BatchNorm 统计量
- 某些 softmax / exp 操作
五、常见精度组合
| 类型 | 计算 | 权重 | 特点 |
|---|
| FP16 + FP32 | FP16 | FP32 | 常见,需 loss scaling |
| BF16 + FP32 | BF16 | FP32 | 更稳定,几乎不用 scaling |
| TF32(GPU) | TF32 | FP32 | NVIDIA 自动 |
六、框架支持
- PyTorch
torch.cuda.amp(Automatic Mixed Precision)- TensorFlow
tf.keras.mixed_precision- MindSpore / PaddlePaddle
- 都有 AMP 支持
七、优点总结
✅ 训练速度提升(1.5–3×)
✅ 显存占用降低(可达一半)
✅ 大模型可训
八、缺点 / 注意
⚠ 数值不稳定(尤其 FP16)
⚠ 需要调 loss scale
⚠ 某些算子不支持低精度
如果你愿意,我也可以:
- 用 PyTorch 代码示例讲
- 对比 FP16 vs BF16
- 结合 大模型训练(LLM)讲混合精度