ジョブスクリプトは、原則的にシェルスクリプトと同じ形式です。 ジョブスクリプトはSlurmのジョブ投入オプションを記述したオプション領域と、実行するプログラムを記述したユーザプログラム領域から構成されます。 ジョブ実行時に自動的に設定される環境変数についてはこちらをご参照ください。
ジョブスクリプトの一例を以下に示しますので、まずはスクリプトの内容を見て全体像を把握してください。 次節以降に、それぞれのより詳細な情報を記載しています。
#!/bin/bash
#============ Slurm Options ===========
#SBATCH -p gr19999b # ジョブキュー(パーティション)の指定。投入したいキュー名に適宜変更が必要。
#SBATCH -t 1:00:00 # 経過時間の指定(1時間を指定する例)。
#SBATCH --rsc p=4:t=8:c=8:m=8G # 要求リソースの指定(4プロセスx8スレッドのハイブリッド並列の例)。
#SBATCH -o %x.%j.out # ジョブの標準出力ファイルの指定。%xはジョブ名、%j はジョブIDに置換されます。
#============ Shell Script ============
# (任意) set -x を指定するとジョブスクリプトの実行経過を把握しやすくなります。
set -x
# (任意) ログインシェルがbashではない場合かつ、moduleコマンドを使用する場合は下記コマンドを記載してください。
. /usr/share/Modules/init/bash
# MPIのプロセス数やOMP_NUM_THREADS等の環境変数は--rscオプションの値を元に自動で設定されます。
# 必要に応じてsrun コマンドの引数や環境変数により確保したリソースの範囲で上書き指定が可能です。
srun ./a.out
## ジョブスクリプトに関する補足 ##
# 「#」で始まる行あるいは、行中の「#」以降は、コメントとして扱われます。#SBATCH で始まる行のみ例外的にslurmのオプション指定として認識されます。
# ジョブ実行時のカレントディレクトリは、ジョブ投入時のカレントディレクトリに自動で移動します。
# ジョブ投入時に設定されている環境変数は、ジョブ実行時に継承されます。
ジョブスクリプトのサンプルを公開していますので、参考にしてください。
実行種別 | サンプルファイル |
---|---|
逐次実行 | ダウンロード |
スレッド並列 | ダウンロード |
プロセス並列(Intel MPI) | ダウンロード |
ハイブリッド並列 | ダウンロード |
ジョブスクリプトの Slurm Options の部分で「#SBATCH」に続けて指定します。
オプション | 意味 | 指定例 |
---|---|---|
-p QUEUE | キューの指定 (必須項目) | -p gr19999b |
-t HOUR:MINUTES:SECONDS | 実行時間の上限設定 | -t 24:0:0 |
--rsc p=PROCS:t=THREADS:c=CORES:m=MEMORY or --rsc g=GPU |
リソースの指定。詳細はこちら | --rsc p=4:t=8:c=8:m=8G or --rsc g=1 |
-o FILENAME | 標準出力の保存先の指定。指定可能な特殊文字は公式マニュアルを参照。 | -o result.out |
-e FILENAME | 標準エラー出力の保存先の指定。指定可能な特殊文字は公式マニュアルを参照。 | -e result.err |
-J JOBNAME | ジョブ名の指定。 指定しない場合は、ジョブスクリプト名がジョブ名になります。 |
-J ReplaceJobName |
--comment=Comment | コメントの指定 | --comment=ThisIsComment |
-a ARRAY_SPEC | アレイジョブの指定。詳しくはこちら | -a 1-5 |
-d TYPE:JOBID | ジョブの実行順序の指定。詳しくはこちら | -d afterok:999999 |
--no-requeue | 障害発生時のジョブ再実行の禁止を指定 | --no-requeue |
--mail-user=MAILADDR | メールアドレスの指定 | --mail-user=bar@sample.com |
--mail-type=TYPE | イベント通知の指定 BEGIN, END, FAIL, REQUEUE, ALLを必要に応じて指定 |
--mail-type=BEGIN,END |
その他のオプションや、オプションの詳細は 公式マニュアル をご参照ください。 また、ジョブ投入する際に使用できないオプションについても、必要に応じてご確認ください。
プログラムを計算ノード上で動作させるためには、逐次プログラム、MPIプログラムに関わらず、ジョブスクリプトのプログラムを 実行する箇所に 必ず srun コマンドを使用する必要があります。
srunコマンドのオプションのうち、代表的なものを以下に示します。 その他のオプションや、オプションの詳細は、公式マニュアルをご参照下さい。
オプション | 機能 |
---|---|
-n PROCS | 起動するプロセス数を指定する。指定がない場合は、--rscオプションの pの値が使用されます。 |
-c CORES | プロセスあたり確保するCPUコア数を指定する。指定がない場合は、--rscオプションの cの値が使用されます。 |
--ntasks-per-node=PROCS_PER_NODE | ノードあたりのプロセス数を指定する。他のパラメータと合わせて、ノード当たりのプロセス数を制御したい場合に使用して下さい。 |
投入可能なジョブのキューを確認するためには、spartitionコマンドを使用します。
投入可能なジョブのキュー名、Rmin/Rstd/Rmax、経過時間の標準値/上限値を表示します。Rmin/Rstd/Rmaxについては、こちら をご参照ください。
$ spartition
Partition State Rmin Rstd Rmax DefTime MaxTime
gr19999g UP 0 64 64 01:00:00 1-00:00:00
キューにジョブを投入するためには、sbatchコマンドを使用します。
$ sbatch sample.sh
Submitted batch job 20
$ sbatch sample.sh
sbatch: cli_filter/accms_resource_req: convert_rsc_option: Updated the number of cores from c=10 to c=40 based on memory size request
Submitted batch job 21
上記のメッセージは、要求されたメモリサイズに基づき、コア数を変更したというメッセージです。エラーではないので、ジョブは投入されます。
投入したジョブの情報を表示するためには、squeueコマンド、sacct、qsコマンドコマンドを使用します。
現在キューに登録されているジョブの情報を表示します。
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
1 gr19999b interact b59999 R 0:33 1 no0001
ジョブが実行待ち状態の場合は、NODELIST(REASON)にその理由が表示されています。 代表的なものを以下に示します。 その他の理由については、公式マニュアル をご参照下さい。
REASON | 意味 |
---|---|
Resources ResourceAvailability |
現在空きリソースがありません |
QOSJobLimit | 同時実行可能数の上限に達しています |
アカウンティングデータベースにあるジョブの情報を表示します。過去のジョブの情報も表示することができます。 システムへの負荷が高いコマンドであるため、機械的な繰り返しの実行は控えてください。
$ sacct -X
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1 test.sh gr19999b b59999 8 COMPLETED 0:0
2 test.sh gr19999b b59999 8 COMPLETED 0:0
オプション | 意味 | 指定例 |
---|---|---|
-j | 指定したジョブの統計情報を表示する。 | sacct -j 1234556 |
-X | ジョブステップを考慮せず、ジョブの割り当て自体に関連する統計のみを表示する | sacct -X |
-l | ジョブに関するすべての情報を表示する。 | sacct -l / sacct -Xl |
-S | 指定した時刻以降のジョブを表示する。 | sacct -S 2022-10-01 |
その他のオプションは、公式マニュアルをご参照下さい。
ジョブの情報を表示します。
$ qs
QUEUE USER JOBID STATUS PROC CORE MEM ELAPSE( limit)
gr19999b b59999 1 RUN 4 1 4570M 00:00:07( 01:00:00)
ヘッダ | 概要 |
---|---|
QUEUE | キュー名 |
USER | ユーザ名 |
JOBID | ジョブID |
STATUS | ジョブの状態 |
PROC | プロセス数 |
CORE | プロセスあたりのコア数 |
MEM | プロセスあたりのメモリ量 |
ELAPSE | ジョブの経過時間 |
limit | ジョブの経過時間の制限値 |
グループのキューの状況を確認するためには、qgroupコマンドを使用します。
グループのキュー全体の情報、利用者ごとの統計情報を表示します。
$ qgroup
QUEUE SYS | RUN PEND OTHER | ALLOC ( MIN/ STD/ MAX)
----------------------------------------------------------------
gr19999b B | 0 0 0 | 0 ( 0/224/224)
QUEUE USER | RUN(ALLOC) PEND(REQUEST) OTHER(REQUEST)
----------------------------------------------------------------
gr19999b b59999 | 1( 4) 0( 0) 0( 0)
-l オプションを指定すると、グループのキュー全体の情報、利用者ごとの統計情報に加えて、ジョブごとの情報が表示されます。
$ qgroup -l
QUEUE SYS | RUN PEND OTHER | ALLOC ( MIN/ STD/ MAX)
----------------------------------------------------------------
gr19999b B | 0 0 0 | 0 ( 0/224/224)
QUEUE USER | RUN(ALLOC) PEND(REQUEST) OTHER(REQUEST)
----------------------------------------------------------------
gr19999b b59999 | 1( 4) 0( 0) 0( 0)
QUEUE USER JOBID | STAT SUBMIT_AT | RSC:core | PROC CORE MEM ELAPSE
------------------------------------------------------------------------------------------------
gr19999b b59999 1 | RUN 2024-06-06 16:51 | 4 | 4 1 4570M 01:00:00
ヘッダ | 概要 |
---|---|
QUEUE | キュー名 |
SYS | システム名 |
RUN,PEND,OTHER | ジョブの本数 |
ALLOC | 割り当てコア数 |
MIN | キューの最低保証コア数 |
STD | キューの標準コア数 |
MAX | キューの最大コア数 |
ヘッダ | 概要 |
---|---|
RUN(ALLOC) | 実行中のジョブ数と割り当て資源量(コア数換算) |
PEND(REQUEST) | 実行待ちのジョブ数と要求資源量(コア数換算) |
OTHER(REQUEST) | 上記以外の状態のジョブ数と要求資源量(コア数換算) |
ヘッダ | 概要 |
---|---|
STAT | ジョブの状態 |
SUBMIT_AT | ジョブの投入日時 |
RSC:core | 資源量(コア数換算) |
PROC | プロセス数 |
CORE | プロセスあたりのコア数 |
MEM | プロセスあたりのメモリ量 |
ELAPSE | ジョブの経過時間の制限値 |
投入したジョブをキャンセルするためには、scancelコマンドを使用します。
$ scancel 20
投入したすべてのジョブをキャンセルする場合は、以下の方法でキャンセルすることができます
## ユーザ名を指定して削除する場合
$ scancel -u b59999
## キュー名を指定して削除する場合
$ scancel -p gr19999b
## 実行中のステータスを指定して削除する場合
$ scancel -t pending