梯度累积(gradient accumulation)在DDP中的正确实现方式?
想用 大 effective batch size,但单次 forward/backward 显存放不下那么大 batch,就分多步算:每步小 batch forward+backward,不立刻 step,梯度累加在 .grad 里;累加够 K 步后再 optimizer.step() 并 zero_grad()。Effective batch = 单步 batch × K。
loss = model(x) / K(或 loss 不除 K、step 前对梯度除 K),loss.backward()。DDP 会对当前步的梯度做 all-reduce,所以每步 backward 后每卡的梯度已经是「当前步的全局梯度」。optimizer.zero_grad();只在第 1 步前 zero_grad,然后 K 步内只 backward,梯度会自动累加(PyTorch 默认 grad += 新梯度)。optimizer.step(),然后 optimizer.zero_grad() 为下一轮累积做准备。with model.no_sync(): loss.backward(),不 all-reduce,梯度只在本卡累加。loss.backward(),DDP all-reduce;若未对 loss 除 K,则 step 前 scaler.unscale_() 后对梯度除 K(或等价方式)。optimizer.step()、zero_grad()(若用 AMP 还有 scaler.update())。| 返回模块 | 返回总览 |