회사 서버에서 Pyinstaller를 사용하다가 아래와 같은 오류가 발생한 적이 있다.
File "Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_multiprocessing.py",
line 46, in _freeze_support
ValueError: not enough values to unpack (expected 2, got 1)
오류만 발생하면 다행이지만 회사 서버(Window)에서 실행 프로세스가 무한정으로 늘어났다. 작업관리자에서 '작업 끝내기'를 해도 소용없었다. 어쩔 수 없이 내 계정을 로그 아웃해야 했다. ㅠㅠ
오류 해결
오류가 발생한 원인은 위 메시지 뒤에 나오는 메시지
joblib.externals.loky.process_executor.TerminatedWorkerError
로 어느 정도 추측할 수 있었다. joblib은 기본적으로 loky 백엔드를 사용한다고 한다. 하지만 worker에서 input, output 교환시 메모리 오버헤드 등의 문제가 발생할 수 있다고 한다. 위 에러는 백엔드를 loky로 사용함에 따라 worker가 무언가에 의해 강제 종료되었다는 뜻이다. 따라서 백엔드를 바꿔주면 문제는 해결될 수 있다는 것이다.
해결 방법은 간단하다. joblib의 parallel_backend를 사용하여 thread 기반으로 병렬 처리하도록 하면 된다고 한다(참고 자료). 즉, 아래 코드를 추가하면 된다.
from joblib import parallel_backend
parallel_backend("threading")
예를 들어 기존 파이썬 파일이 아래와 같다면
from multiprocessing import Pool, freeze_support
if __name__ == '__main__':
freeze_support()
''' 중략 '''
다음과 같이 추가해주면 된다.
from multiprocessing import Pool, freeze_support
from joblib import parallel_backend
parallel_backend('threading')
if __name__ == '__main__':
freeze_support()
''' 중략 '''
'프로그래밍 > 기타 Python 모듈' 카테고리의 다른 글
[XGBoost] XGBoost의 개별 트리로부터 여러 정보(변수 출현 빈도, 예측) 계산하기(feat. get_boost) (0) | 2023.03.24 |
---|---|
Pyinstaller 기본 - 이용하여 파이썬(.py) 파일을 실행 파일(.exe)로 만들기 (1) | 2023.03.17 |
[shap] SHAP Value 계산 및 시각화 결과 해석하기 with Python (2) | 2023.01.23 |
[imageio] 파이썬(Python)으로 이미지 파일을 모아서 gif 파일 만들기 (0) | 2023.01.23 |
[XGBoost] XGBoost 모형 학습하기 (feat. XGBClassifier, XGBRegressor) (0) | 2022.11.05 |
댓글