用 FP16 做大部分计算,用 FP32 保存关键数值
主要包括:
torch.cuda.ampAMP = Automatic Mixed Precision
import torch
from torch.cuda.amp import autocast, GradScaler
model = model.cuda()
optimizer = torch.optim.Adam(model.parameters())
scaler = GradScaler()
for x, y in dataloader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
with autocast(): # FP16 自动混合精度
y_hat = model(x)
loss = criterion(y_hat, y)
scaler.scale(loss).backward() # loss scaling
scaler.step(optimizer)
scaler.update()✅ 优点
tf.keras.mixed_precisionfrom tensorflow.keras import mixed_precision
policy = mixed_precision.Policy('mixed_float16')
mixed_precision.set_global_policy(policy)
model = build_model()
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(x, y)✅ TF 会自动:
| 问题 | 说明 |
|---|---|
| BN 层 | 某些旧实现建议使用 FP32 |
| 数值不稳定 | 可降低 learning rate |
| Loss NaN | 检查 loss scaling |
| 某些算子不支持 FP16 | AMP 会自动回退到 FP32 |
✅ 推荐:
❌ 不推荐:
混合精度训练 = FP16 计算 + FP32 主权重 + Loss Scaling
如果你愿意,我可以: