ai-infra-interview-305

第 14 题:解释torch.cuda.amp的自动混合精度训练,什么情况下GradScaler会跳过参数更新?

题目

解释torch.cuda.amp的自动混合精度训练,什么情况下GradScaler会跳过参数更新?


完整讲解

一、混合精度(AMP)在做什么?

FP16 算前向和部分反向,可以省显存、提速(Tensor Core 等),但 FP16 范围小,容易出现梯度下溢(太小变成 0)。所以做法是:前向和梯度用 FP16 算,但梯度在更新前先乘一个 scale(放大),用 FP16 或 FP32 做累加/更新,再把 scale 除回去(unscale),这样小梯度不会被舍成 0;若发现梯度出现 inf/nan,就跳过本次更新并调整 scale,避免后续全崩。torch.cuda.amp 里的 GradScaler 就是管这个 scale 和「是否跳过 step」的。


二、GradScaler 的工作流程

  1. scale:在 backward 前对 loss 乘 scaler.get_scale(),这样链式法则后梯度整体被放大,减少 FP16 下溢。
  2. unscale:在 optimizer.step() 前,scaler 会先把各参数梯度除回 scale(unscale),并检查是否有 inf/nan
  3. step 或 skip:若 unscale 后梯度里没有 inf/nan,则调用 optimizer.step(),并可选地增大 scale(如每次乘 2,直到上限);若有 inf/nan,则不调用 step(跳过本次参数更新),并把 scale 减小(如减半),下次用更小的 scale 再试。

所以「跳过参数更新」= 当次 backward 产生的梯度在 unscale 后仍含有 inf 或 nan,scaler 为了数值安全不执行 optimizer.step()


三、什么情况下会跳过?

所以跳过 = 本次梯度不可信(inf/nan),为安全不更新参数,并调小 scale 以便后续稳定。


四、使用注意


面试要点


记忆要点

  1. GradScaler:scale 梯度 → backward → unscale → 检查 inf/nan;有则 skip step 并减小 scale。
  2. 跳过 = 梯度 inf 或 nan,不执行 step;目的防崩溃。
  3. 频繁 skip 要查学习率、loss、数据是否正常。
返回模块 返回总览