왜 메모리 사용량이 직관과 다를까

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 없이 보면 자주 오해하게 된다.