Масштабируют loss, делают несколько scaler.scale(loss).backward(), затем scaler.step/update один раз; при DDP используют no_sync на micro-steps кроме последнего.
Разбор
- Деление loss на accum_steps сохраняет масштаб градиента.
- Клиппинг — на unscale градиентах.
- Пропуск step при inf grads у scaler.
- Ошибки порядка step/update дают тихую деградацию.
Итог
AMP+accumulation требуют согласованного scale и sync на последнем micro-step.