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 메서드를 호출해 개별 결과를 받음
반응형