torch.cuda.amp(自动混合精度)import torch
from torch.cuda.amp import autocast, GradScaler
model = MyModel().cuda()
optimizer = torch.optim.Adam(model.parameters())
scaler = GradScaler()
for x, y in dataloader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
with autocast(): # 自动混合精度
y_pred = model(x)
loss = loss_fn(y_pred, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()✅ 效果
torch.nn.parallel.DistributedDataParallelwith autocast():
output = model(input)
loss = loss_fn(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()⚠️ autocast 只需要在 forward 和 loss 计算阶段使用torch.cuda.amp,尚未完全统一为 torch.compile + AMP。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') # 输出层建议 float32
])
model.compile(optimizer='adam', loss='categorical_crossentropy')✅ 原因
from tensorflow.keras.mixed_precision import LossScaleOptimizer
optimizer = LossScaleOptimizer(tf.keras.optimizers.Adam())✅ 适合使用的情况
❌ 不适合的情况
GradScaler| 框架 | 开启方式 |
|---|---|
| PyTorch | torch.cuda.amp.autocast + GradScaler |
| TensorFlow | mixed_float16 全局策略 |
| 显存 | 可减少 30%~50% |
| 速度 | 提升 20%~80%(GPU 依赖) |
如果你愿意,可以告诉我:
我可以给你一份完全可直接复制的训练模板。