混合精度训练(Mixed Precision Training)是一种在深度学习训练中同时使用 单精度浮点数(FP32) 和 半精度浮点数(FP16 或 BF16) 的技术,目的是:
| 类型 | 位宽 | 范围 | 精度 | 用途 |
|---|---|---|---|---|
| FP32 | 32 | 大 | 高 | 稳定计算 |
| FP16 | 16 | 小 | 低 | 快但易溢出 |
| BF16 | 16 | 大 | 中 | 更适合训练 |
用 FP16 做“快的部分”,用 FP32 做“稳的部分”
通常包括:
解决 FP16 梯度下溢:
loss *= scale
grad /= scalefrom torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
optimizer.zero_grad()
with autocast():
output = model(input)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()✅ 自动处理:
training_args = TrainingArguments(
fp16=True, # 或 bf16=True
)tf.keras.mixed_precision.set_global_policy('mixed_float16')| 场景 | 推荐 |
|---|---|
| NVIDIA V100 / T4 | FP16 |
| A100 / H100 | BF16 |
| 大模型训练 | BF16 |
| 小模型 / 推理 | FP16 |
✅ BF16 不需要 loss scaling,更稳定
GradScalerinf / nan混合精度训练 = FP16/BF16 加速 + FP32 保稳 + Loss Scaling
如果你愿意,我可以:
你现在是做 CV / NLP / 大模型?