2017-02-12 11 views
1

임, ipyparallel 및 jupyter 노트북으로 분산 처리를 수행하는 방법을 이해하려고 시도 했으므로 테스트를 수행하여 이상한 결과를 얻었습니다.ipyparallel 이상한 오버 헤드 동작

from ipyparallel import Client 
%px import numpy as np 

rc = Client() 
dview = rc[:] 
bview = rc.load_balanced_view() 

print(len(dview)) 
print(len(bview)) 

data = [np.random.rand(10000)] * 4 

%time np.sin(data) 

%%time #45.7ms 
results = dview.map(np.sin, data) 
results.get() 

%%time #110ms 
dview.push({'data': data}) 
%px results = np.sin(data) 
results 

%%time #4.9ms 
results = np.sin(data) 
results 

%%time #93ms 
results = bview.map(np.sin, data) 
results.get() 

오버 헤드의 문제는 무엇입니까? 이 경우 작업 I/O 바인딩이되어 있고 1 코어만으로 더 잘 수행 할 수 있습니까? 큰 배열을 시도했지만 병렬 처리가없는 경우에도 더 나은 시간을 얻었습니다.

조언 해 주셔서 감사합니다.

답변

1

문제는 io 것 같습니다. 푸시는 모든 데이터 집합을 모든 노드에 푸시합니다. 지도 기능에 대해서는 확신 할 수 없지만 대부분 노드로 전송되는 청크로 데이터를 분할합니다. 이렇게 작은 조각 - 더 빠른 가공. 로드 밸런서는 데이터와 작업을 같은 노드로 두 번 전송할 가능성이 높습니다. 이는 성능에 큰 타격을줍니다.

그리고 어떻게 데이터를 40ms 이내에 보낼 수 있었습니까? 나는 핸드 쉐이크에만 약 1 초가 걸리는 http 프로토콜에 익숙하다. 나를 위해 네트워크에서 40 ms는 번개입니다. 1-10ms의 핑 시간은 정상적인 상황으로 간주됩니다

로컬 네트워크에서 : 긴 시간이 약

EDIT (은 40ms). 먼저 핸드 셰이크 (최소 2 개 신호)를 만들어 데이터 (최소 1 개 신호)를 보내고 응답 (다른 신호)을 기다리는 것을 고려하면 두 대의 컴퓨터를 연결하기 위해 이미 20ms 정도만 이야기합니다. 물론 ping 시간을 1ms로 최소화 한 다음 더 빠른 MPI 프로토콜을 사용할 수 있습니다. 그러나 나는 그것이 상황을 상당히 개선하지 않는다는 것을 이해한다. 한 단계 만 빠릅니다.

그러므로 일반적인 권장 사항은 더 큰 작업을 사용하는 것입니다. 예를 들어, 벤치 마크에 기반한 Celery보다 빠른 매우 빠른 데이터베이스 분산 프레임 워크는 작업 시간을 100ms 이상으로 권장합니다. 그렇지 않으면 프레임 워크의 오버 헤드가 실행 시간의 비중을 차지하고 병렬화 이점이 사라집니다. Efficiency on Dask Distributed

+0

로컬 컴퓨터에서 실행 중입니다. 노드는 동일한 기계에서 실행중인 엔진 일뿐입니다. –

+0

그러나 Ipyparallel은 여전히 ​​ZeroMQ 프로토콜을 사용합니다. 이론적으로 MPI를 사용하여 속도를 높일 수 있어야합니다. –