본문 바로가기
  • Hello_
Deep Learning/Pytorch

[Pytorch] Dataloader의 num_workers와 memory의 연관성

by LDwDL 2023. 2. 22.
728x90
반응형

본 포스팅에서는 Dataloader의 인자 중 하나인 num_workers와 swap memory의 연관성에 대해 얘기하고자 합니다.

 

num_workers - swap memory 연관성

요즘 3D 영상 학습을 대용량으로 진행하다 보니 swap memory가 다 차서 오류가 발생하거나 알고리즘 속도가 저하되는 경우가 굉장히 많아서 스트레스를 받고 있는 상황인데요. 
 
물론 이를 방지하기 위해 gc.collect를 활용하지만, for 문 안에 모두 넣고 도배를 해봐도 swap memory 문제가 계속적으로 발생하더군요.. 오류는다음과 같이 발생했습니다.

error

 
"RuntimeError: Pin memory thread exited unexpectedly"로 런타임 오류가 발생했습니다. 그리고 혹시나 했는데swap memory가 가득 찼더군요. 

[Linux] swap 메모리 확인 및 초기화하기

본 포스팅은 업무 중 갑자기 잘 작동되었던 알고리즘이 갑자기 확 느려졌을 때 해결했던 방법을 공유하고자 한다. swap memory 스왑 메모리는 실제 물리적 메모리가 아닌 시스템 응답 불가 상태를

baembaembaem.tistory.com

 
swap memory 초기화는 위 링크를 통해 진행하실 수 있습니다.
 
그래서 의심이 되는 Dataloader의 num_workers와 swap memory 간의 연관성이 있나 알아봤는데요.
 
chatGPT에서는 아래와 같이 연관성이 있으며,최소한 cpu core 수보단 적은 수를 사용하라고 하더군요.
 
그래서 현재 cpu core 수를 확인해봤습니다.
 
cpu core 수는"grep -c processor /proc/cpuinfo"라는 명령어를 사용하여 조회할 수 있습니다.

cpu core

 
48개로 많은 코어수를 갖고 있는데, 저만큼의 num_workers는 당연히 사용하지 않거든요..
 

최적의 num_workers?

그래서 최적의 num_workers 수를 찾아보던 중 아래와 같은 링크를 발견했습니다.

Guidelines for assigning num_workers to DataLoader

Having more workers will increase the memory usage and that’s the most serious overhead. I’d just experiment and launch approximately as many as are needed to saturate the training. It depends on the batch size, but I wouldn’t set it to the same numb

discuss.pytorch.org

 
링크 내에 사람들이 말하는 것을 살펴보면, 사용하는GPU 수의 4배로 num_workers를 사용하라는 군요.
 
예를 들면, Dataparallel를 활용하여 4개의 GPU를 사용한다면 Dataloader의 num_workers는 16으로 입력해줘야 한다는 내용이였습니다.
 
하지만! 역시나 "RuntimeError: Pin memory thread exited unexpectedly" 발생..
 

결론

결론은 최적의 num_workers는 hyper-parameter처럼 데이터의 형태, GPU 수, GPU과 CPU 버전, 모델 형태 등 여러모로 고려해야할게 많아서 직접 바꿔가면최적의 값을 찾아봐야 하는것 같습니다.
 
무조건 num_workers를 늘린다고 빨라지는 것도 아니였으며, 줄인다고 느려지는 것도 아니였습니다.
 
저는 8개의 GPU를 사용하고 48개 코어의 CPU를 운용하지만 이젠 swap memory 때문에 지긋지긋 해져서 안정적으로 num_workers는 4를 사용하고 있습니다.
 

728x90
반응형

댓글