2

クラスター内の複数のノードで評価したい関数があります。を使用してクラスターで実行する簡単な例を取得しましMPI4pyたが、物事をもう少しユーザーフレンドリーにする (のmap機能を実装するなどmultiprocessing) だけでなく、生成されるプロセスの数をもう少し制御できる python パッケージを見つけたいと思っていました。どのノードで。実装するパッケージはいくつか見mapましたが、各ノードで生成されるプロセスの数を制御するパッケージはありません。

次のコードは、私の言いたいことをほぼ示しています。ただし、通常の方法で記述する代わりにMPI4py、関数で行うように記述しましたmap。私がこのように書いたのは、これが最終的にコードを実装したい方法であり(をエミュレートするモジュールをmap使用)、MPIを使用して自分がやりたいことを達成する方法がよくわからないためです。 .

from numpy import *
from multiprocessing import Pool

def foo(n):
  random.seed(n)
  a = random.randn(1000,1000)
  b = random.randn(1000,1000)
  c = dot(a, b)
  return c.mean()


if __name__ == '__main__':
  pool = Pool(processes=4)
  results = pool.map(foo, range(4))
  print results

各ノードに送信されるプロセスの数を制御したい理由は、内部の命令の一部fooがマルチスレッド化できるためです ( dotMKL ライブラリーにもリンクされるように)。

それぞれ 2 つのコアを持つ 12 台のコンピューターのクラスターがある場合、12 のノードのそれぞれに 1 つのジョブを送信するだけで、暗黙的に両方のコアを利用できます。両方のプロセスが両方のコアを使用しようとすると、スレッド スラッシングの可能性が心配なので、24 個のジョブ (コアごとに 1 つ) を生成したくありません。また、最初の 6 つのノードに 2 つではなく、各ノードに 1 つを送信するかどうかわからないため、12 のプロセスを生成することもできません。

まず、これは大きな懸念事項でしょうか。12 プロセスではなく 24 プロセスを実行すると、パフォーマンスにどの程度の影響がありますか?

それが違いを生む場合、上にオーバーレイしMPI4pyて探していることを実行するpythonパッケージはありますか?

4

1 に答える 1

2

私も同じことを望んでいたので、各ホストでアイドル状態のワーカー プロセスの数を追跡する概念実証を作成しました。2 つのスレッドを使用するジョブがある場合、ホストに 2 つのアイドル状態のワーカーが存在するまで待機し、それらのワーカーの 1 つにジョブを割り当て、ジョブが完了するまで他のワーカーをアイドル状態に保ちます。

各ホストで起動するプロセスの数を指定するには、 hostfileを使用します。

重要なのは、ルート プロセスが他のプロセスからメッセージを受信できるようにすることです。

source_host, worker_rank, result = MPI.COMM_WORLD.recv(source=MPI.ANY_SOURCE)

そうすれば、各ジョブが終了するとすぐにわかります。次に、準備ができたら、ジョブを特定のワーカーに送信します。

comm.send(row, dest=worker_rank)

None最後に、メッセージを送信してすべてのワーカーにシャットダウンするように指示します。

comm.send(None, dest=worker_rank)

これを書いた後、jbornschein の mpi4py task pull exampleを見つけました。各ジョブのスレッド カウントは処理しませんが、さまざまなメッセージ タイプにタグを使用する方法が気に入っています。

于 2014-12-17T19:38:24.870 に答える