混合精度训练(Mixed Precision Training)是一种在深度神经网络训练过程中,同时使用单精度(FP32)和半精度(FP16 或 BF16) 的技术。之所以广泛使用它,主要出于以下几方面原因:
1. 显存占用大幅降低
- FP16 每个参数只占 2 字节,而 FP32 占 4 字节
- 模型参数、激活值、梯度都可以用半精度存储
- 通常可节省 30%–50% 显存,从而:
- 使用更大的 batch size
- 训练更大的模型
- 在消费级 GPU 上跑原本跑不动的模型
2. 计算速度更快
- 现代 GPU(如 NVIDIA Volta、Ampere、Hopper 架构)有专门的 Tensor Core
- Tensor Core 对 FP16 / BF16 矩阵运算有数倍加速
- 实际训练中常见 1.5x – 3x 提速
3. 通信开销更小(分布式训练)
- 多卡 / 多机训练时需要同步梯度
- 半精度梯度体积减半,减少:
- PCIe / NVLink 通信量
- 网络带宽压力
- 对大模型、大 batch 训练尤其重要
4. 能耗与成本更低
- 更少显存 + 更快计算 = 更短训练时间
- 云训练成本下降,本地设备更省电
5. 为什么不能“全用半精度”?
虽然半精度有上述好处,但直接使用纯 FP16 会出问题:
- 数值范围小,容易下溢 / 上溢
- 梯度可能太小被舍入为 0(梯度消失)
- 累加误差累积,训练不稳定
因此混合精度训练采用以下策略:
- 权重主副本用 FP32(master weights)
- 前向 / 反向用 FP16 加速
- 损失缩放(loss scaling) 防止梯度下溢
- 关键算子(如 softmax、LayerNorm)仍用 FP32
6. 典型实现方式
- NVIDIA AMP(Automatic Mixed Precision)
- PyTorch:
torch.cuda.amp - TensorFlow:
tf.keras.mixed_precision - 大模型训练(LLaMA、GPT):几乎必用
一句话总结
混合精度训练用“半精度提速省显存,单精度保稳定”,是当前深度学习训练的事实标准做法。
如果你愿意,我也可以从数值原理、loss scaling 机制或代码示例角度再展开讲。