アレイジョブ¶
アレイジョブとは¶
パラメータを変えながら同じジョブを複数、並列実行するときに使用します。複数の解析設定や入力ファイルに対して同じ処理を実行する場合は、アレイジョブの方が効率的です。
アレイジョブの作成方法¶
スクリプトの例(array.sh)は以下の通りです。
#!/bin/bash
#SBATCH -a 0-2:1
echo "task id = $SLURM_ARRAY_TASK_ID" # Print task id
PARAMS=(value1 value2 value3) # Set array
PARAM=${PARAMS[$SLURM_ARRAY_TASK_ID]} # Select value by task id
echo $PARAM # Check selected value
アレイジョブから実行される各ジョブにはタスクIDが割り振られます。タスクIDはシェルスクリプト内で、SLURM_ARRAY_TASK_ID
という環境変数から参照できます。
-a
オプションでタスクIDの範囲を指定します。
- -a [n]-[m]
範囲 n-m のタスクIDで、アレイジョブを実行
- -a [n]-[m]:[s]
範囲 n-m の s きざみタスクIDで、アレイジョブを実行
(例)
-a1-10:2
→ タスクID:1,3,5,7,9
アレイジョブの上限値(MaxArraySize)はMaxArraySize
の値で確認できます。
$ scontrol show config | grep MaxArraySize
MaxArraySize = 150001
アレイジョブで利用可能な環境変数¶
環境変数 |
概要 |
---|---|
SLURM_ARRAY_JOB_ID |
アレイジョブのID(アレイのうち最初に実行されたタスクのジョブID) |
SLURM_ARRAY_TASK_ID |
アレイジョブのタスクID |
SLURM_ARRAY_TASK_COUNT |
アレイジョブのタスク数 |
SLURM_ARRAY_TASK_MIN |
アレイジョブの最初のタスクID |
SLURM_ARRAY_TASK_MAX |
アレイジョブの最後のタスクID |
アレイジョブの実行方法¶
例1 (シェルスクリプトの中で-a
オプション指定をしている場合)
$ sbatch array.sh
例2 (シェルスクリプトの中で-a
オプション指定をしていない場合)
$ sbatch -a 0-2:1 array.sh
アレイジョブの確認
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
284_0 mjobs array.sh user R 0:02 1 c3x001
284_1 mjobs array.sh user R 0:02 1 c3x001
アレイジョブのジョブIDは、ジョブID_タスクID
という形式になります。
ヒント
各アレイジョブには、ジョブID_タスクID
という形式のジョブIDに加えて、通常のジョブと同様のジョブIDも付番されます。
ジョブの指定の際はどちらのIDも使用することができます。ただし、通常のジョブIDはジョブの実行が開始された順に付番されるため、タスクIDの順番とジョブIDの順番が一致しないことがあります。
ヒント
プロジェクトごとにジョブ投入上限値が10,000で設定されています。
ジョブ投入上限値を超える並列数が指定されたアレイジョブは、ジョブ投入することができません。アレイジョブを実行する際は、slurminfo
コマンドでジョブ投入可能数を確認し、並列数を決定する必要があります。
(例)既に9,000ジョブが投入されている場合、並列数が1,001のアレイジョブはすべて 投入不可となります。
アレイジョブの例¶
同じ処理をファイルごとに実行するスクリプトの例です。
#!/bin/bash
set -eu -o pipefail
echo "JOB: ${SLURM_ARRAY_JOB_ID}-${SLURM_ARRAY_TASK_ID} (${SLURM_JOB_ID})"
FILES=(data*.txt)
TARGET_FILE=${FILES[$SLURM_ARRAY_TASK_ID]}
echo "TARGET_FILE: $TARGET_FILE"
ls $TARGET_FILE
$ ls
data1.txt data2.txt data3.txt data4.txt data5.txt job_foreach_file.sh
$ ls data*.txt | wc -l # 処理の対象となるファイルの数をカウント
5
$ sbatch -a 0-4 job_foreach_file.sh # アレイジョブの実行
Submitted batch job 189180
$ ls # ジョブ完了後に出力を確認
data1.txt data4.txt slurm-189180_0.out slurm-189180_3.out
data2.txt data5.txt slurm-189180_1.out slurm-189180_4.out
data3.txt job_foreach_file.sh slurm-189180_2.out
$ cat slurm-189180_*
JOB: 189180-0 (189181)
TARGET_FILE: data1.txt
data1.txt
JOB: 189180-1 (189182)
TARGET_FILE: data2.txt
data2.txt
JOB: 189180-2 (189183)
TARGET_FILE: data3.txt
data3.txt
JOB: 189180-3 (189184)
TARGET_FILE: data4.txt
data4.txt
JOB: 189180-4 (189180)
TARGET_FILE: data5.txt
data5.txt