loop 를 직접 소유할 때
full manual loop 는 두 번째 칸이야. fit() 한테 운전대를 안 맡기고 epoch / batch iteration 을 네가 직접 써. loop 구조에 대한 완전한 제어를 얻는 대신 — 평가를 끼워넣든, custom schedule 로 분기하든, batch 사이에 뭐든 돌릴 수 있어 — 상속받는 건 아무것도 없어. progress bar 없음, callback 없음, checkpoint 없음, distribution 없음. 모든 편의가 네가 짜야 할 한 줄이 돼.
뼈대
모양은 늘 같아: epoch 바깥 loop, dataset 안쪽 loop, 각 step 안에서 forward → loss → gradient → optimizer update. forward 와 loss 부분은 portable 인데 gradient step 은 backend-native — 아래 예시는 TensorFlow 의 tf.GradientTape. PyTorch 면 loss.backward(), JAX 면 jax.grad 로 변환해. 그 한 블록 때문에 '진짜 backend-agnostic loop' 같은 건 없는 거야.