Slurm

  • Torque や Sun Grid Engine のようなジョブ管理ツール。
  • 現状、ドキュメントは Torque の方が多く、Slurm は圧倒的にドキュメントが少なく、日本語ドキュメントはさらに少ない…。
  • Ubuntu のデフォルトリポジトリには登録されている。
  • slurmctl: ノード管理デーモン (マスターノード (親機) にインストール)
  • slurmd: 計算管理デーモン (各計算ノードにインストール)
  • 参考サイト: Slurm Workload Manager
  • ここでは、Ubuntu 16.04 ベースで、ソースからコンパイルする方法を紹介する。
  1. 認証システム munge をインストールする。
    $ sudo apt-get install libmunge-dev libmunge2 munge
    • 通常はインストール時に認証鍵が生成されるが、されない場合は以下のコマンドをマスターノードでのみ行う (マスターノードの認証鍵を計算機ノードが参照するため)。
      $ sudo create-munge-key
  2. インストール時にスタートアップの問題で失敗するので、修正する。
    $ sudo systemctl edit --system --full munge
    1. ExecStart=/usr/sbin/mungedExecStart=/usr/sbin/munged –syslog にする。
    2. 再度インストールする。
      $ sudo apt-get install -f
  3. slurm を https://www.schedmd.com/downloads.php からダウンロードする。
    • ここでは、SLURM-17.02.1-2.TAR.BZ2 をダウンロードする。
    • ダウンロードしたファイルは /tmp にあるものとする。
  4. 展開する。
    $ cd /tmp
    $ tar axvf slurm-17.02.1-2.tar.gz
  5. インストールする。
    $ cd slurm-17.02-1.2
    $ ./configure
    $ make -j 4
    $ sudo make install
  6. 設定ファイルをコピーする。
    $ sudo cp etc/slurm.conf.example /usr/local/etc/slurm.conf
  7. 設定ファイルを編集する。
    • 詳しくはシステムの設定を参照
  8. 必要なディレクトリを作成する。
    $ 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 を用いる方法があり、こちらで設定ファイルを作成した場合は、StateSaveLocationSlurmdSpoolDir が既に存在しているディレクトリを指しているため、このエラーは起こらない。
  9. 自動起動するようにする。
    • マスターノード (マスターノードで計算させない場合は 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
  10. サービスを起動する。
    • マスターノード (マスターノードで計算させない場合は slurmd.service の行は不要)
      $ sudo systemctl start  slurmctld.service
      $ sudo systemctl start  slurmd.service
    • 計算ノード
      $ sudo systemctl start  slurmd.service
  11. 起動しているかを確認する。
    • マスターノード (マスターノードで計算させない場合は slurmd.service の行は不要)
      $ sudo systemctl status slurmctld.service
      $ sudo systemctl status slurmd.service
    • 計算ノード
      $ sudo systemctl status slurmd.service
  12. ジョブを投入してテストする。
    $ 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 の場合
    • SelectTypeParameters: SelectType のパラメータ (詳細は Slurm Workload Manager 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: ジョブを受け付けない (キューに既にあるジョブは実行しない)
    • 参考サイト:

"error: we don't have select plugin type 101" というエラー、あるいはジョブが終了しても "CG" というステータスのままフリーズ

他のノードに計算が流れない

  • 原因: 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.logerror: authentication: Rewound credentialUnable to register: Zero Bytes were transmitted or received がある
  • 原因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 でインストールする。

導入方法