안녕하세요?
파이썬 병렬계산과 관련해서 좀 여쭙고자 합니다.
많은 사람들이 불평하듯이, 파이썬은 병렬계산과 관련되어 한계도 많고 그나마 문서도 제대로 정리된게 거의 없더라고요.
어쨌거나 저는 대학원생인데, 연구에서 파이썬을 사용하고 있습니다.
아주 고도의 병렬화는 필요 없어요.
지금의 상황을 간단히 설명 드리자면..
1억 x 10 정도의 데이터가 있고요,
1억개 중 그때 그때 다른 일부분을 뽑아서 몇 가지 계산을 돌린 뒤 결과값만 저장합니다.
1억개 중 대략 10만개를 뽑아서 원하는 계산을 다 돌리는데 1분 정도가 소요됩니다. 이 부분은 대부분 numpy로 짰고, 일부는 Cython이나 포트란으로 짠 모듈입니다.
100만개를 뽑으면 10분도 훌쩍 넘깁니다. 흑
어떨 때는 10만개를 뽑고, 어떨 때는 100만개를 뽑고, 뽑았던걸 또 뽑기도 하고.. 그때 그때 다릅니다.
이런 식으로 부분 데이터를 뽑아서 돌리는 계산을 1000번 정도 해야합니다. (사실은 이걸 또 100번씩.... 엉엉)
좀 큰 계산용 서버 한대에서 돌릴 거고요, 전체 데이터를 읽어들이기에는 메모리가 충분합니다. 코어는 40개 정도 있고요. shared memory입니다.
전체 데이터를 메모리로 읽어 들인 다음에, 40개 코어가 각각 25번씩만 루프를 돌아주면 좋겠어요. 계산에 사용되는 부분 데이터는 그때그때 다를 거고요.
부분 데이터의 크기가 그때그때 다르고, 그때그때 결정됩니다. 그래서 massively parallel인 상황은 아닌 것 같네요.
다행히 원본(전체) 데이터는 복사될 뿐 수정되지 않습니다. 그렇다면 GIL의 제약을 안 받는게 맞나요?
마치 global 메모리를 공유하는 subprocess를 40개씩 돌리는 것과 비슷한 그림이 그려지는데, 파이썬의 어떤 패키지를 써야하는지 모르겠습니다.
부분 데이터 크기가 저마다 다르니 어떤 코어는 25개를 빨리 계산하고 어떤 코어는 늦게 계산하겠지만 그 정도는 전혀 상관없습니다. 40개가 돌아가주는 것만으로도 감지덕지..
병렬화 방법은 많은 것 같은데 죄다 설명이 부실하네요(저같은 멍청한 사람을 일깨우기에는 부족합니다 ㅠㅠ).
PyPy는 병렬화가 수월하다고 하더라고요.. 하지만 Cpython을 벗어나지 않는 선에서 해결하고 싶습니다. 머지 안은 미래에 PyPy와 연동되지 않는 다른 패키지를 써야할 것 같은 예감이 들어요.
저 같은 경우엔 어떤 패키지(?)로 병렬화를 해야 할까요?