混合精度训练(Mixed Precision Training)是一种在训练深度学习模型时,同时使用 FP16(半精度浮点数) 和 FP32(单精度浮点数) 的技术,目的是在 几乎不损失精度 的前提下,加快训练速度、减少显存占用。
| 项目 | FP32 | FP16 | 混合精度 |
|---|---|---|---|
| 显存 | 大 | 小 | ✅ 减少 30–50% |
| 计算速度 | 慢 | 快 | ✅ 快 2–3 倍(GPU) |
| 数值稳定性 | 高 | 低 | ✅ 最佳平衡 |
前向传播和反向传播用 FP16,参数更新用 FP32
FP16 可表示的最小正数约为:
6e-5梯度可能小于这个值 → 直接变成 0
✅ 解决方法:
loss → loss × scale
backward()
grad → grad / scale流程:
FP32 weights
↓
copy to FP16
↓
forward / backward (FP16)
↓
update FP32 weights避免:
torch.cuda.ampimport torch
from torch.cuda.amp import autocast, GradScaler
import torch.nn as nn
import torch.optim as optim
model = Model().cuda()
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()
scaler = GradScaler()
for x, y in dataloader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
# 前向传播:自动使用 FP16
with autocast():
y_pred = model(x)
loss = criterion(y_pred, y)
# 反向传播 + 参数更新
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()| API | 作用 |
|---|---|
autocast() | 自动选择 FP16 / FP32 |
GradScaler | 动态 loss scaling |
scaler.scale(loss) | 放大 loss |
scaler.step() | 安全更新参数 |
scaler.update() | 调整 scale 值 |
✅ 与 torch.nn.parallel.DistributedDataParallel 完全兼容
with autocast():
output = model(x)
loss = criterion(output, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()from tensorflow.keras.mixed_precision import set_global_policy
set_global_policy('mixed_float16')model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, dtype='float32') # 输出层用 FP32
])
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
model.fit(x_train, y_train, epochs=10)✅ TensorFlow 自动处理:
✅ 检查:
✅ 尝试:
混合精度训练 = FP16 加速计算 + FP32 保证稳定 + Loss Scaling 防止下溢
如果你愿意,我可以: