Job-Array
Einleitung
Für eine große Zahl von Jobs, die durch eine einzelne ganze Zahl parametrisiert werden können, sollte man ein Job-Array verwenden. Dies hat den Vorteil, dass wartende Jobs, die Teil eines Arrays sind, von Programmen wie squeue
zusammengefasst werden können. Damit wird die Liste der wartenden Jobs wesentlich übersichtlicher.
Ein Job-Array wird folgendermaßen abgeschickt:
Für jeden Wert, der durch die Option --array
spezifiziert wird, wird die Variable ${SLURM_ARRAY_TASK_ID}
im Skript durch diesen Wert ersetzt. Man muss also ${SLURM_ARRAY_TASK_ID}
im Skript verwenden, um den Input zu bestimmen. Die maximale Array-Größe beträgt 5001.
Einfaches Beispiel
Im einfachsten Fall wird der Array-Index als Parameter direkt an das Programm gegen:
#!/bin/bash
#SBATCH --job-name=my_job_array # replace name
#SBATCH --mail-user=example@zedat.fu-berlin.de # replace email address
#SBATCH --mail-type=end
#SBATCH --nodes=1
#SBATCH --ntasks=1 # replace with value for your job
#SBATCH --mem-per-cpu=4096 # replace with value for your job
#SBATCH --time=08:00:00 # replace with value for your job
#SBATCH --qos=standard # replace with value for your job
module add ExampleProg/1.2.3-foss-2018b # replace with value for your job
cd /scratch/${USER} # replace with your directory
exampleprog ${SLURM_ARRAY_TASK_ID} # replace with your program
Einfaches Beispiel mit Nicht-Integer-Parametern
Im Falle von nicht ganzahligen Parametern wird ein Array mit den Parametern definiert und dann der Array-Index benutzt, um den einzelnen Parameter auszuwählen:
#!/bin/bash
#SBATCH --job-name=my_job_array # replace name
#SBATCH --mail-user=example@zedat.fu-berlin.de # replace email address
#SBATCH --mail-type=end
#SBATCH --nodes=1
#SBATCH --ntasks=1 # replace with value for your job
#SBATCH --mem-per-cpu=4096 # replace with value for your job
#SBATCH --time=08:00:00 # replace with value for your job
#SBATCH --qos=standard # replace with value for your job
module add ExampleProg/1.2.3-foss-2018b # replace with value for your job
declare -a fruit
fruit=(apple banana cherry damson)
cd /scratch/${USER} # replace with your directory
exampleprog ${fruit[${SLURM_ARRAY_TASK_ID}]} # replace with your program
Multiparameter-Beispiel
Es kann aber auch ein Array von Parameterkombinationen erstellt werden und der Array-Index verwendet werden, um eine bestimmte Kombination auszuwählen:
#!/bin/bash
#SBATCH --job-name=my_job_array # replace name
#SBATCH --mail-user=example@zedat.fu-berlin.de # replace email address
#SBATCH --mail-type=end
#SBATCH --nodes=1
#SBATCH --ntasks=1 # replace with value for your job
#SBATCH --mem-per-cpu=4096 # replace with value for your job
#SBATCH --time=08:00:00 # replace with value for your job
#SBATCH --qos=standard # replace with value for your job
declare -a combinations
index=0
for run in `seq 1 10`
do
for direction in 'north' 'south' 'east' 'west'
do
for size in 7 11 19 33 112
do
combinations[$index]="$run $direction $size"
index=$((index + 1))
done
done
done
parameters=(${combinations[${SLURM_ARRAY_TASK_ID}]})
run=${parameters[0]}
direction=${parameters[1]}
size=${parameters[2]}
module add ExampleProg/1.2.3-foss-2018b # replace with value for your job
cd /scratch/${USER} # replace with your directory
exampleprog ${run} ${direction} ${size}