2017-02-12 7 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

問題はioのようです。プッシュは、すべてのデータセットをすべてのノードにプッシュします。マップ関数についてはわかりませんが、ノードに送信されるチャンク内のデータを分割する可能性が最も高いです。小さなチャンク - 処理の高速化。ロードバランサは、データとタスクを同じノードに2回送信する可能性が最も高いため、パフォーマンスが著しく低下します。

そして、どのようにして40ミリ秒でデータを送信できましたか?私はハンドシェイクだけが約1秒かかるhttpプロトコルに慣れています。私のためにネットワークでは40ミリ秒は雷が速いです。長い時間(40msの)について

EDIT:ローカルネットワークでは

1-10msのping時間は、通常の状態と考えられています。最初にハンドシェイク(最小2つの信号)を作成し、次にデータ(最小1つの信号)を送信し、応答(別の信号)を待つことを考慮すると、2つのコンピュータを接続するだけですでに20msくらい話しています。もちろん、ping時間を1msに最小限に抑え、さらに高速のMPIプロトコルを使用することができます。しかし、私が理解するように、それは状況を大幅に改善するものではありません。 1桁だけ速くなります。

したがって、一般的な推奨事項は、より大きなジョブを使用することです。たとえば、非常に高速なDask分散フレームワーク(ベンチマークに基づくCeleryより高速)では、タスク時間を100ms以上にすることを推奨しています。そうしないと、フレームワークのオーバーヘッドが実行時間の過大評価になり、並列化のメリットが消えてしまいます。 Efficiency on Dask Distributed

+0

ローカルマシンで実行されています。ノードは同じマシン上で実行されている単なるエンジンです。 –

+0

しかし、IpyparallelはまだZeroMQプロトコルを使用しています。理論的には、MPIを使用して速度を上げることができます。 –