딥러닝을 하다 보면 "왜 VRAM이 이렇게 부족하지?"라는 경험, 한 번쯤 있으셨을 거예요.
사실 VRAM에는 단순히 모델만 올라가는 게 아니라, 학습과 추론에 필요한 여러 가지 데이터들이 함께 저장됩니다.
이 글에서는 딥러닝에서 VRAM이 어떤 데이터들을 저장하는지, 그리고 학습과 추론 상황에 따라 어떤 메모리가 필요한지를 체계적으로 정리해드립니다.
항목 | 설명 |
---|---|
① 모델 파라미터 (weights, biases) | 학습 대상이 되는 고정된 값들입니다. 일반적으로 float32 또는 float16 포맷으로 저장됩니다. |
② 중간 활성화값 (Activations) | 각 레이어의 출력값으로, 역전파(gradient 계산)를 위해 저장됩니다. |
③ 그래디언트 (Gradients) | 손실 함수 기준으로 계산된 파라미터의 미분값입니다. 학습 중에만 사용됩니다. |
④ 옵티마이저 상태 (Optimizer States) | 옵티마이저가 학습 진행을 위해 유지하는 추가 정보입니다. (예: Adam의 momentums 등) |
⑤ 임시 연산 버퍼 | 연산 중 발생하는 임시 메모리입니다. 연산 복잡도나 구조에 따라 가변적입니다. |
⑥ 입력 데이터 (Input Batch) | 실제 학습/추론에 사용되는 입력값. GPU로 옮겨서 처리할 경우 VRAM 사용 대상입니다. |
메모리 항목 | 학습 시 사용됨 | 추론 시 사용됨 | 설명 |
---|---|---|---|
모델 파라미터 | ✅ | ✅ | 항상 필요함 |
중간 활성화값 | ✅ 저장됨 | 🔸 짧게 유지됨 | 추론 시에는 레이어 간 전달 후 바로 해제됨 |
그래디언트 | ✅ | ❌ | 역전파 시에만 필요 |
옵티마이저 상태 | ✅ | ❌ | 학습 알고리즘에 따라 필요 (예: Adam 등) |
입력 데이터 | ✅ | ✅ | 보통 GPU에 올려서 처리 |
임시 연산 버퍼 | ✅ | ✅ | 일시적으로 할당됨 |
추론 시에는 활성화값이 오래 저장되지 않고, 필요한 순간만 메모리에 올라왔다가 사라집니다.
예시 코드 흐름:
x1 = layer1(input)
x2 = layer2(x1) # x1은 이제 더 이상 사용되지 않음
x3 = layer3(x2) # x2도 마찬가지
[Training]
VRAM: [input] → [layer1 out] → [layer2 out] → [layer3 out] → ... (모두 저장됨)
[Inference]
VRAM: [layer1 out] → 덮어쓰기 → [layer2 out] → 덮어쓰기 → ... (계속 덮어쓰기)
구분 | 학습 시 | 추론 시 |
---|---|---|
메모리 요구량 | 큼 | 작음 |
활성화값 저장 | 오래 유지 | 즉시 해제 |
GPU 효율성 | 낮음 | 높음 |
배치 확장성 | 낮음 | 높음 |
추론 중 VRAM을 더 아끼고 싶다면?
torch.no_grad()
사용inplace=True
연산 활용float16
(mixed precision inference)