直接用autocast()+gradscaler即可启用fp16混合精度训练,但需确保模型已.cuda()并避免仅对输入调.half();必须用scaler.scale(loss).backward()防梯度下溢,验证时检查out.dtype和loss.requires_grad。

PyTorch里torch.cuda.amp怎么开FP16训练?
直接用torch.cuda.amp.autocast + GradScaler就能启用FP16前向/反向,但不是所有算子都支持——比如nn.Embedding和某些自定义CUDA kernel在FP16下会静默降级或报RuntimeError: expected scalar type Half but found Float。
实操要点:
- 必须把模型
.cuda()后再调用.half(),不能只对输入tensor做.half(),否则Linear权重仍是FP32,autocast不生效 -
GradScaler.scale(loss).backward()是必须步骤,漏掉会导致梯度全为0(因为FP16梯度容易下溢) - 验证时记得退出autocast上下文:
with torch.no_grad(), torch.cuda.amp.autocast(enabled=False),否则torch.argmax等操作可能因输入为Half而失败
BF16训练为什么比FP16更省心?
BF16动态范围大、无下溢问题,autocast(dtype=torch.bfloat16)能直接兼容大部分FP32算子(包括nn.Embedding和torch.einsum),不用手动.bfloat16()模型。
但限制很实在:
- 仅Ampere及更新GPU(如A100、H100、RTX 4090)原生支持,V100跑BF16会fallback到FP32,且不报错
- 检查是否真启用了:
print(next(model.parameters()).dtype)——如果是torch.bfloat16才对;如果还是torch.float32,说明autocast没生效或硬件不支持 - 混合精度时,optimizer仍需用FP32参数(
torch.optim.AdamW(model.parameters(), ...)自动处理),别自己传model.bfloat16().parameters()
FP16和BF16混用会出什么问题?
不能混。PyTorch不支持单个模型内部分层FP16、部分BF16——autocast是全局context,设成torch.float16后所有算子都按FP16规则走,设成bfloat16同理。强行混用会触发RuntimeError: expected dtype BFloat16 but got Float或静默数值错误。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
真实场景中的取舍:
- 想最大化吞吐且有A100+:优先BF16,省去scaler、loss scaling、梯度裁剪等FP16配套逻辑
- 只有V100/T4:只能用FP16,且务必加
scaler.step(optimizer)前检查scaler.get_scale()是否异常跳变(说明梯度爆炸或数据异常) - 模型含大量
torch.where或torch.scatter:BF16更稳,FP16易因条件判断的微小误差导致NaN扩散
验证混合精度是否生效的三行代码
别信日志,直接看tensor dtype和计算行为:
with torch.cuda.amp.autocast():
out = model(input_ids)
print("autocast输出dtype:", out.dtype) # FP16→torch.float16, BF16→torch.bfloat16
print("模型首层权重dtype:", next(model.parameters()).dtype) # 应仍是torch.float32(autocast不改权值)
loss = criterion(out, labels)
print("loss计算中是否进入autocast?", loss.requires_grad) # True才说明autocast链路完整
如果out.dtype始终是torch.float32,大概率是忘了.cuda(),或者GPU不支持(如CPU上autocast自动退化)。
BF16在非Ampere卡上不会报错,但也不起效;FP16在CPU上直接抛RuntimeError: half precision is not supported on CPU——这种差异本身就会误导排查方向。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










