PyTorch num_workers>0인 경우의 오류

seokj·2023년 1월 20일
1

torch.utils.data.DataLoader의 num_workers는 데이터 로딩을 멀티프로세싱으로 가속화하고 싶을 때 사용할 프로세스 수를 지정하는 파라미터이다. num_workers의 수를 지정하면 그 수만큼의 subprocess가 생성되어 멀티프로세싱으로 작동하고 num_workers를 지정하지 않거나 0으로 하면 main process에서 데이터 로딩을 담당한다.

num_workers를 너무 크게 잡으면 각 프로세스를 실행하는데 CPU메모리가 할당되기 때문에 공간이 부족해져 오류가 날 수 있다. DataLoader worker (pid(s) -----) exited unexpectedly 라는 오류로, PyTorch가 멀티프로세싱을 수행하기 위해 만든 subprocess가 강제로 종료되었다는 의미이다. RAM의 공간을 확보하면 해결된다.

메모리 공간 확보에 관한 자세한 설명은 여기를 참고하자.

작업관리자로 RAM 사용량을 확인했을 때 모든 공간을 사용하지 않는데도 process가 종료된다면 대기모드 영역의 공간을 RamMap을 통해 비워주면 된다. RamMap은 마이크로소프트 페이지에서 내려받을 수 있다. 자세한 정보는 여기를 확인하자.


멀티프로세싱을 할 때 PyTorch는 내부적으로 파이썬 multiprocessing 라이브러리를 사용한다. 이 라이브러리는 IPython이나 Jupyter에서 실행하면 제대로 작동하지 않는 고유의 버그가 있다. 내 경우는 process가 강제 종료되었다는 오류였다. 따라서 파이썬 스크립트로 작성하여 실행해야 한다.


멀티프로세싱을 할 때 main process는 여러 subprocess를 운영하게 되기 때문에 main process만이 기존의 코드를 실행하고, 새로 생성된 subprocess는 구분하게 하기 위해 if __name__ == "__main__":으로 전체 실행 코드를 감싸주어야 한다.


위 3가지 사항을 유의하면 num_workers > 0인 DataLoader를 오류없이 이용할 수 있다.

profile
안녕하세요

0개의 댓글