'기울기를 추적하지 않는다'고 말하는 세 가지 방법
학습할 때는 대부분 autograd 기록이 필요하지만 추론, 평가, 전처리, 평가지표 계산, 시각화에서는 필요하지 않아. 그래프를 기록하면 활성화를 보관해야 해서 메모리를 쓰고 CPU 비용도 조금 들어. 이 기록을 건너뛰는 도구는 세 가지야:
torch.no_grad(): 문맥 관리자야. 블록 안에서 실행한 연산은 그래프를 만들지 않아.model.eval()로 평가할 때 흔히 함께 사용해.torch.inference_mode(): no_grad보다 강한 방식이야. autograd와 뷰 추적을 모두 비활성화해서 조금 더 빠르며, 순수 추론에는 이쪽을 권장해.tensor.detach(): 저장 공간은 공유하지만 autograd 그래프에서 분리된 새 텐서를 반환해. 코드 블록 전체가 아니라 손실 기록이나 강화학습의 목표 신경망처럼 개별 텐서만 분리할 때 써.
경계: model.eval()과 no_grad()
둘은 관련이 있지만 역할이 달라:
model.eval()은 모듈의 동작을 바꿔. 드롭아웃은 비활성화하고 BatchNorm은 배치 통계 대신 누적 통계를 사용하지만, autograd 자체를 끄지는 않아.torch.no_grad()는 autograd를 꺼. 모듈의 동작은 바꾸지 않아.
그래서 평가할 때는 거의 항상 둘 다 필요해. 올바른 계층 동작에는 model.eval(), 속도와 메모리 절약에는 torch.no_grad() 또는 inference_mode()를 써.