私はPythonには新しく、分散クラスター上でマルチスレッド/マルチプロセスコードを実装する最良の方法は不明です。PBSを使用して外部MPIプログラムを呼び出す並列Pythonスレッドを実行する
私は、PBSキューイングシステムを使用して大規模なクラスタで実行されている外部MPIプログラムを呼び出すPythonを使用してラッパースクリプトを作成しようとしています。私が取り組んでいるタイプのスクリプトの(非常に)簡略化されたバージョンは、コードが特定のディレクトリに移動し、外部MPIプログラムを実行し、大きな変更があったかどうかを調べます。
#!/local/python-2.7.1/bin/python2.7
import os
import subprocess as sp
import coordinate_functions as coord_funcs
os.chdir('/usr/work/cmurray/SeachTest/')
print os.getcwd()
# Gets nodefile and num procs (NP)
cat_np = sp.Popen('cat $PBS_NODEFILE | wc -l', shell = True, stdout=sp.PIPE)
NP = int(cat_np.communicate()[0])
sp.call('cat $PBS_NODEFILE > nodefile', shell = True)
def run_mpi(np, nodefile):
mpi_cmd = 'mpirun -machinefile %s -np %d mpipg > calc.out' % (nodefile, np)
sp.call(vasp_cmd, shell = True)
def search_loop(calc_dir, t_total, nodefile, num_procs):
os.chdir(calc_dir)
no_events = True
while no_events or t < t_total:
run_mpi(mynodefile, NP)
num_events = coord_funcs.change_test('OUTFILE', 'INFILE', 0.01)
if num_events > 0:
event = True
else:
t += 1
search_loop('/usr/work/cmurray/SeachTest/calc_1/', 10, mynodefile, NP)
これは、その後、使用してキューに提出されています
qsub -l nodes=4 -N SeachTest ./SearchTest
を私は何をしたいことは読んで(例えば異なる開始位置を含む)別のディレクトリに並列にsearch_loop
機能の複数のバージョンを実行していますリストから。プロセスは非常に重く、呼び出されるたびにMPIの計算を実行するのに数分かかることがあります。
threading
モジュールは、この目的のためには問題ありませんか、multiprocessing
モジュールを使用するのがよいでしょうか?上の例ではスレッド/プロセス間でブール値event
のような単純なメッセージを渡す必要があるでしょう。
また、PythonスクリプトがMPIに割り当てられたプロセッサを使用していないことを確認するにはどうすればよいですか?
MPIプログラムを使用して異なるノードでプログラムを実行してみませんか? – dbeer
残念ながら、MPIプログラムは、慎重に最適化され、私たちのクラスターによって編集された独自のソフトウェアです。私は今日、マルチプロセッシングの代わりにmpi4pyを使い始めました。パラダイムシフトのビット(私は "統合失調症プログラミング"として記述されているMPIを見てきました)しかし、コードをよりスケーラブルにして、ノード/プロセッサの割り当てをより良く制御する必要があります。 – CiaranAM