-
파이썬 multiprocessing Pool 이해하기카테고리 없음 2021. 7. 5. 01:45반응형
- 파이썬은 작업을 병렬처리 할 수 있도록 멀티프로세싱을 지원하는데, 그 중 하나인 POOL 에 대해서 설명해보도록 하겠다. 다음의 그림을 보면, 놀고 잇는 우리의 CPU 등을 향해 멀티 CPU를 활용해서 각각의 결과물을 나중에 합쳐 작업을 좀 더 수월하고 빠르게 진행할 수 있다.
- 더 자세한 설명은 고성능 파이썬 프로그래밍 3 - 멀티프로세싱과 멀티스레딩 (chacha95.github.io) 여기에 나와있으니, 참고하고, 우리는 이를 활용하여 좀 더 실용적으로 어떻게 사용하는지 알아보자.
0. 모듈 임포트
- 먼저 파이썬의 멀티 프로세싱을 만들어주기 위한 모듈을 import 해준다.
In [ ]:import matplotlib.pyplot as plt import random import time
1. 함수 정의
- 작업량을 비교해 주기 위해서 random_walk_ 라는 함수를 정의해주는데, 100번동안의 점의 변화량을 100번실행하여, 그림으로 표현해주는 함수로 대략 10_000 의 계산량을 지녔다고 볼 수 있다.
In [ ]:def random_walk_(seed_): random.seed(seed_) fig = plt.figure(figsize=(12,6)) for i in range(100): walk_ = [0] for j in range(100): walk_.append(random.uniform(-1,1) + walk_[-1]) plt.plot(walk_,alpha=0.5) plt.savefig(f'{seed_}.png') plt.close(fig) return None def logging_time(original_fn): def wrapper_fn(*args, **kwargs): start_time = time.time() result = original_fn(*args, **kwargs) end_time = time.time() print("WorkingTime[{}]: {} sec".format(result, end_time-start_time)) return result return wrapper_fn
- logging_time 함수는 데코레이터로 시간을 나타내주는데, 사용하였다.
2. POOL 모듈 및 POOL 제외 비교
- cpu core 갯수 확인
In [ ]:import os print(os.cpu_count())
4
In [ ]:@logging_time def process_A(): list(map(random_walk_, range(20))) process_A() # 일반적인 연산 from multiprocessing import Pool @logging_time def process_B(): num_cores = 4 pool = Pool(num_cores) pool.map(random_walk_,range(20)) process_B() # 병렬처리 Pool
WorkingTime[None]: 7.235080718994141 sec WorkingTime[None]: 3.120617389678955 sec
- 보게 되면, 위에는 7.2 초가 소요되었고, 밑의 경우, 3.12 초가 소요됨을 알 수 있다. (거의 절반의 시간 절약)
- 그렇다고 CPU 코어를 4개 사용했다고, 4배 빨라지는 것은 아니니, 계산상에서는 조심해야겠다.
- Pool 의 모듈 사용법은 Pool(num_cores)의 개수로 객체생성해준다음, pool 객체에 원하는 함수를 mapping 시켜주면, 알아서 Pool 의 multiprocessing 을 통해 빌드 된다.
- Kaggle 데이터 셋 만드는데, 너무 오래걸려서 Pool 의 사용법 정리 및 기록 합니다~ 질문은 댓으로 남겨주세요
- 참고로 위의 random_walk 함수는 다음과 같은 사진을 만들어 냅니다.
반응형