| 数据类型 | 特点 | 用途 |
|---|---|---|
| FP32 | 稳定、精度高 | 参数更新、梯度累加 |
| FP16 | 快、省显存 | 前向传播、反向传播 |
核心思路:
FP16 存在数值范围小的问题,梯度可能变为 0。
做法:
scaled_loss = loss * scale
scaled_loss.backward()
grad = grad / scaletorch.cuda.amp(最常用)from torch.cuda.amp import autocast, GradScalerscaler = GradScaler()for data, target in dataloader:
optimizer.zero_grad()
with autocast(): # 自动混合精度
output = model(data)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()✅ Automatic Mixed Precision(AMP)
model.half()
data = data.half()mixed_float16from tensorflow.keras.mixed_precision import set_global_policy
set_global_policy('mixed_float16')或在模型中:
tf.keras.mixed_precision.set_global_policy('mixed_float16')Keras 会自动:
{
"fp16": {
"enabled": true
}
}或:
from deepspeed import DeepSpeedConfig用于:
| 项目 | FP32 | 混合精度 |
|---|---|---|
| 显存占用 | 100% | ≈ 50% |
| 训练速度 | 1× | 1.5–2× |
| 精度损失 | 无 | 基本无 |
混合精度训练 = 用 FP16 跑计算,用 FP32 更新参数,靠自动 loss scaling 保证数值稳定。
如果你愿意,我可以: