====== Slurm ======
===== 概要 =====
* Torque や Sun Grid Engine のようなジョブ管理ツール。
* 現状、Slurm は Torque に比べ圧倒的にドキュメントが少なく、日本語ドキュメントはさらに少ない…。
* Ubuntu のデフォルトリポジトリには登録されている。
===== プログラム =====
* ''slurmctl'': ノード管理デーモン (マスターノード (親機) にインストール)
* ''slurmd'': 計算管理デーモン (各計算ノードにインストール)
* 参考サイト: [[https://slurm.schedmd.com/quickstart.html | Slurm Workload Manager]]
===== 使い方 =====
==== ジョブの投入 ====
* torque と同じで、ジョブファイルを作成し、''sbatch'' コマンドにそのジョブファイルを与える。\\
$ sbatch JOBFILE.sh
* ジョブの制御は、コマンドオプションで指定するか、ジョブファイルの先頭に ''#SBATCH ...'' というコマンドを記述する。
* ジョブファイルの例:\\
#!/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'' のコマンドオプションとしても機能する。
* 参考サイト: [[https://slurm.schedmd.com/sbatch.html | Slurm Workload Manager - 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 JOBID
* ''JOBID'': 停止させたいジョブ ID (スペースで区切って複数指定可)
* ジョブ投入時に、この状態にしたい場合は、''sbatch -H'' でジョブを投入する
* 上記の待機状態を解除する\\
$ scontrol release JOBID
* 実行中のジョブを停止 (一時停止) させる。\\
$ sudo scontrol suspend JOBID
* ''JOBID'': 実行中の停止させたいジョブ
* 管理者権限が必要となることに注意
* 上記の状態を解除する\\
$ sudo scontrol resume JOBID
===== インストール方法 =====
* Ubuntu のリポジトリ (apt) からインストールする場合は、"[[https://in-neuro.hatenablog.com/entry/2020/03/07/150139 | コア数が多いマシンが手に入ったので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) の例.\\
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 の場合
* ''SelectTypeParameters'': ''SelectType'' のパラメータ (詳細は [[https://slurm.schedmd.com/cons_res_share.html | Slurm Workload Manager]] や [[https://slurm.schedmd.com/cons_res.html | Slurm Workload Manager]] を参照)
* ''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 アドレス
* ''Procs'' or ''CPUs'': 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: [[https://slurm.schedmd.com/slurm.conf.html | Slurm Workload Manager]]
* GPU: [[https://slurm.schedmd.com/gres.html | Slurm Workload Manager]]
* 割り込み: [[https://slurm.schedmd.com/preempt.html | Slurm Workload Manager]]
==== GPU マシン ====
* 上記に加えて、''gres.conf'' が必要。
* ''slurm.conf'' と同じディレクトリに入れておく。
*
Name=gpu Type=pascal File=/dev/nvidia0 CPUs=0,1,2,3
* ''Type'': GPU のアーキテクチャ名
* ''File'': GPU のデバイスファイルパス
* アーキテクチャ対応表: https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/
===== トラブルシューティング =====
==== "error: we don't have select plugin type 101" というエラー、あるいはジョブが終了しても "CG" というステータスのままフリーズ ====
* 原因: プラグインが未ロードのために起こるエラー
* プラグインが必要な設定に書き換えた後、マスターノードのデーモン (slurmctl) をリロードしたが、計算ノードのデーモン (slurmd) をリロードしていない場合に起こる
* 解決法: slurmd をリロードする
* 参考サイト: [[https://groups.google.com/forum/#!topic/slurm-devel/OMs91TahyNo | [slurm-dev] Jobs stuck in CG state and a bunch of plugin errors in slurmd\.log \- Google グループ]]
==== 他のノードに計算が流れない ====
* 原因: 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
* 参考サイト: [[https://github.com/clustervision/trinity/issues/332 | trinity containers: slurm sets containers to "drain" during some partition cases · Issue \#332 · clustervision/trinity]]
==== "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'' をコピーして、計算ノードの同じ場所に上書きする。
* 参考サイト
* [[http://pubs.cray.com/#/Collaborate/00446695-DC/DD00439970/What Does this Log Message Mean? | Cray : DITAweb]]
* [[http://thread.gmane.org/gmane.comp.distributed.slurm.devel/2655 | Re: Slurm not working: Reason=Node unexpectedly rebooted]]
* 原因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 でインストールする。
===== 参考サイト =====
==== 導入方法 ====
* [[http://qiita.com/JeJeNeNo/items/c545e72373d4d1deb36a "Slurm Workload ManagerをUbuntu 16.04LTS に導入する - Qiita" | Slurm Workload ManagerをUbuntu 16.04LTS に導入する - Qiita]]
* [[http://www-fps.nifs.ac.jp/ito/memo/slurm01.html "Atsushi M. Ito web" | Atsushi M. Ito web]]
{{tag>Linux サーバ 分シミュレーション}}