Slurm
HPCクラスタ向けのオープンソースのジョブスケジューラ/リソースマネージャ。公式の説明は “an open source, fault-tolerant, and highly scalable cluster management and job scheduling system for large and small Linux clusters"。スパコンやGPUクラスタで「ログインノードにsshしてsbatchでジョブを投げる」あの世界の標準。
役割
公式overviewによると主な機能は3つ。
- ユーザーに計算資源(ノード)を一定時間、排他的/非排他的に割り当てる
- 割り当てたノード上で並列ジョブ(典型的にはMPI)を起動・監視する枠組みを提供する
- 資源の取り合いをキュー(待ち行列)で調停する
歴史
- 2002年、Lawrence Livermore National Laboratory (LLNL) 中心に最初のリリース。元は “Simple Linux Utility for Resource Management” の略で、プロプライエタリなQuadrics RMSに触発されたもの。今は「Slurm Workload Manager」と呼ばれ、略語扱いではない。
- 2010年、元の開発者たちがSchedMDを設立し、以後SchedMDが本家ソースをメンテ。
- ライセンスはGPLv2。C言語で書かれ、約100個のオプショナルなプラグインを持つモジュラー設計。
- 2021年11月時点でTOP500の約60%のシステムで使われている(Wikipedia)。
- 2025年12月15日、NVIDIAがSchedMDを買収したと発表。NVIDIAはSlurmをオープンソース・ベンダーニュートラルなソフトウェアとして開発・配布し続けるとしている。発表時点でTOP500のトップ10・トップ100のそれぞれ半数超で使われているとのこと。
アーキテクチャ
flowchart LR
user[ユーザー<br/>sbatch/srun/squeue] --> ctld[slurmctld<br/>中央マネージャ]
ctld --> d1[slurmd<br/>計算ノード1]
ctld --> d2[slurmd<br/>計算ノード2]
ctld --> d3[slurmd<br/>計算ノードN]
ctld --> dbd[slurmdbd<br/>アカウンティングDB]
rest[slurmrestd<br/>REST API] --> ctld
- slurmctld — 中央のマネージャ。資源とジョブを監視・スケジュールする。バックアップを置ける。
- slurmd — 各計算ノードで動くデーモン。ジョブを実行し状態を報告する。
- slurmdbd — オプション。複数クラスタのアカウンティング情報をDBに記録する(
sacctや fair share の元データ)。 - slurmrestd — オプション。REST APIでSlurmを操作するためのデーモン。
概念
- node — 計算資源の単位
- partition — ノードの論理グループ。実質ジョブキュー(例:
gpu,debug,long)。パーティションごとに最大実行時間やアクセス権を設定する - job — ユーザーに一定時間割り当てられた資源
- job step — ジョブ内で起動される並列タスクの集合(ジョブの中で
srunするたびに1ステップ)
GPUなどは GRES (generic resources) として扱い、--gres=gpu:2や--gpus=8で要求する。
主なコマンド
| コマンド | 役割 |
|---|---|
sbatch |
バッチスクリプトを投入 |
srun |
ジョブ/ジョブステップを起動(対話的にも使う) |
salloc |
資源だけ確保してシェルを得る |
squeue |
キュー中のジョブの状態 |
sinfo |
ノード・パーティションの状態 |
scancel |
ジョブのキャンセル |
sacct |
終了したジョブを含む実行履歴(アカウンティング) |
scontrol |
管理用。ジョブやノードの詳細表示・変更 |
バッチスクリプトの例
#SBATCHコメントでオプションを書き、sbatch job.shで投げる。
#!/bin/bash
#SBATCH --job-name=train
#SBATCH --partition=gpu
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=8
#SBATCH --gres=gpu:8
#SBATCH --time=1-00:00:00 # days-hours:minutes:seconds
#SBATCH --output=logs/%j.out # %j = ジョブID
srun python train.py
--array=0-99%10— ジョブ配列。100個のタスクを同時最大10個で流す。各タスクでは$SLURM_ARRAY_TASK_IDが添字、出力名は%A_%a(配列ジョブID_添字)が使える。パラメータスイープの定番。--dependency=afterok:<jobid>— 指定ジョブが成功したら開始。前処理→学習→評価のようなパイプラインを組める。
Kubernetesとの違い(感覚的なメモ)
Kubernetes(やその祖先のBorg)が「常駐するサービスを望ましい状態に保つ」ことを主眼にしているのに対し、Slurmは「有限時間で終わるバッチジョブに、ノードをまとめて(MPIならギャングで)割り当てる」ことに特化している。--timeで実行時間の上限を申告させるのも、それを使ってバックフィル(大きいジョブの待ち時間の隙間に短いジョブを詰める)をするためである。※この節は公式資料の対比ではなく自分の整理。
関連
- HPCクラスタでは、Slurmで割り当てたノード群から共有の並列ファイルシステム(Lustreなど)を
/scratch的にマウントして読み書きするのが典型構成。
出典
- Slurm Workload Manager - Overview
- Slurm Workload Manager - sbatch
- Slurm Workload Manager - Wikipedia
- NVIDIA Acquires Open-Source Workload Management Provider SchedMD | NVIDIA Blog
- What Does Nvidia’s Acquisition of SchedMD Mean for Slurm? - HPCwire
#hpc #scheduler #infrastructure