Slurm
概要
- Torque や Sun Grid Engine のようなジョブ管理ツール。
- 現状、Slurm は Torque に比べ圧倒的にドキュメントが少なく、日本語ドキュメントはさらに少ない…。
- Ubuntu のデフォルトリポジトリには登録されている。
プログラム
slurmctl: ノード管理デーモン (マスターノード (親機) にインストール)slurmd: 計算管理デーモン (各計算ノードにインストール)- 参考サイト: Slurm Workload Manager
使い方
ジョブの投入
- torque と同じで、ジョブファイルを作成し、
sbatchコマンドにそのジョブファイルを与える。
$ sbatch JOBFILE.sh - ジョブの制御は、コマンドオプションで指定するか、ジョブファイルの先頭に
#SBATCH …というコマンドを記述する。 - ジョブファイルの例:
- job.sh
#!/bin/bash #SBATCH -p PARTITION #SBATCH -n 1 #SBATCH -J "JOB_NAME" #SBATCH -o "LOG_FILE" JOB_COMMAND
-p: ジョブを実行するパーティション名を指定-n: ジョブに必要な CPU 数を指定-J: ジョブ名を指定-o: ログファイルを指定JOB_COMMAND: 実行したいコマンド (シェルスクリプト)- これらのコマンドは
sbatchのコマンドオプションとしても機能する。
ジョブの確認
squeueコマンドで確認する。squeueコマンドでは表示フォーマットを変更することもできる。フォーマットの変更は-oオプションで、C 言語のprintf()のように指定する。%i: ジョブ ID%j: ジョブ名%t: ジョブの状態%M: ジョブ開始からの経過時間%P: パーティション名%R: 待機しているノードリストおよびジョブが進行しない理由%Z: ジョブ実行ディレクトリ%o: ジョブファイルパス- 表示フォーマットの指定例:
- 標準:
squeue -S i -o “%.8i %8j %2t %.10M %9P %R” - 標準+ディレクトリ:
squeue -S i -o “%.8i %8j %2t %.10M %9P %16R %Z” - 標準+実行ファイル:
squeue -S i -o “%.8i %8j %2t %.10M %9P %16R %o”
- その他のオプション
-S: 特定のカラムでソート (ソート内容は表示フォーマットで指定)- 例:
-S i(%iのジョブ ID でソート)
ジョブ制御
- 待機中のジョブを停止 (実行させないように) する
$ scontrol hold JOBIDJOBID: 停止させたいジョブ ID (スペースで区切って複数指定可)- ジョブ投入時に、この状態にしたい場合は、
sbatch -Hでジョブを投入する
- 上記の待機状態を解除する
$ scontrol release JOBID - 実行中のジョブを停止 (一時停止) させる。
$ sudo scontrol suspend JOBID
JOBID: 実行中の停止させたいジョブ- 管理者権限が必要となることに注意
- 上記の状態を解除する
$ sudo scontrol resume JOBID
インストール方法
- Ubuntu のリポジトリ (apt) からインストールする場合は、“ コア数が多いマシンが手に入ったのでslurmで計算クラスターにする - in neuro” を参照。
* ここでは、Ubuntu 16.04 ベースで、ソースからコンパイルする方法を紹介する。
- 認証システム munge をインストールする。
$ sudo apt-get install libmunge-dev libmunge2 munge
- 通常はインストール時に認証鍵が生成されるが、されない場合は以下のコマンドをマスターノードでのみ行う (マスターノードの認証鍵を計算機ノードが参照するため)。
$ sudo create-munge-key
- インストール時にスタートアップの問題で失敗するので、修正する。
$ sudo systemctl edit --system --full munge
ExecStart=/usr/sbin/mungedをExecStart=/usr/sbin/munged --syslogにする。- 再度インストールする。
$ sudo apt-get install -f
- slurm を https://www.schedmd.com/downloads.php からダウンロードする。
- ここでは、
SLURM-17.02.1-2.TAR.BZ2をダウンロードする。 - ダウンロードしたファイルは
/tmpにあるものとする。
- 展開する。
$ cd /tmp $ tar axvf slurm-17.02.1-2.tar.gz
- インストールする。
$ cd slurm-17.02-1.2 $ ./configure $ make -j 4 $ sudo make install
- 設定ファイルをコピーする。
$ sudo cp etc/slurm.conf.example /usr/local/etc/slurm.conf
- 設定ファイルを編集する。
- 詳しくはシステムの設定を参照
- 必要なディレクトリを作成する。
$ sudo mkdir -p /var/spool/slurm/ctld $ sudo mkdir -p /var/spool/slurm/d
slurm.conf.exampleをベースに設定ファイルを作成した場合は、fatal: _create_clustername_file: failed to create file /var/spool…というエラーが出るため、この作業が必要である。slurmctldが起動できないのは、このディレクトリがなく、このディレクトリ以下にファイルを作成できないためである。- 設定を容易に行う別の方法として、
doc/html/configurator.easy.htmlを用いる方法があり、こちらで設定ファイルを作成した場合は、StateSaveLocationやSlurmdSpoolDirが既に存在しているディレクトリを指しているため、このエラーは起こらない。
- 自動起動するようにする。
- マスターノード (マスターノードで計算させない場合は
slurmd.serviceの行は不要)
$ sudo cp etc/slurmctld.service /etc/systemd/system $ sudo cp etc/slurmd.service /etc/systemd/system $ sudo systemctl enable slurmctld.service $ sudo systemctl enable slurmd.service
- 計算ノード
$ sudo cp etc/slurmd.service /etc/systemd/system $ sudo systemctl enable slurmd.service
- サービスを起動する。
- マスターノード (マスターノードで計算させない場合は
slurmd.serviceの行は不要)
$ sudo systemctl start slurmctld.service $ sudo systemctl start slurmd.service
- 計算ノード
$ sudo systemctl start slurmd.service
- 起動しているかを確認する。
- マスターノード (マスターノードで計算させない場合は
slurmd.serviceの行は不要)
$ sudo systemctl status slurmctld.service $ sudo systemctl status slurmd.service
- 計算ノード
$ sudo systemctl status slurmd.service
- ジョブを投入してテストする。
$ srun -l sleep 60 & $ srun -l sleep 60 & $ srun -l sleep 60 & $ srun -l sleep 60 & $ srun -l sleep 60 & $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 29 ALL sleep mumeiyam PD 0:00 1 (Resources) 25 ALL sleep mumeiyam R 0:05 1 master 26 ALL sleep mumeiyam R 0:04 1 master 27 ALL sleep mumeiyam R 0:04 1 master 28 ALL sleep mumeiyam R 0:03 1 master
システムの設定
一般マシン
- マスターノード (master)、計算ノード (calc01, calc02, calc03) の例.
- slurm.conf
ControlMachine=master ControlAddr=192.168.1.254 : SlurmUser=root SlurmdUser=root : SelectType=select/cons_res SelectTypeParameters=CR_CPU : PreemptType=preempt/partition_prio PreemptMode=SUSPEND,GANG : # Node configuration # Configure support for our four GPUs GresTypes=gpu,bandwidth # COMPUTE NODES NodeName=master Procs=8 NodeAddr=192.168.1.254 RealMemory=16016 State=UNKNOWN NodeName=calc01 Procs=8 NodeAddr=192.168.1.1 RealMemory=16016 State=UNKNOWN NodeName=calc02 Procs=4 NodeAddr=192.168.1.2 RealMemory=1969 State=UNKNOWN NodeName=calc03 Procs=4 NodeAddr=192.168.1.3 RealMemory=3921 State=UNKNOWN # Partition configuration PartitionName=ALL Nodes=master,calc01,calc02,calc03Default=YES MaxTime=UNLIMITED PriorityTier=1 State=UP PartitionName=CPU1 Nodes=master MaxTime=UNLIMITED PriorityTier=1 State=UP PartitionName=CPU2 Nodes=calc01 MaxTime=UNLIMITED PriorityTier=1 State=UP PartitionName=CPU3 Nodes=calc02,calc03 MaxTime=UNLIMITED PriorityTier=1 State=UP PartitionName=CPU1_h Nodes=master MaxTime=UNLIMITED PriorityTier=2 State=UP PartitionName=CPU2_h Nodes=calc01 MaxTime=UNLIMITED PriorityTier=2 State=UP PartitionName=CPU3_h Nodes=calc02,calc03 MaxTime=UNLIMITED PriorityTier=2 State=UP
ControlMachine: ジョブ管理ノード名ControlAddr: ジョブ管理ノードの IP アドレスSlurmUser: 管理者ユーザSelectType: ジョブの投入方法 (select/liner|select/cons_res|select_cray)select/liner: nodes (シングル CPU?) の場合select/cons_res: socket/core/CPU (複数 CPU?) の場合select_cray: Cray systems without ALPS の場合
-
CR_Memory:select/liner時のおすすめパラメータ (メモリの状況で判断?)CR_CPU: 複数 CPU の場合に CPU が空き次第投入する (CPU の状況で判断?)CR_Core_Memory:select/cons_res時のおすすめパラメータ (CPU あたりのメモリの状況で判断?)
PreemptType: 割り込みタイプpreempt/none: 割り込まないpreempt/partition_prio: 特定のパーティションのジョブが割り込む
PreemptMode: 割り込み時の優先度が低いジョブの挙動SUSPEND: 低優先度のジョブを止める (終了はさせない)CANCEL: 低優先度のジョブを終了させるCHECKPOINT: チェックポイントを作成して低優先度のジョブを終了させるREQUEUE: 低優先度のジョブを終了させて、再度キューに投入する (ジョブは別リソースでスタートする可能性がある)GANG: ジョブ復帰のために必要なオプションで、他のオプションを組み合わせて使う
NodeName: 各計算機ノードのノード名NodeAddr: 計算機ノードの IP アドレスProcsorCPUs: CPU 数RealMemory: 実メモリ (MiB)Gres: GPU の設定- 1つ目のフィールド:
grep.conf内の名前 - 2つ目のフィールド: GPU のアーキテクチャ
- 3つ目のフィールド: GPU 数
PartitionName: パーティション (キュー) 名Nodes: キューがサブミットできるノード (カンマでノード名を区切る; デフォルトはすべてのノード)Default: デフォルトのキューか? (YES|NO)MaxTime: 計算時間の上限 (mm|mm:ss|hh:mm:ss|dd-hh|dd-hh:mm|dd-hh:mm:ss|UNLIMITED)- root や slurmUser に指定されているユーザは適用されない
PriorityTier: パーティションの優先度 (デフォルトは 1)MaxCPUsPerNode: パーティションで使えるノードごとの CPU 数 (このパーティションで同時に実行できるジョブ数を制限する際に使うと良い)- *
State: キューの有効/無効 (UP|DOWN|DRAIN|INACTIVE)UP: 有効DOWN: ジョブは受け付けるが、実行しないDRAIN: ジョブを受け付けない (キューに既にあるジョブは実行する)INACTIVE: ジョブを受け付けない (キューに既にあるジョブは実行しない)
- 参考サイト:
- slurm.conf: Slurm Workload Manager
- 割り込み: Slurm Workload Manager
GPU マシン
- 上記に加えて、
gres.confが必要。 slurm.confと同じディレクトリに入れておく。- gres.conf
Name=gpu Type=pascal File=/dev/nvidia0 CPUs=0,1,2,3
Type: GPU のアーキテクチャ名File: GPU のデバイスファイルパス
トラブルシューティング
"error: we don't have select plugin type 101" というエラー、あるいはジョブが終了しても "CG" というステータスのままフリーズ
- 原因: プラグインが未ロードのために起こるエラー
- プラグインが必要な設定に書き換えた後、マスターノードのデーモン (slurmctl) をリロードしたが、計算ノードのデーモン (slurmd) をリロードしていない場合に起こる
- 解決法: slurmd をリロードする
他のノードに計算が流れない
- 原因: munge が通信の認証を担当しているため、認証キーの不一致やパーミッション・所有者が異なるため
- 解決法:
- 再度 /etc/munge 内の認証キーが同一か、パーミッション・所有者が適切に設定されているか確認する
- もしかしたら、初歩的にネットワークがつながってないってこともあるので、そっちも確認する
ノードの状態が "drain" のままでジョブが実行されない
- 原因: 設定の読み込みのタイミングが失敗して、リソースがジョブに対し少なすぎると認識されている (メモリの設定などが 1 のままになっているとか)
- 解決法:
- slurm デーモンを再起動させてみる
$ sudo service slurm restart
- ノードの状態を強制的に変更する (詰まっているジョブを強制的に動かす)
$ sudo scontrol update nodename=NODENAME state=resume
NODENAME:drain状態のノード名
- 強制的に設定ファイルを読み込む
$ sudo scontrol reconfigure
- 強制的に状態をクリアする
$ sudo service slurm stop $ sudo service slurm startclean
"sinfo -N" でノードがダウンした状態になる
- 原因1: ネットワークが繋がっていない
- 解決方法: ネットワークケーブルやネットワークの設定を見直すこと
- 原因2: ダウンしたノードの
/var/log/slurmd.logにerror: authentication: Rewound credentialやUnable to register: Zero Bytes were transmitted or receivedがある- 解決方法:
Rewoundにあるとおり、ノードの時間の不一致により認証できないのが原因なので、時間を合わせる。 - 解決方法: 時間を合わせても、改善しない場合は、マスターノードから
/etc/munge/munge.keyをコピーして、計算ノードの同じ場所に上書きする。 - 参考サイト
- 原因3: 上記解決法を試した後でも down のままになっていることがあるが、これは sinfo のキャッシュが更新されていないことがある。
- 解決方法: drain の時と同じように
sudo scontrol update nodename=NODENAME state=resumeで詰まりを取る
起動しない
- エラー:
Couldn't find the specified plugin name for crypto/munge looking at all files - 原因: Ubuntu 18.04 + Slurm 17.11.8 以降で、
libmunge-devパッケージが必要になった模様。 - 解決方法:
libmunge-devを apt でインストールする。