混合精度训练(Mixed Precision Training)是一种在训练深度学习模型时,同时使用 FP16(半精度浮点数) 和 FP32(单精度浮点数) 的技术,以提升训练速度、减少显存占用,同时尽可能保持模型精度。
✅ 优点:
❌ 缺点:
混合精度训练采用以下策略:
| 阶段 | 精度 |
|---|---|
| 前向传播 | FP16 |
| 梯度计算 | FP16 |
| 参数更新 | FP32 |
| Loss scaling | 防止梯度下溢 |
将 loss 放大一个倍数(如 1024、256),使得梯度在 FP16 下不至于下溢。
torch.cuda.amp(最常用 ✅)PyTorch 1.6+ 原生支持。
from torch.cuda.amp import autocast, GradScaler
import torch
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 / FP32)
with autocast():
outputs = model(x)
loss = criterion(outputs, y)
# 反向传播 + 梯度缩放
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()with autocast():
...scaler = GradScaler()for epoch in range(epochs):
model.train()
for x, y in train_loader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
with torch.cuda.amp.autocast():
out = model(x)
loss = criterion(out, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()training_args = TrainingArguments(
output_dir="./output",
fp16=True,
)✅ 自动启用混合精度
from tensorflow.keras.mixed_precision import set_global_policy
set_global_policy('mixed_float16')⚠️ 注意:
float32float32❌ 不适合:
✅ 非常适合:
| 问题 | 原因 | 解决 |
|---|---|---|
| loss 变成 NaN | scale 太大 | 降低初始 scale |
| 精度下降 | 未用 master weights | 使用 amp |
| 没加速 | 没用 TensorCore GPU | 检查 GPU |
混合精度训练 = FP16 计算 + FP32 参数更新 + Loss Scaling
如果你愿意,我可以:
你现在是 PyTorch 还是 TensorFlow?训练什么模型?