2017-09-12 11 views
1

동일한 배열 배열 (~ 4GB)을로드하고이 배열의 청크에 완벽하게 병렬 함수를 수행해야하는 Python 응용 프로그램이 있습니다. 배열은 디스크에 저장되기 시작합니다.동일한 노드에 공유 메모리가있는 Python 하이브리드 다중 처리/MPI

나는 일반적으로 과 같은 클러스터 컴퓨터에서이 응용 프로그램을 실행합니다. 예를 들어 각 노드에는 8 개의 컴퓨팅 코어가 있고 총 RAM은 약 32GB입니다.

가장 쉬운 방법 (작동하지 않음)은 n = 80mpi4py입니다. 그 이유는 작동하지 않는 이유는 각각의 MPI 코어가 4GB 맵을로드 할 것이므로 은 32GB의 RAM이므로 MemoryError이됩니다.

대안은 rank=0가 4GB의 배열로드 유일한 방법이라는 것이다, 그리고 그것은 MPI 코어의 나머지 에 배열의 덩어리를 농장 -하지만이 방법 때문에 네트워크 대역폭 문제의 느립니다. 단지 1 코어 각 노드 에로드 4GB의 어레이 및이 어레이는 공유 메모리 로서 사용할 경우

가장 좋은 방법이 될 것 (multiprocessing 통해?) 각 노드 나머지 7 개의 코어에 대한.

어떻게하면됩니까? 어떻게 MPI가 노드 을 인식하게하고 좌표를 multiprocessing으로 만드나요?

답변

1

multiprocessing 모듈에는 공유 메모리가 없습니다.

메모리보기를 사용하여 많은 수의 배열을 공유하는 방법은 joblib입니다. 데이터 복제를 피하려면 manual memory mapping을 사용할 수 있습니다.

각 노드에서 한 번만 데이터를 전달하는 방법을 찾으려면 노드 당 하나의 MPI 프로세스를 시작한 다음 큰 numpy 배열 입력에 대해 memmaping을 자동으로 사용하기 때문에 나머지 계산에는 joblib을 사용합니다.

+0

시도해 보지는 않았지만 이것은 다음과 같이 지적되었습니다. https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Array '다중 처리로 메모리를 공유하는 방법 ' – dbrane

+0

이것은 공유 메모리를 효과적으로 에뮬레이트하지만 메모리 맵보다 느리다. 프록시 기능을 사용하는 동기화 프로세스에 의존하기 때문에 (통신 효율이 아님) 읽을 수있다. 또한 선형 대수가 필요한 경우 효율적인 numpy 계산을 사용할 수 없습니다. –