1

Python シミュレーションを同時に数回実行しようとしていますが、実行ごとにパラメーターがわずかに異なります。multiprocessingこれを行うためにモジュールを使用しようとしています。次のようにコードを開始します。基本的なシミュレーションを関数として定義し、パラメーターを引数として使用します。

import multiprocessing
from math import *

def sim_seq(output_name,input_name,s_val...#more arguments):
   #do work here
   output.write(#data)
   output.close()
   return

また、シミュレーションの実行ごとに使用するパラメーターを含むテキスト ファイルを作成しました。これを読み込んで、次のループで引数として使用します。ここでは、マルチプロセッシングを使用しようとしています。

input_batch=('batch_file.txt')
if __name__ == '__main__':
   jobs=[]
   with open(input_batch) as f:
       for line in f:
           line=line.split(' ')
           for i in line:
              if i[0]=='o':
                 output_name=str(i[2:])
              #read in more parameters from batch_file.txt
       p = multiprocessing.Process(
           target=sim_seq,
           args=(output_name,input_name,s_val...#more arguments))
       jobs.append(p)
   for i in jobs:
      i.start()

これは本質的に私がやりたいことを達成し、それぞれ異なるパラメーターで一度に 3 つのシミュレーションを実行します。ただし、私が使用しているマシンには、1 ノードあたり 32 のプロセッサを使用できる 16 の計算ノードがあります。各シミュレーションが実行される場所を制御する方法を知りたいです。たとえば、各プロセッサに個別のシミュレーションを実行するように指示できますか? マルチプロセッシングの使用は初めてで、どのプロセッサまたはどのノードが何をするかを知る方法を知りたいです。32 の個別のパラメーター設定を使用して、シミュレーションの 32 の各インスタンスを独自のプロセッサで実行しながら、すべてを同時に実行することはできますか? マルチプロセッシングを使用して、同じ python 関数を複数回同時に実行するための計算上最速の方法は何でしょうか。ただし、実行ごとに異なる引数を使用しますか? ご意見/アドバイスをお寄せいただきありがとうございます。

4

1 に答える 1

1

(各計算ノードは、独自のコア セットを備えた個別のマシンであると想定しています。計算クラスタに、コアを仮想化してすべてがローカルに見える何らかの OS がある場合は、"複数のノード」のビットを以下に示します。)

1 つのノードで

このmultiprocessingモジュールは、オペレーティング システムの単一インスタンス内で複数のプロセスをネイティブに処理します。1 つのノードで起動topまたは同様のプロセス リストを表示し、N 個のコアが表示されている場合、それは Python シミュレーションで使用できるコアの数です。

ただし、その制約内で、必要な数のプロセスを生成および管理できます。オペレーティング システムは、通常のプロセス スケジューラを使用して、利用可能なコアにプロセスを配置します。したがって、あなたの状況では、単一のノードで 32 の個別のシミュレーションを並行して実行できるように思えます。ループを設定して 32 個のプロセスを作成し、実行するパラメーターを指定して、すべてが終了するまで待つだけです。

multiprocessing.Pool実行するシミュレーションが 32 個を超える場合は、32 個のワーカーを含む をセットアップし、pool.mapシミュレーション パラメーターのリストを使用して各コアに作業を分散できます。

複数のノード

32 を超えるシミュレーションがあり、別のノード (ssh などを使用して別のノードにログインする必要がある場合があります) でコアを活用したい場合、理論的には "Remote Managerこれを処理するために multiprocessing モジュールから ".

ただし、の素晴らしい機能を確認することをお勧めしIPython.parallelます。これにより、複数のノードで「処理エンジン」を起動し、IPython シェルを使用してノードに作業を分散できます。これは、上記のプロセス プールと非常に似ていますが、クラスター内のすべての計算ノードのすべてのコアを利用するだけです。

または、多数の既存のクラスター スケジューラ (Condor、Sun GridEngine など) のいずれかをセットアップまたは利用して、各処理ノードでシミュレーションを 1 回 (または 32 回) 開始することもできます。

于 2013-08-29T15:16:51.997 に答える