| 精度 | 适用场景 | 稳定性 |
|---|---|---|
| FP16(float16) | GPU(V100 / T4 / A100) | 中等,需要 loss scaling |
| BF16(bfloat16) | TPU / A100 / H100 | 更稳定,动态范围接近 FP32 |
| FP32 | 不稳定层、BatchNorm、EMA | 标准 |
✅ 推荐默认组合:
目的:防止 FP16 下梯度下溢(变成 0)
| 参数 | 含义 |
|---|---|
init_scale | 初始缩放因子 |
growth_factor | 稳定时放大 |
backoff_factor | 溢出时缩小 |
growth_interval | 多少次连续无溢出才增长 |
GradScaler(
init_scale=2**16,
growth_factor=2.0,
backoff_factor=0.5,
growth_interval=2000
)✅ 经验选择:
init_scale✅ 建议保持 FP32:
BatchNorm / LayerNormSoftmax + CrossEntropy(部分情况下)✅ 可放心 FP16:
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for x, y in dataloader:
optimizer.zero_grad()
with autocast():
y_hat = model(x)
loss = criterion(y_hat, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()GradScaler(
init_scale=2**10, # 如有 NaN
growth_interval=500
)with torch.autocast(device_type='cuda', dtype=torch.bfloat16):
y_hat = model(x)
loss = criterion(y_hat, y)
loss.backward()
optimizer.step()from tensorflow.keras.mixed_precision import set_global_policy
set_global_policy('mixed_float16')可选:
set_global_policy('mixed_bfloat16')TrainingArguments(
fp16=True, # 或 bf16=True
fp16_opt_level="O1", # 默认即可
)| 现象 | 原因 | 解决方案 |
|---|---|---|
| Loss 突然 NaN | 梯度下溢 | 降低 init_scale |
| 收敛慢 | scale 过小 | 增大 init_scale |
| 精度明显下降 | BN / softmax 精度不足 | 强制 FP32 |
| 完全不收敛 | 模型不适合 FP16 | 改用 BF16 |
✅ 无脑首选
✅ 不调参数原则
✅ 优先 FP32 的部分
如果你愿意,可以告诉我:
我可以直接给你一套最优参数配置。