fit() 은 happy path. training 이 optimizer 두 개 (GAN), gradient accumulation, dynamic loss weighting 필요한 순간 — `train_step()` override 하거나 `tf.GradientTape` / `torch.autograd` / `jax.grad` 로 manual loop 짠다. 네 backend 다 한 번씩 해본다.
fit() 의 default 가 부족해지는 시나리오 — GAN (두 optimizer), distillation (teacher 출력 함께), gradient accumulation (memory bound), curriculum learning (epoch 마다 loss 가중치 변화). 이런 거 만나면 fit() 이 못 따라와.
두 단계 escalation: (1) train_step() override — fit() 의 callback / distribution 그대로 유지. (2) full manual loop — 자유 최대지만 인프라 직접 짜야 함. 가능하면 (1) 이 균형점.