アレイジョブ

アレイジョブとは

パラメータを変えながら同じジョブを複数、並列実行するときに使用します。複数の解析設定や入力ファイルに対して同じ処理を実行する場合は、アレイジョブの方が効率的です。

アレイジョブの作成方法

スクリプトの例(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