본문 바로가기
카테고리 없음

파이썬 멀티프로세싱 (Pool, starmap_async)

by judy@ 2023. 8. 7.

negative sampling 하는데, 만여명이 넘는 유저에 대해서 for loop을 도니 속도가 매우*100000으로 느리다. htop을 찍어보니, single loop을 돌 때마다 활성화되는 CPU 코어는 한 개, 30개가 있으니까 모두 이용할 수 있도록 해보자.

 

목표

가지고 있는 코어를 최대로 활용하여 처리 속도를 줄인다.

 

방법

from multiprocessing import Pool

def sample_negative(user_id):
	''' 생략: 오래걸리는 작업 '''
    return negative_samples
    
# 기존 방식
train = []
for u in all_users:
	train.extend(sample_negative(u))

# 멀티프로세싱 적용
train = []

p = Pool(30)
ret = p.starmap_async(sample_negative, zip(all_users))
for r in ret.get():
    train.extend(r)

30개의 코어를 모두 사용하여, 처리 속도가 빨라짐

 

설명

Pool(30) : 프로세스 풀을 30개 생성 (이 개수에 따라 사용하는 CPU 코어의 수가 달라지게 됨)

-  p.startmap_async(function, args) : 함수와 입력 인자를 입력으로 받아 프로세스를 할당하여 작업을 수행함

-  for r in ret.get() : 리턴된 이터러블 객체의 get 메서드를 호출해 개별 결과를 받음

반응형