0

私は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に割り当てられたプロセッサを使用していないことを確認するにはどうすればよいですか?

+0

MPIプログラムを使用して異なるノードでプログラムを実行してみませんか? – dbeer

+0

残念ながら、MPIプログラムは、慎重に最適化され、私たちのクラスターによって編集された独自のソフトウェアです。私は今日、マルチプロセッシングの代わりにmpi4pyを使い始めました。パラダイムシフトのビット(私は "統合失調症プログラミング"として記述されているMPIを見てきました)しかし、コードをよりスケーラブルにして、ノード/プロセッサの割り当てをより良く制御する必要があります。 – CiaranAM

答えて

0

私は何をしたいこと(例えば異なる開始位置を含む)別のディレクトリに並列にsearch_loop機能の複数のバージョンを実行しているが、リストから読み取ります。プロセスは非常に重く、呼び出されるたびにMPIの計算を実行するのに数分かかることがあります。

この目的のためにスレッドモジュールが問題ないのですか、マルチプロセッシングモジュールがより良い選択ですか?上の例では、スレッド/プロセス間のイベントブール値のような単純なメッセージを渡す必要があるでしょう。

実際にI/Oを並列化するのに十分な帯域幅があると仮定して、I/O集約型のプログラムではマルチスレッド化を最初に試してみます。

また、PythonスクリプトがMPIに割り当てられたプロセッサを使用していないことを確認するにはどうすればよいですか?

マルチプロセッシングを使用しない場合、スクリプトはGlobal Interpreter Lockのために1つのCPUのみを使用します。

+0

すばやい返答をいただき、ありがとうございましたが、何らかの理由でMPIプログラムが1つのスレッドでしか実行されませんでしたが、他のスレッドはテスト機能やいくつかのデバッグ用の印刷ラインを試しています。私のスレッドは、私が最初に思っていたように(実行中の多くの読み書き操作をしているMPIプログラムを忘れていたので)、代わりにマルチプロセッシングメソッドを試してみました。プロセッサーの配布に問題はありません(まだ)。 – CiaranAM

関連する問題