要点
Slurmで1つ目のジョブjob.sh
の実行終了を待ってから2つ目のジョブjob2.sh
が流れるようにするには、「ジョブ名」を揃えた上で
sbatch job.sh
sbatch -d singleton job2.sh
とオプションを付けて投入すればよい。ただし、同じユーザー名であること。
説明
科学技術計算、いわゆる、シミュ―ションを行う時、スパコンや計算機クラスターを複数人で共用することがあると思います。そんなとき、計算(ジョブ)の順番待ちを管理してくれるサービスはジョブ管理ソフトと呼ばれます。私はフリーながらスパコンなどでも採用実績のある[Slurm]
(https://www.schedmd.com/)を利用しています。
今回は、Slurmを使って計算を投入する際に、前の計算が終わるのを待ってから次の計算(続きの計算)を実行したいという場合の簡単な投入方法について紹介します。とても長い計算を、何日にもわたって計算したいが、共用コンピュータなので一回のジョブに時間制限がある場合などに便利です。(一般にステップ実行とか逐次実行とか呼ばれますが、方言のようなもので人によって指すものが違うのでご注意ください。)
Slurmでジョブを投入するには、一般にsbatch
コマンドを利用します。計算したいジョブの情報(実行バイナリのパスやMPI並列数など)をシェルスクリプト(ここではjob.sh)に記入しておいて、次のように投入します。
sbatch job.sh
今度は、この計算が終了するのを待ってから実行して欲しいjob2.sh
を投入する場合、普通にsbatch job2.sh
とすると、コンピュータに空きができれば計算が実行されてしまいます。job.sh
の計算が終わるまで待つには、次の2つのことをします。
(1) シェルスクリプト内で指定する「ジョブ名」を継続したいジョブで統一する。今回の例では、シェルスクリプト内ではjob.sh
とjob2.sh
次のように#SBATCH -J
の部分にジョブ名を書きますが、ここを揃えます。
#!/bin/bash
###job.sh および job2.shの中身###
#SBATCH -A project1
#SBATCH -J TestB #ここのジョブ名を継続したいジョブで統一する
#SBATCH -n 400
#SBATCH -c 2
#SBATCH -o log
#SBATCH -e err
export OMP_NUM_THREADS=2
srun ./apppath
(2) 投入時に、継続ジョブの方には-d singleton
オプションを付ける。
sbatch job.sh
sbatch -d singleton job2.sh
ただし、1つ目の投入時にはオプションは付けません。
結果として、上記の様にジョブを投入した場合のsqueue
コマンドの出力を示します。NAME
の欄がジョブ名です。先行したjob.sh
はTestB (JOBID 108)
です。ステップジョブとして投入したjob2.sh
はTestB (JOBID 109)
ですが、(Dependecy)
と表示されています。先行したジョブが終了してから実行されます。
一方で、さらにその後でTestA (JOBID 110)
を投入しても、ジョブ名が異なるので待つことはありません。
JOBID ACCOUNT NAME USER ST START_TIME NODE NODELIST(REASON
110 project1 TestA user1 R 2020-07-27T14:23:19 40 node[289-328]
108 project1 TestB user1 R 2020-07-26T23:09:03 10 node[32-71]
109 project1 TestB user1 R N/A 10 (Dependency)
最後に
Slurmは便利ですので、スパコン以外でも使えます。研究室レベルで計算機クラスターを共有する場合などにも使ってみましょう。
インストール方法はググればでます。
ただ、私の環境ですと、Intel MPIのversion 2019 Update 7以前を使った場合、scancel
コマンドでジョブをキャンセルした際に、実際にはプロセスがkillされずに生き残るというバグが起こります。version 2019 Update 8で治っているようなので(確認済み)、問題のある場合はupdateしてみてください。