バッチ処理

  1. ジョブスクリプトの作成
  2. ジョブの投入
  3. (必要であれば)ジョブの状態の確認
  4. (必要であれば)ジョブのキャンセル

ジョブスクリプトは、原則的にシェルスクリプトと同じ形式です。 ジョブスクリプトは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

# 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
  • 作成したジョブスクリプトファイルを、コマンドの最後に続けて入力します
  • ジョブスクリプトの実行がシステムに依頼され、ジョブIDが表示されます
  • ジョブ投入時にオプションを指定した場合、ジョブスクリプト内のオプションは上書きされます

$ 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コマンドを使用します。

現在キューに登録されているジョブの情報を表示します。

$ squeue
JOBID PARTITION     NAME     USER ST   TIME  NODES NODELIST(REASON)
    1  gr19999b interact   b59999  R   0:33      1 no0001
  • ジョブ実行中のみ情報が表示されます。
  • オプションについては、公式マニュアルをご参照下さい。

ジョブが実行待ち状態の場合は、NODELIST(REASON)にその理由が表示されています。 代表的なものを以下に示します。 その他の理由については、公式マニュアル をご参照下さい。

REASON 意味
Resources 現在空きリソースがありません
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

その他のオプションは、公式マニュアルをご参照下さい。

投入したジョブをキャンセルするためには、scancelコマンドを使用します。

$ scancel 20
  • ジョブIDを引数に指定します。
  • オプションは、公式マニュアルをご参照下さい。

投入したすべてのジョブをキャンセルする場合は、以下の方法でキャンセルすることができます

## ユーザ名を指定して削除する場合
$ scancel -u b59999

## キュー名を指定して削除する場合
$ scancel -p gr19999b

## 実行中のステータスを指定して削除する場合
$ scancel -t pending