基本的な利用方法¶
ジョブの投入(sbatch)¶
ジョブの投入は、実行したいコマンドをシェルスクリプト内に記述し、sbatch
コマンドで投入します。例えば、testcom.sh
というシェルスクリプトを作成した場合は、以下のように実行します。
$ sbatch testcom.sh
Subimitted batch job 461
オプションを指定しなかった場合は、
ジョブはデフォルトパーティションである
mjobs
に投入されます。カレントディレクトリは
sbatch
を実行した ディレクトリとなります。シェルスクリプトの標準出力と標準エラー出力は、カレントディレクトリに1つのファイルとして出力されます(デフォルトのファイル名:
slurm-ジョブID.out
)。
sbatchのオプション¶
sbatch
の主なオプションは以下のとおりです。
- -J <jobname>¶
ジョブ名に
jobname
を指定します
- -o <path>¶
ジョブの標準出力の出力先を指定します
%j
などの文字列を含めることで、ジョブIDなどをファイル名として使うことができます(後述)。
- -e <path>¶
ジョブの標準エラー出力の出力先を指定します
- -c <ncore>¶
ジョブに対し
ncore
CPUコアを確保します
- --mem-per-cpu=<size>[units]¶
1CPUコアあたりに確保するメモリ量を指定します
units
を省略した場合、単位はMBです。また、units
にはKB
,MB
,GB
などが指定できます。
- --gpus=<num>¶
GPUボードを
num
枚確保します
- -p <partition>¶
ジョブを投入するパーティションを指定します
%j
ジョブID
%a
アレイジョブのID
%J
%j.%a
と同じ%x
ジョブ名
%u
ユーザー名
%%
%
に置き換えられる
オプション指定例 |
説明 |
---|---|
-J new_jobname |
ジョブ名にnew_jobnameを設定 |
-o /home/user/%x-%j.out |
/home/user/ジョブ名-ジョブID.outに標準出力を出力 |
-e /home/user/%x-%j.err |
/home/user/ジョブ名-ジョブID.errに標準エラー出力を出力 |
-c 2 |
ジョブで2CPUコアを確保 |
--mem-per-cpu=4096 |
1CPUコアあたり4096MBのメモリを確保 |
--gpus=1 |
GPUボードを1枚利用 |
-p sjobs |
sjobsにジョブを投入 |
-a 0-2:1 |
アレイジョブのタスクIDを、0から2まで、1刻みに設定 |
-d afterok:ジョブID |
ジョブIDで指定したジョブが正常終了した後にジョブを実行開始 |
sbatchのオプション指定方法¶
sbatch
コマンドにオプションを与える代わりに、Slurmのジョブとして実行するシェルスクリプトの中にオプションを記述することもできます。
シェルスクリプト内で、キーワード#SBATCH
に続けて記載します。
#!/bin/sh
#SBATCH -o /home/group/user/results/%x-%j.out
pwd # print current directory
date # print date
sleep 20 # sleep 20 seconds
date # print date
#SBATCH
はシバンと最初のコマンドの間に記述する必要があります。
オプションとして指定する文字列が⻑い場合、上記例のように、シェルスクリプト中にsbatch
コマンドへ渡すオプションを記載すると便利です。また、パーティションやリソースの設定を予め記述しておくことで、ジョブ投入時の指定ミスを減らすことができます。
ヒント
シェルスクリプト内とsbatch
コマンド実行時で同じオプションが指定された場合は、コマンドで指定した値が使われます。
リソースの要求¶
ジョブが使用するCPUコア数を指定する場合、-c
オプションに続けて使用するCPUコア数を指定します。
$ sbatch -c 3 testcom.sh
警告
リソース上限を超えたCPUコア数を指定すると、ジョブの状態はPDから遷移しません。
ジョブが使用するメモリ量を指定する場合、--mem-per-cpu
に続けて各CPUコアが使用するメモリ量を指定します。
$ sbatch --mem-per-cpu=4G testcom.sh
次の例では、ジョブが要求するメモリ量は12GBになります。
$ sbatch -c 3 --mem-per-cpu=4G testcom.sh
警告
リソース上限を超えたメモリ量を指定すると、ジョブの投入に失敗します。
Slurmの環境変数¶
ジョブIDなどの情報が環境変数としてジョブの実行環境に設定されます。これにより、割り当てられたCPUコア数などを実行時にスクリプト等から参照することができます。
SLURM_CPUS_PER_TASK |
|
SLURM_GPUS |
|
SLURM_JOB_ID |
ジョブID |
SLURM_JOB_DEPENDENCY |
|
SLURM_JOB_NAME |
ジョブ名 |
SLURM_JOB_PARTITION |
パーティション名 |
SLURM_MEM_PER_CPU |
|
ヒント
アレイジョブに追加される変数についてはアレイジョブを参照してください。
MPIノード間通信¶
スクリプト内でmpirunを実行する前にmodule loadコマンドでopenmpiをロードすると、sbatchのスクリプト内でOpenMPIのmpirunを実行することができます。
#!/bin/bash
#SBATCH --nodes=2
#SBATCH --ntasks=4
module load openmpi/4.0.7
mpirun <実行コマンド>
ジョブの確認¶
実メモリ使用量¶
ジョブ投入時に指定したメモリよりも多くのメモリを必要とした場合、ジョブは指定したメモリを上限として実行されます。ジョブが使用したメモリが、指定したメモリに達したかは、sacct
コマンドで確認します。
$ sacct -o JobID,State,MaxRSS,ReqMem,AllocCPUS --units=M -j 453
JobID State MaxRSS ReqMem AllocCPUS
------------ ---------- ---------- ---------- ----------
453 COMPLETED 400Mc 2
453.batch COMPLETED 800M 400Mc 2
453.extern COMPLETED 0 400Mc 2
ジョブが使用した最大のメモリは、MaxRSSより800Mです
ジョブ実行時に指定したメモリは、ReqMemが400Mc(cはCPUコア当たりのメモリ制限であることを示す)で、AllocCPUSが2であることから、400Mc×2=800Mとなります。
この例では、ジョブ実行時に指定したメモリが、MaxRSSと同じ値であることから、指定したメモリの上限に達したと考えられます。
リソース要求の精度不足による弊害¶
ジョブ投入時に指定したCPUコア数やメモリ量が、実際にジョブが使用したCPUコア数やメモリ量と大きく異なる場合、以下の弊害が生じます。
- 指定したCPUコア数 < 実際にジョブで使用するCPUコア数
エラーが発生します。
- 指定したCPUコア数 > 実際にジョブで使用するCPUコア数
ジョブが計算ノードに割り当たりにくくなります。システム全体の利用効率が下がってしまうため、 推奨されません。
- 指定したメモリ < 実際にジョブで使用するメモリ
ジョブが少ないメモリ量で動作するため、性能悪化やエラーが発生します。
- 指定したメモリ > 実際にジョブで使用するメモリ
ジョブが計算ノードに割り当たりにくくなります。システム全体の利用効率が下がってしまうため、 推奨されません。
ジョブの状態確認(squeue)¶
squeue
コマンドを利用し、自分が投入したジョブの状態を確認することができます。
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
226 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
227 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
228 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
229 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
230 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
231 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
232 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
233 mjobs testjob user PD 0:00 1 (AssocGrpCpuLimit)
224 mjobs testjob user R 0:06 1 c3x001
225 mjobs testjob user R 0:06 1 c3x001
ジョブの詳細情報確認(scontrol)¶
scontrol show job
により、実行中のジョブの詳細な情報を確認できます。
$ scontrol show job 236
JobId=236 JobName=test.sh
UserId=user(1001) GroupId=user(1001) MCS_label=N/A
Priority=4294901455 Nice=0 Account=user QOS=normal
JobState=COMPLETED Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
RunTime=00:00:21 TimeLimit=7-00:00:00 TimeMin=N/A
SubmitTime=2022-04-15T11:02:17 EligibleTime=2022-04-15T11:02:17
AccrueTime=2022-04-15T11:02:17
StartTime=2022-04-15T11:02:17 EndTime=2022-04-15T11:02:38 Deadline=N/A
SuspendTime=None SecsPreSuspend=0 LastSchedEval=2022-04-15T11:02:17 Scheduler=Main
Partition=mjobs AllocNode:Sid=sv-sess3a02:534657
... (以下略) ...
ジョブの削除(scancel)¶
投入したジョブを取り消す際は、squeue
コマンドでジョブのIDを確認後、scancel
コマンドで削除します。
$ scancel 236
ジョブの実行結果の確認¶
終了したジョブの情報は、job_record
コマンドで確認できます。
$ job_record -j 236
=========================================
owner sample
jobid 236
alloc_cpus 2
exit_status COMPLETED
exit_code 0:0
partition_name mjobs
hostname c3x001
... (以下略) ...
exit_status |
スクリプトの終了ステータス |
exit_code |
Slurm のジョブのエラーステータス(0:0以外は失敗) |
wall_clock_limit |
ジョブのタイムリミット |
cpu_time |
ジョブのCPU使用時間 |
max_rss |
ジョブの最大メモリ使用量 |
max_vm |
ジョブの最大仮想メモリ使用量 |
ジョブ実行時間の上限やメモリ使用量の上限に達したジョブでは、推奨可能なリソースがあれば以下が出力されます。
recommended_queue |
推奨されるパーティション |
recommended_memory |
推奨される要求メモリ |
recommended_option |
推奨される |