파이썬 코드에서 샘플링 부분이 성능이 나오지 않아 멀티프로세싱을 사용해 이를 해결하고자 했다.
처음에는 다음과 같이 코드를 작성했다.
| from multiprocessing as mp |
| if n_workers = =1: |
| samples = list(map(sampler.sample, densities)) |
| else: |
| with mp.Pool(n_workers) as pool: |
| samples = pool.map(sampler.sample, densities) |
파이썬의 multiprocessing 라이브러리에서 Pool을 사용할 때 worker의 개수가 하나일때도 process를 생성해 pool을 사용하지 않은 경우보다 성능저하가 있었다. 무시해도 될 수준이지만 이 부분을 분기문을 통해 처리했다.
하지만 위와 같이 코드를 작성하니, 기존 코드에서 사용되었던 progress bar를 사용하기 어려웠다.
이에 대해서 찾아보니, tqdm에서 이미 파이썬 concurrent 라이브러리를 포팅해서 병렬처리와 그에 대한 progress_bar처리를 구현해 놓았었다.
이를 활용해 위 코드는 아래와 같이 변경했다.
| from tqdm.contrib.concurrent import process_map |
| samples = process_map(sampler.sample, densities, max_workers=n_cpus) |
tqdm의 process_map은 worker가 하나일때도 큰 성능저하 없이 동작하였다.
댓글을 사용할 수 없습니다.