PyTorch 내부 구조 07 - Tensor Lifetime, Caching Allocator, 메모리 재사용
PyTorch의 CUDA 메모리는 단순 malloc/free가 아니라 caching allocator 위에서 재사용된다
왜 메모리 사용량이 직관과 다를까
PyTorch에서 tensor를 지웠다고 바로 GPU 메모리가 OS 수준에서 줄어드는 것은 아니다. CUDA 쪽에서는 caching allocator가 이미 잡아둔 메모리를 재사용할 수 있기 때문이다.
caching allocator의 감각
이 구조의 목적은 분명하다.
- 빈번한 device allocation 비용 줄이기
- 메모리 재사용으로 성능 개선
하지만 부작용도 있다.
- 실제 사용량과 reserved memory가 다르게 보인다
- fragmentation이 생길 수 있다
- 특정 shape 패턴이 메모리 피크를 악화시킬 수 있다
왜 autograd와 같이 봐야 할까
tensor lifetime은 saved tensor, activation retention, gradient buffer lifetime과 얽힌다. 즉 메모리 문제는 allocator만의 문제가 아니라 그래프와 실행 흐름 문제이기도 하다.
다음 글에서는 CUDA stream과 asynchronous execution을 본다. 메모리와 실행 순서는 stream semantics 없이 보면 자주 오해하게 된다.