user/pages/07.run/01.batch/docs.ja.md
452be89a
 ---
 title: バッチ処理
 ---
 
 [toc]
 
 ## ジョブ実行の流れ{#execute_flow}
 1. [ジョブスクリプトの作成](#jobscript)
 2. [ジョブの投入](#submit)
 3. (必要であれば)[ジョブの状態の確認](#squeue)
 4. (必要であれば)[ジョブのキャンセル](#scancel)
 
 ## ジョブスクリプト{#jobscript}
 ジョブスクリプトは、原則的にシェルスクリプトと同じ形式です。
 ジョブスクリプトはSlurmのジョブ投入オプションを記述したオプション領域と、実行するプログラムを記述したユーザプログラム領域から構成されます。
 ジョブ実行時に自動的に設定される環境変数については[こちら](/run/tips#env_val)をご参照ください。
 
 ### 4プロセスx 8スレッドのハイブリッド並列の例
 
 ジョブスクリプトの一例を以下に示しますので、まずはスクリプトの内容を見て全体像を把握してください。
 次節以降に、それぞれのより詳細な情報を記載しています。
 
 ```nohighlight
 #!/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のオプション指定として認識されます。
 # ジョブ実行時のカレントディレクトリは、ジョブ投入時のカレントディレクトリに自動で移動します。
 # ジョブ投入時に設定されている環境変数は、ジョブ実行時に継承されます。
 ```
 
 ### サンプルスクリプト
 ジョブスクリプトのサンプルを公開していますので、参考にしてください。
 
 | 実行種別                  | サンプルファイル|
 | ------------------------- | --------------- |
 | 逐次実行                  | [ダウンロード](./sample_normal.txt)
 | スレッド並列              | [ダウンロード](./sample_thread.txt)
 | プロセス並列(Intel MPI)   | [ダウンロード](./sample_process.txt)
 | ハイブリッド並列          | [ダウンロード](./sample_hybrid.txt)
 
 ### Slurmオプション
 ジョブスクリプトの Slurm Options の部分で「#SBATCH」に続けて指定します。
 #### 主要なオプション
 | オプション | 意味 | 指定例 |
 | --- | --- | --- |
 | -p _QUEUE_ | キューの指定 **(必須項目)** | -p gr19999b |
 | -t _HOUR:MINUTES:SECONDS_ |  実行時間の上限設定 | -t 24:0:0 |
 | --rsc p=_PROCS_:t=_THREADS_:c=_CORES_:m=_MEMORY_ <br> or <br> --rsc g=_GPU_ | リソースの指定。詳細は[こちら](/run/resource#resource) | --rsc p=4:t=8:c=8:m=8G <br> or <br> --rsc g=1 | 
 | -o _FILENAME_ | 標準出力の保存先の指定。指定可能な特殊文字は[公式マニュアル](https://slurm.schedmd.com/sbatch.html#SECTION_%3CB%3Efilename-pattern%3C/B%3E)を参照。| -o result.out |
 | -e _FILENAME_ | 標準エラー出力の保存先の指定。指定可能な特殊文字は[公式マニュアル](https://slurm.schedmd.com/sbatch.html#SECTION_%3CB%3Efilename-pattern%3C/B%3E)を参照。| -e result.err |
 | -J _JOBNAME_ | ジョブ名の指定。<br>指定しない場合は、ジョブスクリプト名がジョブ名になります。 | -J ReplaceJobName |
 | --comment=_Comment_ | コメントの指定 | --comment=ThisIsComment |
 | -a _ARRAY\_SPEC_ | アレイジョブの指定。詳しくは[こちら](/run/tips/#arrayjob) | -a 1-5 |
 | -d _TYPE:JOBID_ | ジョブの実行順序の指定。詳しくは[こちら](/run/tips/#dependency) | -d afterok:999999 |
 | --no-requeue | 障害発生時のジョブ再実行の禁止を指定 | --no-requeue |
 | --mail-user=_MAILADDR_ | メールアドレスの指定 | --mail-user=bar@sample.com |
 | --mail-type=_TYPE_ | イベント通知の指定<br>BEGIN, END, FAIL, REQUEUE, ALLを必要に応じて指定 | --mail-type=BEGIN,END |
 
 その他のオプションや、オプションの詳細は [公式マニュアル](https://slurm.schedmd.com/sbatch.html) をご参照ください。
 また、[ジョブ投入する際に使用できないオプション](/run/tips#sbatch_ignore)についても、必要に応じてご確認ください。
 
 ### プログラムの実行方法(重要){#srun}
 プログラムを計算ノード上で動作させるためには、逐次プログラム、MPIプログラムに関わらず、ジョブスクリプトのプログラムを
 実行する箇所に **必ず**  _**srun**_ コマンドを使用する必要があります。
 
 srunコマンドのオプションのうち、代表的なものを以下に示します。
 その他のオプションや、オプションの詳細は、[公式マニュアル](https://slurm.schedmd.com/srun.html#SECTION_OPTIONS)をご参照下さい。
 
 #### **基本オプション** {#basic_options}
 
 オプション         |機能
     :--------------------:|-----------------------
1b0aeb6a
          -n _PROCS_      |  起動するプロセス数を指定する。指定がない場合は、--rscオプションの pの値が使用されます。
          -c _CORES_      |  プロセスあたり確保するCPUコア数を指定する。指定がない場合は、--rscオプションの cの値が使用されます。
452be89a
      --ntasks-per-node=_PROCS\_PER\_NODE_ |    ノードあたりのプロセス数を指定する。他のパラメータと合わせて、ノード当たりのプロセス数を制御したい場合に使用して下さい。
 
 
 ## 使用可能なキューの確認{#queue}
 投入可能なジョブのキューを確認するためには、spartitionコマンドを使用します。
 
 ### spartitionコマンド{#spartition}
 投入可能なジョブのキュー名、Rmin/Rstd/Rmax、経過時間の標準値/上限値を表示します。Rmin/Rstd/Rmaxについては、[こちら](/run/resource#resources) をご参照ください。
 
 ```nohighlight
 $ spartition
 Partition  State   Rmin  Rstd  Rmax    DefTime     MaxTime
 gr19999g   UP         0    64    64   01:00:00  1-00:00:00
 ```
 
 ## ジョブの投入{#submit}
 
 キューにジョブを投入するためには、sbatchコマンドを使用します。
 
 ### sbatchコマンド{#sbatch}
 
 ```nohighlight
 $ sbatch sample.sh
 Submitted batch job 20
 ```
 * 作成したジョブスクリプトファイルを、コマンドの最後に続けて入力します
 * ジョブスクリプトの実行がシステムに依頼され、ジョブIDが表示されます
 * ジョブ投入時にオプションを指定した場合、ジョブスクリプト内のオプションは上書きされます
 
 #### ジョブ投入時メッセージ{#message}
 ```nohighlight
 $ 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}
 投入したジョブの情報を表示するためには、squeueコマンドもしくはsacctコマンドを使用します。
 
 ### squeueコマンド
 
 現在キューに登録されているジョブの情報を表示します。
 
 ```nohighlight
 $ squeue
 JOBID PARTITION     NAME     USER ST   TIME  NODES NODELIST(REASON)
     1  gr19999b interact   b59999  R   0:33      1 no0001
 ```
 * ジョブ実行中のみ情報が表示されます。
 * オプションについては、[公式マニュアル](https://slurm.schedmd.com/squeue.html#SECTION_OPTIONS)をご参照下さい。
 
 #### ジョブ実行に関する備考(REASON)
 ジョブが実行待ち状態の場合は、NODELIST(REASON)にその理由が表示されています。
 代表的なものを以下に示します。
 その他の理由については、[公式マニュアル](https://slurm.schedmd.com/squeue.html#SECTION_JOB-REASON-CODES)
 をご参照下さい。
 
 | REASON | 意味 |
 | ------ | -----|
 | Resources | 現在空きリソースがありません |
 | QOSJobLimit | 同時実行可能数の上限に達しています|
 
 ### sacctコマンド
 
 アカウンティングデータベースにあるジョブの情報を表示します。過去のジョブの情報も表示することができます。
 システムへの負荷が高いコマンドであるため、機械的な繰り返しの実行は控えてください。
 
 ```nohighlight
 $ 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 |
 その他のオプションは、[公式マニュアル](https://slurm.schedmd.com/sacct.html#SECTION_OPTIONS)をご参照下さい。
 
 ## ジョブのキャンセル{#jobcancel}
 投入したジョブをキャンセルするためには、scancelコマンドを使用します。
 
 ### scancel コマンド{#scancel}
 
 ```nohighlight
 $ scancel 20
 ```
 * ジョブIDを引数に指定します。
 * オプションは、[公式マニュアル](https://slurm.schedmd.com/scancel.html#SECTION_OPTIONS)をご参照下さい。
 
 ### 投入したジョブを全てキャンセルする方法
 投入したすべてのジョブをキャンセルする場合は、以下の方法でキャンセルすることができます
 ```nohighlight
 ## ユーザ名を指定して削除する場合
 $ scancel -u b59999
 
 ## キュー名を指定して削除する場合
 $ scancel -p gr19999b
 
 ## 実行中のステータスを指定して削除する場合
 $ scancel -t pending 
 ```