- 문제를 여러 CPU로 병렬화한다면 n 코어 시스템에서 최대 n배의 속도 향상을 기대할 수 있음
- 암달의 법칙(Amdahl's law) : 코드 중 일부만 병렬화 할 수 있다면 그 부분에 얼마나 많은 CPU를 할당하느냐는 중요하지 않다는 사실을 보여준다.
- 멀티프로세싱 모듈을 사용하면 프로세스나 스레드 기반의 병렬 처리를 사용해서 작업을 대기열에 분산시키고 프로세스 간에 데이터를 공유할 수 있음. 이 모듈은 주로 단일 컴퓨터에서의 멀티코어 병렬성에 초점을 맞춰 있음. CPU 위주의 작업을 여러 프로세스로 병렬화, I/O 위주의 문제를 병렬화.
멀티프로세싱 모듈로 처리할 수 있는 전형적인 작업
- CPU 위주의 작업을 Process나 Pool 객체를 사용하여 병렬화
- 더미(dummy) 모듈을 사용해서 I/O 위주의 작업을 스레드를 사용하는 Pool로 병렬화
- Queue를 이용한 피클링(Pickling)한 결과를 공유
- 병렬화한 작업자 사이에서 바이트, 원시 데이터 타입, 사전, 리스트 등의 상태를 공유
- 파이썬의 스레드가 OS의 네이티브 스레드이며, GIL에 의해 제한되며, 한 번에 오직 한 스레드만 파이썬 객체들과 상호작용을 할 수 있음
- 프로세스를 사용하여 여러 파이썬 인터프리터를 병렬로 실행할 수 있고, 각각의 인터프리터는 독립된 메모리 공간과 GIL을 가지며, 각각은 순차적으로 실행된다(따라서 각각의 GIL을 가지고 경합하지 않는다)
--> 파이썬에서 CPU 위주 작업의 속도를 높이는 가장 쉬운 방법이다. 상태를 공유해야 한다면, 약간의 통신 부가비용이 들어가야 한다.
<multiprocessing 모듈의 구성 요소>
- 프로세스(Process) : 현재 프로세스를 포크(fork)한 복사본이다. 이렇게 하면 새로운 프로세스 식별자가 부여되며, 운영체제에서 별도의 자식 프로세스로 작업을 실행한다. 프로세스를 시작하고 상태를 질의할 수 있으며, 실행할 대상 메서드를 저장 할 수 있다.
- 풀(Pool) : Process나 threading, Thread API를 감싸서 작업을 공유하고, 합쳐진 결과를 반환해주는 사용하기 편리한 작업자 풀(worker pool)로 만듦
- 대기열(Queue)
- 파이프(Pipe) : 두 프로세스 사이의 단방향 또는 양방향 통신 채널
- 관리자(Manager) : 프로세스 간에 파이썬 객체를 공유하기 위한 고수준의 관리된(managed) 인터페이스
- 데이브드 비즐리(David Beazley) 블로그 "The Python GIL Visualized) : 스레드가 깨어나서 GIL을 획득하려 시도할 때마다, 스레드는 시스템 자원을 일부 사용한다. 한 스레드가 바쁘다면 다른 스레드는 반복적으로 깨어나서 GIL을 획득하려 시도한다.
- GIL을 얻기 위한 전투를 피한다면 전체 실행 시간이 짧아질 것이다. 하지만 GIL로 인해 단일 스레드를 사용할 때보다 전체 실행 시간이 더 짧아질 수는 없다. GIL이 없다면 각 스레드가 대기할 필요 없이 병렬로 실행될 수 있고, 여러 스레드가 시스템의 모든 자원을 활용할 수 있을 것이다.
- CPU 위주의 작업여서 여러 스레드를 사용하는 경우 발생하는 부정적인 영향이 파이썬 3.2 이상의 버전에서는 어느 정도 해결되었다고 한다.
멀티프로세싱을 효율적으로 사용하기 위한 전략들
- 작업을 독립적인 작업 단위로 나눠라
- 작업자가 처리하는 시간이 작업에 따라 달라진다면, 작업 순서를 임의로 재배치 할 것을 고려하라
- 작업 대기열을 정렬해서 가장 느린 작업을 먼저 처리하는 것도 마찬가지로 좋은 전략일 수 있다
- chunksize를 조정해야하는 검증된 이야가 없다면 기본 크기를 사용해라
- 물리 코어의 개수와 적업의 개수를 서로 맞춰라
중요) 작업을 병렬화하려면 순차적 프로세스를 작성하는 일반적 방식과 다르게 생각해야 함. 병렬화한 작업을 디버깅하는 것이 더 어려움.
참고 : 고성능 파이썬, 미샤 고렐릭, 이안 오스발트, 한빛 미디어
'공부하는삶 > Python' 카테고리의 다른 글
Python Composite pattern(composition), Descriptor, Meta class (0) | 2023.08.29 |
---|---|
Sequence (0) | 2020.05.09 |
Magic Method (0) | 2020.05.09 |
Gaussian Filter vs Bilateral Filter (0) | 2020.04.02 |
Tensorflow 시작하기 - 1 (0) | 2019.11.28 |
리스트 , 딕셔너리, 집합, 튜플 (0) | 2019.09.19 |