효율적인 프로그래밍을 위해 병렬 프로그래밍을 하곤 합니다.
joblib은 파이썬 프로그래밍에서 병렬처리를 가능하게 만들어줍니다. 파이썬에는 병렬 연산 디폴트 패키지로 multiprocessing이 있습니다. multiprocessing은 pandas의 DataFrame을 다루는 데에 유용하며, joblib은 일반적인 python 코딩에 두루 쓰입니다.
joblib의 dump, load 메소드는 python 객체를 저장하거나 불러오게끔 할 수 있습니다.
본 게시물에서는 병렬 처리를 도와주는 joblib의 Parallel, delayed에 대한 설명을 하도록 하겠습니다.
설치
pip install joblib
Thread 기반 병렬 처리 vs Process 기반 병렬 처리
joblib.Parallel은 기본값으로 'loky' 백엔드 모듈을 사용합니다.
loky는 Python worker들이 동시에 다른 CPU를 사용하게 만들어줍니다. (즉, multi-processing을 시행합니다.)
그러나 이 방법은 input, output을 직렬화(serialize)해야 하기 때문에 상당한 오버헤드 문제를 일으킬 수 있습니다.
오버헤드란?
프로그램의 실행 흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때, 추가적으로 시간, 메모리, 자원이 사용되는 현상을 말합니다.
(출처: https://gamestory2.tistory.com/15)
내가 호출하는 함수들이 Python Global Interpreter Lock(GIL)을 해제하는 코드들로 이루어져 있다면?
멀티 프로세스보다는 멀티 스레드를 사용하는 것이 좋습니다.
GIL(Global Interpreter Lock)이란?
python 코드를 실행할 때에 여러 thread를 사용할 경우, 단 하나의 thread만이 python object에 접근할 수 있도록 제한하는 mutex입니다. 그 이유는 CPython이 메모리를 관리하는 방법이 thread-safe 하지 않기 때문입니다.
(출처: https://dgkim5360.tistory.com/entry/understanding-the-global-interpreter-lock-of-cpython)
delayed의 역할
위 코드에서, Parallel의 입력값에 delayed를 붙여주는 이유는 뭘까요? document상에서 정의된 역할은 다음과 같습니다.
un-picklable object를 serialization
먼저 standard pickle protocol로 pickle화 할수 없는 함수를 정의해야 합니다.
__main__ 모듈로 정의하기 때문에 pickle로 serialize화 할 수 없기 때문이죠.
그러나 cloudpickle로 직렬화할 수 있으므로, loky는 worker로 object를 보내 serialize하기 위해 cloudpickle을 사용합니다.
보다 빠르게 pickling, safe process creation 그리고 serialization of interactive functions 하기 위해, loky 는 non-picklable function을 wrap할 수 있는 wrap_non_picklable_objects()라는 wrapper function을 제공합니다. 그리고 cloudpickle을 이용하여 이 특별한 함수가 serialized할 수 있도록 serialization process로 indicate합니다.
This changes the serialization behavior only for this function and keeps using pickle for all other objects. The drawback of this solution is that it modifies the object. This should not cause many issues with functions but can have side effects with object instances.
Reference
python joblib으로 병렬 프로그래밍을 해보자
효율적인 프로그래밍을 위해 병렬 프로그래밍을 하곤 합니다. 특히 대용량의 데이터을 처리할 때 필수적이죠. joblib은 파이썬 프로그래밍에서 병렬처리를 가능하게 만들어줍니다. 파이썬에는
lovedh.tistory.com
'Programming > Python' 카테고리의 다른 글
[Python] 파일 이동, 복사, 폴더 이동 (0) | 2023.01.19 |
---|---|
Numba (0) | 2023.01.06 |
[Python] __str__와 __repr__의 차이 살펴보기 (0) | 2022.04.24 |
비트마스킹 (0) | 2022.04.14 |