개발 공부 - Tools and Language/파이썬

[파이썬]jupyter notebook 환경에서의 멀티프로세싱 모듈 문제에 대하여...

포리셔 2023. 6. 9. 17:22

들어가기 전에
이번 포스트는 jupyter notebook에 어느 정도 익숙해졌다고 착각한 어느 초보 개발자의 뻘짓삽질을 담고 있습니다. 개인 기록의 성격이 짙으니 감안해주시길...!

 

파이썬 기본 라이브러리를 다루다 보면 꼭 지엽적으로만 파고 들어서 나중에 가면 "아... 이게 뭐였더라??" 하는 내용도 있고, 아예 처음 다뤄보는 라이브러리 중에는 사용법이 영 직관적이지 못해 애를 먹는 경우가 있습니다. 제 경우, 후자에 해당하는 대표적인 라이브러리가 바로 multiprocessing 모듈이었죠.

여러 개의 CPU 코어를 사용해 병렬 연산을 가능하게 해주는 만큼 이 모듈은 매우 강력한 모듈임에는 분명합니다. 문제는 이 모듈이 .py 스크립트에서만 돌아가는 것처럼 보였다는 것.

문제의 스크립트. 지금은 주석 처리 해놓고 방치해놨지만, 실제로 실행하면 결과가 출력되지 않고 30분이고 1시간이고 실행 중이라는 표시가 뜹니다.

multiprocessing 모듈을 자세히 설명하는 포스트가 아니니 간단하게만 짚고 넘어가겠습니다. 위 스크립트에서is_prime_nbNumba라는 모듈을 사용해 정의한 함수로, 소수(prime number)를 찾아주는 역할을 합니다. pool이라는 객체에 병렬 연산용 코어 개수를 할당하면 주어진 함수를 여러 개의 코어로 돌릴 수 있게 해줍니다.

문제는 jupyter notebook 환경에서는 이 함수가 끝나지 않고 계속 돌아간다는 것입니다. 이렇게 특정 IDE나 개발 환경에서 어떤 코드가 돌아가지 않는다면 흔히들 코드를 먼저 수정해보기 마련입니다. 하지만 이번 경우에는 온갖 방법을 동원해 모듈이 정상적으로 돌아갈 수 있는 스크립트를 작성해도 여전히 같은 상황이 발생했습니다.

.py 스크립트로 옮겨서 다시 정의한 후의 상황. 정상적으로 실행되고 연산도 제때 종료됩니다.

이런 경우에는 아예 .py 확장자를 갖는 스크립트로 작성해버린 뒤 정상적으로 실행하는 보는 것이 하나의 방법입니다. 위 jupyter 스크립트에서 작성했던 함수 정의, 변수, pool 객체 정의까지 .py 스크립트로 옮긴 뒤에야 정상적으로 실행이 되고, 정상적으로 종료까지 되었습니다.

이렇듯 특정 코드가 돌아가지 않을 때 실행 환경을 바꾸는 것도 문제의 해결책 중 하나가 될 수 있습니다. 비단 multiprocessing 모듈에만 적용되는 문제는 아닐 것이라 조심스레 예상해봅니다.

 

https://sharegpt.com/c/KzOjUSw

 

멀티프로세싱 모듈 문제 해결 - A ShareGPT conversation

This is a conversation between a human and a GPT-3 chatbot. The human first asks: 넌 유능한 파이썬 선생님이야. 지금 나는 아나콘다를 사용 중이고, 파이썬 버전은 3.9.13이야. Visual Studio Code에서 jupyter notebook 확장

sharegpt.com

이 문제의 해결에 도움을 준 chatGPT 프롬프트를 공유해보고자 합니다. 실행 환경을 바꾸기 전까지 저질렀던 온갖 헛다리삽질과 고통의 흔적이 고스란히 담겨져 있습니다. 

AI는 신이고 chatGPT는 무적이다