본문 바로가기

Programming

[CS] 파이썬 multi-processing(parmap)

수백만 개의 데이터를 처리하는 반복이 많은 함수는 multi processing을 적용하는 게 좋다. 딥러닝 모델에서 weight를 gpu에 올리는 연산을 제외하고 대부분의 파이썬 연산은 cpu에서 진행하게 된다. cpu는 여러 개의 core를 갖는데 multi processing은 여러 core에 동일한 작업을 병렬 처리하게 해, 연산 속도를 향상한다. 

기존의 파이썬에서 많이 쓰는 Pool은 함수에 파라미터가 많은 경우 처리하기가 어려웠다. parmap을 이용하면 파라미터가 많은 함수도 쉽게 병렬 처리할 수 있다.

우선 컴퓨터(서버)에 cpu core가 몇 개인지 확인해야한다.

import multiprocessing

NUM_CORES = multiprocessing.cpu_count() # 내 서버는 20개

 

다음과 같이 입력에 a를 더하고 b를 빼서 return 하는 함수를 병렬 처리해보자.

def ex_func(input, a, b):
	for i in input:
		return i + a - b
        

 

입력을 core 개수(20개)만큼 나눠준다.

input = [range(1,100)]

# split은 numpy 내장 함수를 사용하므로 np.array로 변환해 사용
split_input = np.array_split(np.array(input), NUM_CORES)

# 결과물을 다시 list로
split_input = [x.tolist() for x in split_midi]

# 결과물 예시
split_input = [[1,2,3,4,5], [6,7,8,9,10], ... ]

 

parmap 라이브러리를 이용해 다음과 같이 실행한다.

parmap.map(	
  ex_func,      # 실행 함수 
  split_input,  # input data
  a, b,         # 함수 파라미터
  pm_pbar=True, # 진행상황 bar  
  pm_processes=NUM_CORES, # core 갯수
    )