아이공의 AI 공부 도전기

Solution : PyTorch에서 RuntimeError: freeze_support() Error

이 문제는 특히나 Windows 운영체제 내에서 사용하고자 할 때 많이 일어나는 오류로 생각됩니다. 특히나 저의 경우 pytorch에서 torch.utils.data.DataLoaderparameter num_worker를 사용하고자 할 때 문제가 생겼습니다. 제가 조사한 바에 따르면 이에 대한 해결책은 크게 3가지지만 2가지만 구체적으로 말할 수 있고 나머지 하나에 대해서는 참조만 하면 좋을 것 같습니다. 

해결책 1. num_worker=0으로 만든다.

이 방법은 필자와 같이 DataLoader에서 Error가 생길 때에만 적용이 가능한 방법으로 임시방편인 방법입니다. 

해결책 2. 함수화를 통한 main module 만든다.

이 문제를 만나게 되면 분명 Error 메시지는 다음과 같이 뜰 것입니다.

 

RuntimeError:

An attempt has been made to start a new process before the

current process has finished its bootstrapping phase.

 

This probably means that you are not using fork to start your

child processes and you have forgotten to use the proper idiom

in the main module:

 

if __name__ == '__main__':

freeze_support()

...

 

The "freeze_support()" line can be omitted if the program

is not going to be frozen to produce an executable.

 

위 내용에 나와 있는 것처럼 main module을 만들어 주면 됩니다.

 

def run():

torch.multiprocessing.freeze_support()

(본래 있었던 코드들)

 

if __name__ == '__main__':

run()

 

 

이와 가장 밀접한 github issue로는 아래 URL을 참조하시면 될 듯 합니다.

https://github.com/pytorch/pytorch/issues/5858


위 해결책을 말해준 UlionTse commented on 18 Mar 2018 의 내용을 참조하시면 좋을 것 같습니다.(github 질문자 = 해결자)


해결책 3. 자체 내장 함수 multiprocessing을 사용하는 방법

사실 torch가 아닌 경우 torch.multiprocessing.freeze_support()을 사용하기에는 문제가 있습니다. 이에 내장함수를 소개할 것인데 개인적으로 저는 이 방법이 잘 되지 않았습니다.

 

from multiprocessing import freeze_support

 

def run():

freeze_support()

(본래 있었던 코드들)

 

if __name__ == '__main__':

run()

 

 

 위 내용들을 참조하시어 해결에 도움이 되었으면 좋겠습니다.


그럼 Bye~

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading