基本的な利用方法

ジョブの投入(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>

ジョブに対しncoreCPUコアを確保します

--mem-per-cpu=<size>[units]

1CPUコアあたりに確保するメモリ量を指定します

unitsを省略した場合、単位はMBです。また、unitsにはKB,MB,GBなどが指定できます。

--gpus=<num>

GPUボードをnum枚確保します

-p <partition>

ジョブを投入するパーティションを指定します

-a <range>:<step>

アレイジョブのタスクIDの範囲を指定して実行します

-d <status>:<jobid>

依存関係ジョブを設定します

-o-eオプションでは、下記のパターンを指定できます。

%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のジョブに設定される主な環境変数

SLURM_CPUS_PER_TASK

-cで指定したCPUコア数

SLURM_GPUS

--gpusで指定したGPU数

SLURM_JOB_ID

ジョブID

SLURM_JOB_DEPENDENCY

-dに設定した値(→依存関係ジョブ

SLURM_JOB_NAME

ジョブ名

SLURM_JOB_PARTITION

パーティション名

SLURM_MEM_PER_CPU

--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
... (以下略) ...
job_record コマンドの出力結果

exit_status

スクリプトの終了ステータス

exit_code

Slurm のジョブのエラーステータス(0:0以外は失敗)

wall_clock_limit

ジョブのタイムリミット

cpu_time

ジョブのCPU使用時間

max_rss

ジョブの最大メモリ使用量

max_vm

ジョブの最大仮想メモリ使用量

ジョブ実行時間の上限やメモリ使用量の上限に達したジョブでは、推奨可能なリソースがあれば以下が出力されます。

recommended_queue

推奨されるパーティション

recommended_memory

推奨される要求メモリ

recommended_option

推奨されるsbatchのオプション