torch.cuda.amp (Automatic Mixed Precision),通过 autocast 和 GradScaler 实现。tf.keras.mixed_precision 或 tf.train.experimental.enable_mixed_precision_graph_rewrite。jax.numpy 和 optax 结合半精度计算。scaler = torch.cuda.amp.GradScaler()
for data, target in dataloader:
optimizer.zero_grad()
with torch.cuda.amp.autocast():
output = model(data)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()with torch.cuda.amp.autocast(enabled=True):
# 自动将操作转为 FP16,但可手动覆盖
x = x.half() # 强制 FP16
y = y.float() # 强制 FP32autocast 默认对 BN 使用 FP32)。torch.nn.functional.cross_entropy 在 autocast 下自动处理)。autocast 上下文外频繁手动转换数据类型。autocast 范围内。scaler.step() 前累积多个 batch 的梯度。torch.compile()(PyTorch 2.0+)或 XLA(TPU)进一步加速。torch.cuda.profiler 或 NVIDIA Nsight Systems 分析算子耗时,确认 Tensor Cores 利用率。import torch
from torch.cuda.amp import autocast, GradScaler
model = MyModel().cuda()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)
scaler = GradScaler()
for epoch in range(epochs):
for data, target in dataloader:
data, target = data.cuda(), target.cuda()
optimizer.zero_grad()
# 自动混合精度上下文
with autocast(dtype=torch.float16): # 可指定 dtype=float16 或 bfloat16
output = model(data)
loss = criterion(output, target)
# 梯度缩放与反向传播
scaler.scale(loss).backward()
# 梯度裁剪(可选)
scaler.unscale_(optimizer)
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 优化器步进
scaler.step(optimizer)
scaler.update()| 优化方向 | 关键措施 |
|---|---|
| 数值稳定性 | 动态损失缩放、敏感层用 FP32、监控 NaN/Inf |
| 计算效率 | 启用 Tensor Cores、减少精度转换、结合编译优化 |
| 显存与吞吐 | 增大 batch size、梯度累积、使用 BF16(若支持) |
| 调试与部署 | 对比全精度精度、分析性能瓶颈、导出模型时转换回 FP32(若需要) |
通过以上策略,混合精度训练通常可提升 1.5~2 倍 训练速度,并节省约 30%~50% 显存,同时保持模型收敛性与精度。