AI Model Serving을 위한 backend 개발을 공부하고 있습니다.
개발 간 이슈가 있어서 삽질한 내용 공유합니다.
1. 이슈 상황
Python의 multiprocessing 라이브러리를 이용해서
Multiprocessing 서비스를 구축하고 있는데요
특정 클래스 내에서 Multiprocessing을 구축하려니
import한 module을 못 찾는다는 오류입니다.
ModuleNotFoundError: No module named '<다른 모듈명>'
2. 이유
찾아보니 이유는
프로세스가 자식 프로세스로 실행될 때 해당 모듈을 찾을 수 없어서 생긴다고 합니다.
Windows 환경에서 실행될 때 발생한다고 하네요.
Linux나 macOS에서는 부모 프로세스의 메모리를 자식 프로세스가 공유하는
fork() 방식이 사용되기 때문에 이 문제가 발생하지 않는다고 합니다.
2. 해결 방법
해결방법
Multiprocessing 선언 및 프로세스 생성 및 시작을 if __name__ == '__main__' 에서 명시하기
import multiprocessing
import my_module # 사용자 정의 모듈
def worker():
result = my_module.some_function() # 모듈 내 함수 사용
print(result)
if __name__ == '__main__':
multiprocessing.set_start_method('spawn', force=True)
p = multiprocessing.Process(target=worker)
p.start()
p.join()
설명
if __name__ == '__main__' 내의 코드는 모듈이 직접 실행 될 때 반드시 호출됩니다.
또한, import 될때는 실행되지 않는 독립적 실행 방식입니다.
set_start_method()가 멀티프로세싱의 시작 방법을 설정하는 함수입니다.
해당 함수는 모듈 단위에서 실행되는 multiprocessing에서
모듈이 실행되는 시작부분에서 선언이 되어야합니다.
multiprocessing은 독립적인 프로세스를 생성하고,
이 프로세스들이 병렬로 실행되도록 돕는 라이브러리입니다.
따라서, 멀티프로세싱을 사용할 때 set_start_method()를
if __name__ == '__main__' 시점에 호출해야
적절한 호출이 됩니다.그 이후 프로세스 생성 및 시작을 진행합니다.
3. 결론
multiprocessing을 사용하는 코드를 if __name__ == '__main__' 보호구문 안에 넣어줘야 합니다.
Python에서 multiprocessing 모듈을 사용할 때,
자식 프로세스가 부모 프로세스를 복제하는 방식으로 실행되기 때문에,(Windows 에서 주로..)
multiprocessing을 사용하는 코드를 if __name__ == '__main__' 보호구문 안에 넣어줌으로서
자식 프로세스가 불필요하게 모듈을 재실행하지 않도록 할 수 있습니다.
참조
아래의 python docs를 참조했습니다.
https://docs.python.org/3.7/library/multiprocessing.html
multiprocessing — Process-based parallelism — Python 3.7.17 documentation
Source code: Lib/multiprocessing/ Introduction multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency, effectively side-stepping the G
docs.python.org
'인공지능 개발하기 > Backend' 카테고리의 다른 글
[Docker-AWS 이슈] MacOS에서 AWS ECR에 이미지 push시 이미지 media-type이슈 (2) | 2024.10.28 |
---|---|
[Docker] 7. Docker Hub에 이미지 push/ pull 하기 (0) | 2024.10.15 |
[Docker] 6. 컨테이너에 이름 지정하기 & 이미지에 이름, 태그 지정하기 (0) | 2024.10.15 |
[Docker] 5. 이미지 구조 살펴보기 (0) | 2024.10.15 |
[Docker] 4. 컨테이너 시작, 재시작, 중지, 제거하기 / 이미지 제거하기 (0) | 2024.10.14 |