2017-09-21 16 views
0

私はslurmで10,000ジョブを実行する必要があります(それぞれ30分かかると言います)。現在、計画はそうのように、並列に250個のコアを使用して、ジョブ配列でそれを行うことでした。(デフォルト1001から)pythonを使ってslurmに対話する(ジョブを自動的に連鎖させる)

sbatch --array=0-10000%250 array_script.sh args 

残念ながら、sysの管理者が変更されていないSLURMのMaxArraySize。これを "回避する"ために、私は全体の仕事を10個にスライスし、前の作品が終わった後に実行するように各作品をスケジューリングすることを計画していました。例えば、私が開始する:

sbatch --array=0-999%250 array_script.sh args 

ことが行われているときに、私はどうなる:

sbatch --array=1000-1999%250 array_script.sh args 

今、私は何とかこれをスケジュールする必要があります。私はbashに慣れていないので、私はすべての周りにPythonラッパーを持っていたので、私はPythonでそれをやると思っていました(とにかく、私は仕事用配列の周りにPythonラッパーを使用しています。だから私はこれをどのように普通にやるのだろうか?

は現在、私はしている:

 for i in range(num_slices): 
      command = 'sbatch --array={lower_end}-{upper_end}%250 array_script.sh args'.format(lower_end=i*1000, upper_end=min((i+1)*1000-1, num_targets-1), args=args) 
      subprocess.run(command, shell=True) 
      << need to have a step that waits till the job is done >> 

まず、上記では、私は現在、JOB_IDを知らないことを意味する、subprocess.runsbatchを実行します。 subprocess.runなどの出力をキャッチしてJOB_IDを見つけることができる方法はありますか?そして、ジョブがまだ実行中であり、ループを続行するかどうかを確認するには、squeueと同等の処理を行うにはどうすればよいですか?

答えて

0

Slurmはすべてのジョブを自動的にキューに入れるので、すべてを一度に送信できます。

ジョブが独立している限り、現在のジョブ配列の完了を待ってから次のジョブ配列を送信する必要はありません。

サブプロセスの出力を取得するには、回答hereがあります。

+0

この場合、最大の提出制限は、依存しているジョブであっても、さまざまなジョブにわたってカウントされるようです。だから私はスケジューラが必要な場合は、私の総ジョブサイズが制限を超えて拒否されるような追加のジョブが必要です。 –

関連する問題