目次 (4.4.ジョブ投入スクリプトの作成)
4.4 ジョブ投入スクリプトの作成
ジョブ投入のためのジョブ投入スクリプトを作成します。
4.4.1. 処理方法の指定
ジョブ投入スクリプトの中で “#SBATCH”
ディレクティブで始まる行に sbatch
オプションを記述すると、処理方法を指定することができます。
4.4.2. sbatch オプション
主な sbatch
オプションを次に示します。
Table 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 には次の依存タイプを指定できます。 |
ジョブのプロジェクト化 | --wckey=[name] |
ジョブ実行ホストの詳細 | --nodelist=[nodes] AND/OR --exclude=[nodes] |
アレイジョブ | --array=[array_spec] |
開始時間指定 | --begin=YYYY-MM-DD[THH:MM[:SS]] |
4.4.3. 環境変数
sbatch
コマンド実行時、ジョブ実行時に環境変数が設定されます。設定される主な環境変数を示します。
Table 4.4.3.: 環境変数
環境変数 | 内容 |
---|---|
SLURM_JOB_CPUS_PER_NODE |
ジョブ実行に使用されるホストとプロセス数のリスト |
SLURM_JOB_ID |
ジョブID |
SLURM_JOB_NAME |
sbatch -J で指定したジョブ名。ジョブ名を指定していない場合は、実際に指定されたコマンド列が格納されます。 |
SLURM_JOB_NODELIST |
ジョブが実行されるホスト名のリスト |
SLURM_NTASKS |
sbatch –n (または ––ntasks )で指定したプロセス数 |
SLURM_SUBMIT_DIR |
ジョブが投入されたカレントディレクトリ |
4.4.4. 逐次ジョブを実行する場合
逐次(並列計算を行わない方式)で実行する時に作成するジョブ投入スクリプトの例を示します。
#!/bin/bash
#SBATCH -p z006m ・・・・・・・・・・ (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 z006m ・・・・・・・・・・ (1)
#SBATCH -n 1 ・・・・・・・・・・ (2)
#SBATCH -c 40 ・・・・・・・・・・ (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=
)を指定します。
上記の例では、40スレッドで実行するために-c 40
を指定しています。 - (4) ジョブ名を指定します。
- (5) 標準出力ファイルを指定します。
%J
はジョブID に変換されます。 - (6) 標準エラー出力ファイルを指定します。
%J
はジョブID に変換されます。 - (7) 環境変数
OMP_NUM_THREADS
にスレッド数を指定します。 - (8) プログラム(a.out)を実行します。
- (9) プログラムの戻り値をSLURM に戻します。
4.4.6. MPI プログラム(Open MPI)を実行する場合
プロセス並列(複数のノードで並列計算を行う方式)のジョブをOpen MPI で実行する時に作成するジョブ投入スクリプトの例を示します。
下記スクリプトでは、Zシステムにて2ノード(1ノードあたり40プロセス)のジョブが生成されます。
#!/bin/bash
#SBATCH -p z006m ・・・・・・・・・・ (1)
#SBATCH -n 80 ・・・・・・・・・・ (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.8.5 ・・・・・・・・・・ (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.8.5) | OpenMPI | module load MPI-openmpi-4.1.0+gnu-4.8.5 |
GNU 10.3.0 | OpenMPI | module load PrgEnv-gnu-10.3.0 module load MPI-openmpi-4.1.0+gnu-10.3.0 |
Intel | Intel MPI | source /home1/share/x86_64/el8/intel/oneapi-2024.1.0/setvars.sh |
4.4.7. MPI プログラム(Intel MPI)を実行する場合
プロセス並列(複数のノードで並列計算を行う方式)のジョブをIntel MPI で実行する時に作成するジョブ投入スクリプトの例を示します。
#!/bin/bash
#SBATCH -p z006m
#SBATCH -n 40
#SBATCH -J test_intelmpi
#SBATCH -o stdout.%J.log
#SBATCH -e stderr.%J.log
source /home1/share/x86_64/el8/intel/oneapi-2024.1.0/setvars.sh
NODEFILE=generate_pbs_nodefile
mpirun -np ${SLURM_NTASKS} ./a.out
(注) インテル oneAPI で作成された実行ファイルを実行する場合、ジョブ投入スクリプト内に
source /home1/share/x86_64/el8/intel/oneapi-2024.1.0/setvars.sh
の行を記載する必要があります。
4.4.8. MPI プログラム(mpich2)を実行する場合
現在MPICH2環境のmoduleは提供していません。