The annotated PyTorch training loop - PyTorch 학습 루프의 순서가 중요한 이유
idlemachines의 The annotated PyTorch training loop는 PyTorch 학습 루프를 한 줄씩 해부하는 글입니다. 겉으로는 단순한 for 문처럼 보이지만, 실제로는 모델 상태, gradient buffer, autograd graph, optimizer state, scheduler state가 맞물려 돌아갑니다. 그래서 줄 하나가 조금만 엉뚱한 곳에 있어도 에러 없이 학습이 망가질 수 있습니다. 원문: The annotated PyTorch training loop PyTorch 핵심 정리 핵심 순서: model.train() -> zero_grad() -> forward -> loss -> backward() -> clipping -> optimizer.step() -> scheduler.step() -> model.eval() + no_grad()가 기본 골격이다. 가장 위험한 점: 잘못된 위치의 코드가 항상 예외를 내지는 않는다. 학습이 안 되거나, 너무 느리거나, 메모리가 계속 늘어나는 형태로 드러난다. 역할 분리: loss.backward()는 .grad를 채우고, optimizer.step()은 weight를 바꾼다. 이 둘을 같은 일로 보면 루프를 잘못 고치기 쉽다. 검증 루프: model.eval()은 레이어 동작을 바꾸고, torch.no_grad()는 graph 생성을 막는다. 검증에는 보통 둘 다 필요하다. GPU 효율: 모델과 batch를 같은 device에 두고, mixed precision, pinned memory, prefetch, torch.compile을 상황에 맞게 적용해야 GPU가 놀지 않는다. 1) 학습 루프는 작은 상태 머신이다 PyTorch 학습 코드는 보통 이렇게 생겼습니다. ...