Programming Error/PyTorch

[PyTorch DataLoader Num_workers 관련 에러]

Barca 2021. 7. 13. 23:45

PyTorch의 DataLoader는 학습 데이터를 효율적으로 읽어오기위해 필수적으로 사용됩니다.

DataLoader 중에서 num_workers라는 인자가 있는데 이는 데이터 로딩을 하기위해 몇 개의 CPU 프로세스를 사용할 것인지를 의미합니다. GPU에 데이터를 전달해주기 위해 적절한 수의 num_workers를 지정해줄 필요가 있습니다.

여기서는 num_workers 관련 에러에 대한 이슈를 다룰 것이므로 더 자세한 설명은 해당 블로그에서 잘 설명되어 있으니 참고하시면 될 것 같습니다.

 

우선 제가 num_workers 관련해서 마주한 에러는 다음과 같이 두 가지가 있었습니다.

 

1. BrokenPipeError: [Errno 32] Broken pipe

2. RuntimeError: DataLoader worker (pid(s) 6596) exited unexpectedly

 

먼저 첫 번째 이슈는 보통 Windows10에서 작업을 할 때 마주했는데요. num_workers는 기본적으로 병렬처리이기 때문에 Jupyter notebook이나 VS Code의 interactive mode에서 코드를 한줄씩 실행할 때, num_workers>0로 설정하게 되면 1번과 같은 에러가 발생합니다. 따라서, 아래와 같이 학습 코드를 main과 같은 함수로 지정해주고 if __name__ == '__main__': 에서 호출을 해주거나 터미널에서 python main.py로 실행하면 에러가 나지않고 멀티 프로세싱을 잘 수행해주게 됩니다.

 

# main.py

def main():
    # your training code

if __name__=='__main__':
    main()

 

그리고 두 번째 이슈는 Docker의 Container안 Ubuntu 환경에서 위 코드와 같은 방식으로 터미널에서 python main.py로 코드를 수행하는데 발생하였는데요. Stackoverflow나 Pytorch forum을 살펴봐도 이유는 찾지 못했으나, num_workers=0으로 두면 에러가 나지 않음을 확인했습니다. 그냥 Local Ubuntu 또는 예전에 다른 Container Ubuntu에서는 잘 사용했으나 특정 Container에서 되지 않은 것으로 보아 Container 환경을 다시 한 번 살펴봐야 할 것 같습니다.

 

그리고 기본적으로 num_workers는 Default값이 0인데요. (0 means that the data will be loaded in the main process)

Windows10이든 Ubuntu이든 num_workers 값을 줘보고 위와 같은 에러가 발생한다면 0으로 두고 학습을 수행하면 될 것 같습니다.