Q2.12. バルクジョブで使用ノード数を抑えつつ、多数のタスクを実行したい。
A.2.12.
使用ノード数を抑えつつ、多数のタスクを実行したい場合は、以下のスクリプト例を参考に同時に実行するsrunの数をコントロールしてください。
このサンプルでは、1ノードを使いそれぞれ1CPUコアの計算を3000回を繰り返します。
#SBATCH -p XXX #パーティションを指定
#SBATCH --nodes=1
#SBATCH --ntasks=128
#SBATCH --cpus-per-task=1
TOTAL_TASKS=3000 # 繰り返し実行するタスク(プロセス)総数
EXE="myapp -a -b -c" # アプリを実行するためのコマンド
SRUN_OPTS="-N 1 -n 1 -c 1 --mem-per-cpu=1840 --exclusive"
CONCURRENT_TASKS=$SLURM_NTASKS # 同時実行数
WAIT_TIME=10 # srun 終了をチェックする間隔(秒)
count=0
task_id=()
while [ $TOTAL_TASKS -gt $count ]; do
for ((i=0;i<$CONCURRENT_TASKS;i++)); do
pid=${task_id[i]:=dammy}
if [ ! -d /proc/$pid ]; then
# srun を実行して PID を保存します
srun $SRUN_OPTS $EXE & task_id[$i]=$!
count=$((++count))
[ $TOTAL_TASKS -eq $count ] && break
fi
done
if ps | grep -q srun; then
sleep $WAIT_TIME
fi
done
wait # すべてのタスク終了を待ちます