Multiprocessing
하나의 프로그램을 한개의 프로세서가 아닌 여러 프로세서가 동시에 처리하는 것으로, python2.6에 처음 멀티프로세싱 모듈이 추가되었으며 관련 라이브러리는 threading 과 multiprocessing 이 있다.
내가 사용한 pool.map 방식은 동적변수 1개만 입력가능하기때문에 partial 함수로 나머지 정적변수는 묶어 주었다.
코드 활용(pool) 예)
with poolcontext(processes=activate_CPU) as pool:
result_list = list(tqdm(pool.imap_unordered(partial(find_intersection_point, Source_loc = pSource, Source_target_loc = tSource, error_correction = mesh_error_correction), ply_filtered), total=len(ply_filtered)))
문제제기
lidar_simulator의 실행시간 분석결과이다. 위의 결과에서 알수있듯, 모델링의 교점을 구하는 시간이(raycasting time) 다른 부분의 연산시간에 비해 현저히 많은 시간이 소요되는 것을 확인 할 수있다. 이는 함수 자체의 속도가 느린 것과, point의 갯수가 늘어날 수록 그만큼 많은 횟수를 반복해야하기 때문이다. 본 개발은 두번째 문제인 반복작업에 대한 소요시간을 개선하기 위해 진행되었다.
multiprocessing을 적용하였다. Python의 특성상 스레드를 여러개 사용하는 multi threading 보다 cpu를 병렬로 사용하는 multi processing이 더욱 효율적이다.
관련 토론 : https://stackoverflow.com/questions/3044580/multiprocessing-vs-threading-python
실험결과
아래의 실험들은 모두 Macbook Air (apple sillicon M1, RAM 8GB) 환경에서 진행되었다.
M1은 4개의 고성능 코어와 4개의 저전력 코어로 구성되어있다.
약 1500개의 비교적 적은 points로 실험한 결과, 위 그래프와 같이 4개의 코어를 사용했을때 최적의 성능을 보였다. 이는 M1 칩셋의 특성 때문으로 보이는데, M1은 4개의 고성능 코어와 4개의 저전력 코어로 구성되어있다. 위의 결과로 추론해볼때, 앞의 4개의 코어는 고성능코어를 우선순위로 사용하여 빠르게 연산속도 개선이 이루어졌고, 5개 core를 사용하면서 부터는 저전력코어를 사용하여 오히려 효율이 떨어지는 결과가 나온것으로 사료된다.
약 35000개의 비교적 많은 points로 실험한 결과, 위 그래프와 같이 4개의 코어를 사용했을때 까지 최적의 성능 향상을 보였다.
위 그래프는 사용 코어의 증가비율 대비 효율을 계산한 그래프로, 8~10코어 이상 사용할때부터 효율이 떨어지는데, 이는 물리적인 실제 코어의 갯수 이상의 코어를 사용하면 오히려 효율이 감소한다는 것을 잘 나타내준다.
Amdahl의 법칙
Amdahl의 법칙 - 순차적으로 진행해야하는 연산은 병렬처리가 불가능하므로, 코어의 갯수를 무한정으로 늘린다 해도 성능향상의 한계가 존재한다.
Amdahl의 비율 - 순차적으로 진행해야하는 연산 중 병렬처리가 불가능한 부분(순차적으로 진행해야하는 부분)의 비율
여기서 a를 Amdahl의 비율이라고 가정하면,
위의 식을 속도향상에 대한 식으로 변환하면, 아래의 식으로 나타내진다.
여기서 프로세서의 수가 무한대라고 가정하면, 속도향상의 비율값은 위의 식으로 나타나는데, 최대 속도향상값은 Amdahl의 비율의 역수가 된다.
현재 시뮬레이터의 전체연산시간을 분석한 결과, 약 24%의 순차진행 연산으로 구성되어있고, 나머지 76%의 연산이 병렬처리가 가능한 것으로 나타났다.
Amdahl의 법칙에 따라 코어의 갯수를 무한정으로 늘렸을때 최대 연산속도 향상한계는 4.2배인 것으로 계산되었고, 35000개 points 실험의 결과를 보면 코어 8개 사용 시 코어 1개 사용시간 대비 약 3배정도의 연산시간 향상을 보이면 계산한 값과 거의 일치 하는 것을 확인 할 수 있었다.
multiprocessing vs numba
python의 가장 큰 단점인 연산속도를 개선시키기 위한 다양한 라이브러리들이 개발되었는데, 아주 간단하게 적용하여 큰 효과를 낼 수 있는 라이브러리가 바로 numba 이다.
multiprocessing 대신 numba를 적용한 결과 다음과 같은 양상을 보였는데, 물체의 모양과 상황에 따라 차이는 있지만 포인트 갯수가 많아 질수록 multiprocessing이 우수한 성능을 보였다.
혼합하여 실험 해보면, numpy연산이 적은 실험코드 특성상 성능이 오히려 떨어지는 양상을 보였다.
결론
위의 실험결과로 보아 병렬처리는 반복문이 많은 알고리즘에서 큰 효과를 보일 것으로 판단된다. 또한 많은 프로세서를 탑재한 cpu에 적용할 수록 효과적일 것으로 보이는데, 이는 apple sillicon이나 intel의 cpu 보다 비교적 구성코어와 스레드가 많은 AMD사의 cpu를 사용하는 것이 유리할 것이다. 또한 cpu의 사용량을 100%사용하므로, 안정적인 작업을 위해 전체 cpu보다 적은 갯수의 cpu만 사용하는 것을 추천하며, 사용량이 100%까지 올라가는 만큼 발열이 심하므로 충분한 냉각성능을 확보 한 후 작업에 활용해야 할 것이다.
intel AMD 비교
'python' 카테고리의 다른 글
한영타 변환기를 만들어보자! [2] (tkinter로 UI만들기) (1) | 2022.07.04 |
---|---|
한영타 변환기를 만들어보자! [1] (알고리즘 구성) (3) | 2022.07.04 |
Recurrence plot (시계열 데이터를 학습시켜보자!) (0) | 2022.05.25 |
python 경로 및 현재 경로의 파일 리스트 (0) | 2022.01.07 |
Open3d - Hidden Point Removal (+논문리뷰) (0) | 2021.09.07 |