混合精度训练(Mixed Precision Training)是一种在深度学习训练过程中,同时使用多种数值精度(通常是 FP16 半精度 + FP32 单精度)来加速训练、减少显存占用,同时尽量保持模型收敛效果和精度的技术。
在神经网络训练中:
混合精度训练 =
用低精度(FP16 / BF16)做大部分计算
用高精度(FP32)保存关键参数和梯度,防止精度丢失
FP32 weights ──copy──> FP16 weights
↑ ↓
optimizer forward/backwardFP16 梯度太小会下溢为 0:
loss = loss * scale
loss.backward()
grad = grad / scalefrom torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for x, y in data:
optimizer.zero_grad()
with autocast():
out = model(x)
loss = criterion(out, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()tf.keras.mixed_precision.set_global_policy('mixed_float16')| 类型 | 动态范围 | 是否需 Loss Scaling | 稳定性 |
|---|---|---|---|
| FP16 | 小 | 需要 | 一般 |
| BF16 | 大 | 不需要 | 更好 |
现代训练(LLM)更推荐 BF16
混合精度训练实现 = 低精度计算 + 高精度存储 + 损失缩放 / 权重备份,用框架 AMP 自动完成。
如果你愿意,我也可以: