4.4.ジョブ投入スクリプトの作成

目次 (4.4.ジョブ投入スクリプトの作成)

4.4.   ジョブ投入スクリプトの作成
4.4.1.  処理方法の指定
4.4.2.  sbatchオプション
4.4.3.  環境変数
4.4.4.  逐次ジョブを実行する場合
4.4.5.  スレッド並列ジョブを実行する場合
4.4.6.  MPIプログラム(openMPI)を実行する場合
4.4.7.  MPIプログラム(Intel MPI)を実行する場合
4.4.8.  MPIプログラム(mpich2)を実行する場合

▲このページの先頭へ

4.4. ジョブ投入スクリプトの作成

ジョブ投入のためのジョブ投入スクリプトを作成します。

4.4.1. 処理方法の指定

ジョブ投入スクリプトの中で“#SBATCH”で始まる行にsbatch オプションを記述すると、処理方法を指定することができます。

▲このページの先頭へ

4.4.2. sbatch オプション

主なsbatch オプションを次に示します。
表 4.4.2 sbatch オプション

ジョブ投入スクリプトのディレクティブ #SBATCH
キュー(パーティション)指定 -p [queue]
実行ノード数(並列数の指定) -N [minnodes[-maxnodes]], --nodes=[minnodes[-maxnodes]]
CPU 数の指定(プロセス数の指定) -n [number], --ntasks=[number]
実行時間の上限指定(wall time) -t [minutes], --time=[minutes]
-t [minutes:seconds], --time=[minutes:seconds]
-t [hours:minutes:seconds], --time=[hours:minutes:seconds]
-t [days-hours], --time=[days-hours]
-t [days-hours:minutes], --time=[days-hours:minutes]
-t [days-hours:minutes:seconds], --time=[days-hours:minutes:seconds]
出力ファイル指定 -o [filename], --output=[filename]
エラー出力指定 -e [filename], --error=[filename]
出力・エラー出力の総合出力 -e 指定無しで-o を使用)
イベント通知 --mail-type=[type]

※type はBEGIN, END, FAIL, REQUEUE, ALL のいずれか

メールアドレス指定 --mail-user=[address]
ジョブ再投入 --requeue または --no-requeue(未指定時は--no-requeue
実行ディレクトリ指定 --workdir=[dir_name]
メモリサイズ指定 --mem=[mem][M|G|T] OR --mem-per-cpu=[mem][M|G|T]
ノード当たりのタスク数指定 --ntasks-per-node=[count]
タスク当たりのCPU数指定 --cpus-per-task=[count]
依存ジョブ --dependency=[type:job_id]

type には次の依存タイプを指定できます。
after 指定したジョブが開始された後に、このジョブが実行されます。
afterany 指定したジョブが終了した後に、このジョブが実行されます。
afternotok 指定したジョブが異常終了した後に、このジョブが実行されます。
afterok 指定したジョブが正常終了した後に、このジョブが実行されます。
同じ依存タイプに複数のジョブID を紐付ける場合は、コロン(:)で区切ります。
#SBATCH --dependency=type:job_id: job_id
複数の依存関係(依存タイプとジョブID の組み合わせ)を指定する場合は、依存関係の間をカンマ(,)で区切ります。
#SBATCH --dependency=type:job_id,type:job_id

ジョブのプロジェクト化 --wckey=[name]
ジョブ実行ホストの詳細 --nodelist=[nodes] AND/OR --exclude=[nodes]
アレイジョブ --array=[array_spec]
開始時間指定 --begin=YYYY-MM-DD[THH:MM[:SS]]

▲このページの先頭へ

4.4.3. 環境変数

sbatchコマンド実行時、ジョブ実行時に環境変数が設定されます。設定される主な環境変数を示します。
表 4.4.3 環境変数

環境変数 内容
SLURM_JOB_CPUS_PER_NODE ジョブ実行に使用されるホストとプロセス数のリスト
SLURM_JOB_ID ジョブID
SLURM_JOB_NAME fjsub –Nsbatch -J で指定したジョブ名。ジョブ名を指定していない場合は、実際に指定されたコマンド列が格納されます。
SLURM_JOB_NODELIST ジョブが実行されるホスト名のリスト
SLURM_NTASKS sbatch –n(または ––ntasks)で指定したプロセス数
SLURM_SUBMIT_DIR ジョブ が投入されたカレントディレクトリ

▲このページの先頭へ

4.4.4. 逐次ジョブを実行する場合

逐次(並列計算を行わない方式)で実行する時に作成するジョブ投入スクリプトの例を示します。

#!/bin/bash
#SBATCH -p d006m ・・・・・・・・・・ (1)
#SBATCH -n 1 ・・・・・・・・・・ (2)
#SBATCH -J test_serial ・・・・・・・・・・ (3)
#SBATCH -o stdout.%J ・・・・・・・・・・ (4)
#SBATCH -e stderr.%J ・・・・・・・・・・ (5)
./a.out ・・・・・・・・・・ (6) 

(1) パーティション名(キュー名)を指定します。
(2) ジョブで使用するプロセス数(-n もしくは--ntasks=)を指定します。
逐次ジョブの場合、プロセス数は1 となりますので、指定値は“-n 1”を指定します。
(3) ジョブ名を指定します。
(4) 標準出力ファイルを指定します。%J はジョブID に変換されます。
(5) 標準エラー出力ファイルを指定します。%J はジョブID に変換されます。
(6) プログラム(a.out)を実行します。

▲このページの先頭へ

4.4.5. スレッド並列ジョブを実行する場合

スレッド並列(単体ノードで並列計算を行う方式)でジョブを実行する時に作成するジョブ投入スクリプトの例を示します。

#!/bin/bash
#SBATCH -p d006m ・・・・・・・・・・ (1)
#SBATCH -n 1 ・・・・・・・・・・ (2)
#SBATCH -c 20 ・・・・・・・・・・ (3)
#SBATCH -J test_openmp ・・・・・・・・・・ (4)
#SBATCH -o stdout.%J ・・・・・・・・・・ (5)
#SBATCH -e stderr.%J ・・・・・・・・・・ (6)
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} ・・・・・・・・・・ (7)
./a.out ・・・・・・・・・・ (8)
RETCODE=$?
exit ${RETCODE} ・・・・・・・・・・ (9)

(1) パーティション名(キュー名)を指定します。
(2) ジョブで使用するプロセス数(-n もしくは--ntasks=)を指定します。
上記の例では、1 プロセスで実行するために-n 1 を指定しています。
(3) ジョブで使用するCPU数(-cもしくは--cpus-per-task=)を指定します。
上記の例では、20スレッドで実行するために-c 20を指定しています。
(4) ジョブ名を指定します。
(5) 標準出力ファイルを指定します。%J はジョブID に変換されます。
(6) 標準エラー出力ファイルを指定します。%J はジョブID に変換されます。
(7) 環境変数 OMP_NUM_THREADS にスレッド数を指定します。
(8) プログラム(a.out)を実行します。
(9) プログラムの戻り値をSLURM に戻します。

▲このページの先頭へ

4.4.6. MPI プログラム(openMPI)を実行する場合

プロセス並列(複数のノードで並列計算を行う方式)のジョブをOpenMPI で実行する時に作成するジョブ投入スクリプトの例を示します。

下記スクリプトでは、Dシステムにて2ノード(1ノードあたり2プロセス)のジョブが生成されます。

#!/bin/bash
#SBATCH -p d006m ・・・・・・・・・・ (1)
#SBATCH -n 40 ・・・・・・・・・・ (2)
#SBATCH -J test_openmpi ・・・・・・・・・・ (3)
#SBATCH -o stdout.%J.log ・・・・・・・・・・ (4)
#SBATCH -e stderr.%J.log ・・・・・・・・・・ (5)
module load MPI-openmpi-2.1.3+gnu-4.4.7 ・・・・・・・・・・ (6)
mpirun -np ${SLURM_NTASKS} ./a.out ・・・・・・・・・・ (7)
RETCODE=$?
exit ${RETCODE} ・・・・・・・・・・ (8)

(1) パーティション名(キュー名)を指定します。
(2) ジョブで使用するプロセス数(-n もしくは--ntasks=)を指定します。
(3) ジョブ名を指定します。
(4) 標準出力ファイルを指定します。%J はジョブID に変換されます。
(5) 標準エラー出力ファイルを指定します。%J はジョブID に変換されます。
(6) MPI 環境変数をセットします。
(7) プログラム(a.out)を実行します。
(8) プログラムの戻り値をSLURM に戻します。

 

上記(6)については、次の実行方法があります。

コンパイラ MPI 環境設定コマンド
標準GNU (GNU 4.4.7) OpenMPI module load MPI-openmpi-2.1.3+gnu-4.4.7
GNU6.3.0 OpenMPI module load PrgEnv-gnu-6.3.0
module load MPI-openmpi-2.1.1+gnu-6.3.0
Intel OpenMPI module load PrgEnv-intel-17.0.1.132
module load MPI-openmpi-2.1.3+intel-17.0.1.132
IntelMPI module load PrgEnv-intel-18.0.3.222
module load MPI-impi-18.3.222

▲このページの先頭へ

4.4.7. MPI プログラム(Intel MPI)を実行する場合

プロセス並列(複数のノードで並列計算を行う方式)のジョブをIntelMPI で実行する時に作成するジョブ投入スクリプトの例を示します。

#!/bin/bash
#SBATCH -p d006m
#SBATCH -n 40
#SBATCH -J test_intelmpi
#SBATCH -o stdout.%J.log
#SBATCH -e stderr.%J.log
module load PrgEnv-intel-18.0.3.222
module load MPI-impi-18.3.222
NODEFILE=`generate_pbs_nodefile`
mpirun -np ${SLURM_NTASKS} ./a.out

(注) インテルコンパイラで作成された実行ファイルを実行する場合、ジョブ投入スクリプト内に

module load PrgEnv-intel-18.0.3.222
module load MPI-impi-18.3.222

の行を記載する必要があります。

▲このページの先頭へ

4.4.8. MPI プログラム(mpich2)を実行する場合

現在MPICH2環境のmoduleは提供していません。

▲このページの先頭へ