본 포스팅에서는 Dataloader의 인자 중 하나인 num_workers와 swap memory의 연관성에 대해 얘기하고자 합니다.
num_workers - swap memory 연관성
요즘 3D 영상 학습을 대용량으로 진행하다 보니 swap memory가 다 차서 오류가 발생하거나 알고리즘 속도가 저하되는 경우가 굉장히 많아서 스트레스를 받고 있는 상황인데요.
물론 이를 방지하기 위해 gc.collect를 활용하지만, for 문 안에 모두 넣고 도배를 해봐도 swap memory 문제가 계속적으로 발생하더군요.. 오류는다음과 같이 발생했습니다.
"RuntimeError: Pin memory thread exited unexpectedly"로 런타임 오류가 발생했습니다. 그리고 혹시나 했는데swap memory가 가득 찼더군요.
swap memory 초기화는 위 링크를 통해 진행하실 수 있습니다.
그래서 의심이 되는 Dataloader의 num_workers와 swap memory 간의 연관성이 있나 알아봤는데요.
chatGPT에서는 아래와 같이 연관성이 있으며,최소한 cpu core 수보단 적은 수를 사용하라고 하더군요.
그래서 현재 cpu core 수를 확인해봤습니다.
cpu core 수는"grep -c processor /proc/cpuinfo"라는 명령어를 사용하여 조회할 수 있습니다.
48개로 많은 코어수를 갖고 있는데, 저만큼의 num_workers는 당연히 사용하지 않거든요..
최적의 num_workers?
그래서 최적의 num_workers 수를 찾아보던 중 아래와 같은 링크를 발견했습니다.
링크 내에 사람들이 말하는 것을 살펴보면, 사용하는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를 사용하고 있습니다.
'Deep Learning > Pytorch' 카테고리의 다른 글
[Pytorch] torchvision을 활용하여 dataset 다운로드하기 (0) | 2023.02.02 |
---|
댓글