私は 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 計算の実行に数分かかるため、非常に IO 負荷が高くなります。
threading
モジュールはこの目的に適していますか、それともモジュールmultiprocessing
の方が適していますか? おそらくevent
、上記の例のブール値のような単純なメッセージをスレッド/プロセス間で渡す必要があります。
また、Python スクリプトが、MPI 実行に割り当てたプロセッサを使用していないことを確認するにはどうすればよいですか?