- Authors
- Name
- 1. Slurm とは
- 2. アーキテクチャ
- 3. 中核概念
- 4. 必須コマンド
- 5. ジョブスクリプトの例
- 6. GPU スケジューリング(GRES)
- 7. AI/ML 分散学習
- 8. コンテナ統合
- 9. 設定(slurm.conf)
- 10. 高度な機能
- 11. モニタリングとトラブルシューティング
- 12. 他のスケジューラーとの比較
- 13. References
1. Slurm とは
Slurm(Simple Linux Utility for Resource Management)は、Linux クラスター向けのオープンソース、耐障害性、高拡張性ワークロードマネージャーである。HPC(High-Performance Computing)および AI 学習インフラにおける事実上の標準だ。
1.1 3つの中核機能
- リソース割り当て:ユーザーに対し、指定時間コンピュートノードへの排他的/共有アクセスを付与
- ジョブ実行フレームワーク:割り当てられたノード上で並列ジョブを起動・実行・モニタリング
- キュー管理:高度なスケジューリングアルゴリズムによるリソース競合の調整
1.2 歴史
| 年 | イベント |
|---|---|
| 2002 | Lawrence Livermore National Laboratory(LLNL)にて初回リリース |
| 2010 | コア開発者らが SchedMD を設立(商用サポート、開発、教育) |
| 2025.12 | NVIDIA が SchedMD を買収 — オープンソース・ベンダー中立維持を約束 |
1.3 誰が使っているのか
- TOP500 スーパーコンピューターの約 60〜65% が Slurm を使用
- 代表的なシステム:Frontier(Oak Ridge、第1位)、Perlmutter(NERSC)、Polaris(Argonne)
- クラウド:AWS ParallelCluster、Google Cloud HPC、Azure CycleCloud
- AI 企業:大規模 LLM 学習、画像生成モデル学習
- 産業:自動運転、ヘルスケア、エネルギー、金融、政府系研究所
ライセンス:GNU GPL v2(オープンソース)
2. アーキテクチャ
┌─────────────────────────────────────────────────────────────┐
│ Slurm Architecture │
│ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ slurmctld │ │ slurmctld │ │
│ │ (Primary) │◄──────►│ (Backup) │ │
│ │ Head Node │ HA │ Backup Node │ │
│ └───────┬────────┘ └────────────────┘ │
│ │ RPC (TCP) │
│ ┌───────┼──────────────────────────────────┐ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ slurmd │ │ slurmd │ │ slurmd │ │ Compute Nodes │
│ │ │ Node 01 │ │ Node 02 │ │ Node N │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ slurmdbd │ │ slurmrestd │ │
│ │ (Database) │ │ (REST API) │ │
│ │ MySQL/MariaDB │ │ JSON / JWT │ │
│ └────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2.1 デーモンごとの役割
| デーモン | 役割 | 配置場所 |
|---|---|---|
| slurmctld | 中央管理(スケジューリング、リソース監視、ジョブキュー) | ヘッドノード |
| slurmd | タスク実行、リソース使用量監視、状態報告 | 全コンピュートノード |
| slurmdbd | ジョブアカウンティング、履歴、使用統計(MySQL/MariaDB バックエンド) | DB サーバー |
| slurmrestd | HTTP RESTful API(JSON、JWT 認証) | API サーバー |
2.2 プラグインアーキテクチャ
Slurm は拡張可能なプラグインアーキテクチャに対応している:
- 認証(auth/munge、auth/jwt)
- コンテナ(OCI、Singularity、Enroot)
- GPU/GRES 管理
- MPI 実装(PMIx、PMI2)
- スケジューリングアルゴリズム(backfill、priority multifactor)
- プロセストラッキング(cgroup、linuxproc)
3. 中核概念
3.1 Node、Partition、Job
| 概念 | 説明 |
|---|---|
| Node | 基本的なコンピュートリソース。CPU、メモリ、GPU、ディスク属性を持つ |
| Partition | ノードの論理的なグループ = ジョブキュー。アクセス制御、リソース上限、優先度を設定 |
| Job | ユーザーに指定時間割り当てられたリソース。一意な ID、リソース要件、状態を保持 |
| Job Step | ジョブ内の並列タスクの集合。個別の Job よりオーバーヘッドが少ない |
Job 1234
├── Step 0: データ前処理(1ノード)
├── Step 1: 学習(4ノード、32タスク)
└── Step 2: 評価(1ノード)
3.2 Account、QoS、Fairshare
Account:リソース使用量追跡のための階層的な組織単位
root
├── engineering
│ ├── ml-team
│ └── platform-team
└── research
├── physics
└── biology
QoS(Quality of Service):ジョブの挙動を制御する上限と優先度のセット
- スケジューリング優先度
- プリエンプション(先取り)ポリシー
- リソース上限(CPU、GPU、メモリ、同時実行ジョブ数)
Fairshare:過去のリソース使用量を考慮した公平割り当てスケジューリング
- 各アカウントに投資/資格に比例した share を割り当て
- 使用量が少ないユーザー → 高優先度、使用量が多いユーザー → 低優先度
- 直近の使用量により大きな重みを付与(減衰ファクター)
3.3 優先度計算(Multifactor)
Job Priority = site_factor
+ (WeightAge) × age_factor -- 待ち時間
+ (WeightFairshare) × fairshare_factor -- 公平分配
+ (WeightJobSize) × job_size_factor -- ジョブサイズ
+ (WeightPartition) × partition_factor -- パーティション等級
+ (WeightQOS) × QOS_factor -- QoS 等級
+ TRES weights -- GPU 等リソース重み
- nice_factor -- ユーザー譲歩値
4. 必須コマンド
4.1 sbatch — バッチジョブの投入
# 基本的な投入
sbatch job.sh
# オプションのオーバーライド
sbatch --partition=gpu --nodes=2 --gres=gpu:4 --time=24:00:00 train.sh
# ジョブ名と出力先を指定
sbatch --job-name=my_training --output=train_%j.log job.sh
# 特定のアカウントと QoS を指定
sbatch --account=ml-team --qos=high job.sh
4.2 srun — 並列ジョブ/ステップの実行
# 3ノードでホスト名を出力
srun -N3 -l /bin/hostname
# インタラクティブ GPU ジョブ
srun --partition=gpu --gres=gpu:1 --pty bash
# GPU バインド付きで実行
srun --ntasks=4 --gpus-per-task=1 --gpu-bind=closest python train.py
4.3 salloc — リソースのインタラクティブ割り当て
# GPU ノード2台、4時間の割り当て
salloc --nodes=2 --gres=gpu:4 --time=04:00:00 --partition=gpu
# 特定機能を要求
salloc -N1 --constraint=a100 --gres=gpu:8 --mem=512G
4.4 squeue — ジョブキューの照会
# 自分のジョブのみ表示
squeue -u $USER
# カスタムフォーマット
squeue -o "%.10i %.9P %.20j %.8u %.2t %.10M %.6D %R"
# PENDING ジョブと理由を表示
squeue -t PENDING -o "%.10i %.20j %.8u %.10M %R"
4.5 sinfo — システム情報の照会
# パーティションの概要
sinfo
# GPU リソースを表示
sinfo -o "%20N %10c %10m %20G %10t"
# アイドルノード
sinfo -t idle
4.6 scancel — ジョブの取り消し
scancel 12345 # 特定のジョブを取り消し
scancel -u $USER # 自分のジョブをすべて取り消し
scancel -t PENDING -u $USER # PENDING ジョブのみ取り消し
scancel 12345_[1-10] # 特定の Array タスクを取り消し
4.7 sacct — ジョブアカウンティング
# 完了したジョブの照会
sacct -u $USER
# 詳細フォーマット
sacct -j 12345 --format=JobID,JobName,Partition,State,Elapsed,MaxRSS,MaxVMSize,TotalCPU
# 日付範囲で照会
sacct --starttime=2026-01-01 --endtime=2026-01-31 -u $USER
4.8 scontrol — 管理制御
scontrol show job 12345 # ジョブの詳細情報
scontrol show node gpu-001 # ノードの詳細情報
scontrol hold 12345 # ジョブの保留
scontrol release 12345 # 保留の解除
scontrol update JobId=12345 TimeLimit=48:00:00 # 制限時間の変更
scontrol ping # コントローラーへの接続テスト
5. ジョブスクリプトの例
5.1 基本的な CPU ジョブ
#!/bin/bash
#SBATCH --job-name=basic_job
#SBATCH --partition=compute
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --cpus-per-task=2
#SBATCH --mem=16G
#SBATCH --time=02:00:00
#SBATCH --output=output_%j.log
#SBATCH --error=error_%j.log
module load gcc/12.2.0
module load openmpi/4.1.5
echo "Job started on $(hostname) at $(date)"
echo "SLURM_JOB_ID: $SLURM_JOB_ID"
echo "SLURM_NODELIST: $SLURM_NODELIST"
srun ./my_simulation --input data.csv --output results/
echo "Job completed at $(date)"
5.2 単一ノード GPU ジョブ
#!/bin/bash
#SBATCH --job-name=gpu_training
#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --mem=64G
#SBATCH --gres=gpu:a100:2
#SBATCH --time=12:00:00
#SBATCH --output=train_%j.log
module load cuda/12.2
module load anaconda/2024
conda activate ml_env
echo "Available GPUs: $CUDA_VISIBLE_DEVICES"
nvidia-smi
python train.py \
--model resnet50 \
--batch-size 256 \
--epochs 100 \
--data /shared/datasets/imagenet \
--output /scratch/$USER/checkpoints/
5.3 マルチノード MPI ジョブ
#!/bin/bash
#SBATCH --job-name=mpi_job
#SBATCH --partition=compute
#SBATCH --nodes=8
#SBATCH --ntasks-per-node=32
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=4G
#SBATCH --time=24:00:00
#SBATCH --exclusive
module load openmpi/4.1.5
echo "Running on $SLURM_NNODES nodes with $SLURM_NTASKS total tasks"
srun ./weather_simulation --grid-size 4096x4096x128 --timesteps 10000
5.4 Job Array(ハイパーパラメータスイープ)
#!/bin/bash
#SBATCH --job-name=hparam_sweep
#SBATCH --partition=gpu
#SBATCH --array=0-19%5 # 20タスク、最大5つ同時実行
#SBATCH --nodes=1
#SBATCH --gres=gpu:1
#SBATCH --mem=32G
#SBATCH --time=06:00:00
#SBATCH --output=sweep_%A_%a.log # %A=Array ID, %a=Task ID
LEARNING_RATES=(0.1 0.01 0.001 0.0001 0.00001)
BATCH_SIZES=(32 64 128 256)
LR_IDX=$((SLURM_ARRAY_TASK_ID / 4))
BS_IDX=$((SLURM_ARRAY_TASK_ID % 4))
LR=${LEARNING_RATES[$LR_IDX]}
BS=${BATCH_SIZES[$BS_IDX]}
echo "Task $SLURM_ARRAY_TASK_ID: LR=$LR, BS=$BS"
python train.py --lr $LR --batch-size $BS \
--experiment-name "sweep_${SLURM_ARRAY_JOB_ID}_${SLURM_ARRAY_TASK_ID}"
5.5 Job Dependencies(パイプライン)
# Step 1: 前処理
JOB1=$(sbatch --parsable preprocess.sh)
# Step 2: 学習(前処理成功後)
JOB2=$(sbatch --parsable --dependency=afterok:$JOB1 train.sh)
# Step 3: 評価(学習成功後)
JOB3=$(sbatch --parsable --dependency=afterok:$JOB2 evaluate.sh)
# Step 4: クリーンアップ(全ジョブ完了後、成功・失敗を問わず)
JOB4=$(sbatch --parsable --dependency=afterany:$JOB1:$JOB2:$JOB3 cleanup.sh)
依存関係のタイプ:
| タイプ | 意味 |
|---|---|
after:jobid | ジョブ開始後 |
afterok:jobid | ジョブの正常完了後 |
afternotok:jobid | ジョブ失敗後 |
afterany:jobid | ジョブ完了後(成功・失敗を問わず) |
aftercorr:jobid | Array:対応するタスクの正常完了後 |
singleton | 同名のジョブが同時に1つだけ実行される |
6. GPU スケジューリング(GRES)
6.1 設定
slurm.conf:
GresTypes=gpu,mps,shard
NodeName=gpu-node[01-08] Gres=gpu:a100:8 CPUs=128 RealMemory=1024000
AccountingStorageTres=gres/gpu
gres.conf:
# 自動検出(推奨)
AutoDetect=nvml # NVIDIA
# AutoDetect=rsmi # AMD
# AutoDetect=nrt # Intel Arc
6.2 GPU のリクエスト方法
# 任意タイプの GPU 2基
sbatch --gres=gpu:2 job.sh
# 特定の GPU タイプ
sbatch --gres=gpu:a100:4 job.sh
# ノードあたりの GPU
sbatch --nodes=4 --gpus-per-node=8 job.sh
# タスクあたりの GPU + CPU/メモリアフィニティ
sbatch --ntasks=8 --gpus-per-task=1 --cpus-per-gpu=8 --mem-per-gpu=32G job.sh
Slurm は GPU の隔離のために CUDA_VISIBLE_DEVICES を自動設定する。
6.3 GPU 共有オプション
| 方法 | 説明 | 設定 |
|---|---|---|
| MPS (Multi-Process Service) | マルチプロセスによる GPU 共有、カーネル並列実行 | Gres=gpu:a100:8,mps:800 |
| MIG (Multi-Instance GPU) | A100/H100 を独立インスタンスに分割 | AutoDetect=nvml(自動検出) |
| Shard | 隔離なしの GPU 共有(軽量推論向け) | Gres=gpu:2,shard:64 |
7. AI/ML 分散学習
7.1 PyTorch DDP(マルチノード)
sbatch スクリプト(4ノード x 8GPU = 32GPU):
#!/bin/bash
#SBATCH --job-name=ddp-multigpu
#SBATCH --partition=gpu
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:8
#SBATCH --cpus-per-task=64
#SBATCH --mem=0
#SBATCH --exclusive
#SBATCH --time=72:00:00
#SBATCH --output=ddp_%j.log
export MASTER_PORT=$(( RANDOM % (50000 - 30000 + 1) + 30000 ))
export MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1)
export WORLD_SIZE=$(( SLURM_NNODES * 8 ))
echo "MASTER_ADDR=$MASTER_ADDR, MASTER_PORT=$MASTER_PORT, WORLD_SIZE=$WORLD_SIZE"
# NCCL 設定
export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=^docker0,lo
srun torchrun \
--nnodes $SLURM_NNODES \
--nproc_per_node 8 \
--rdzv_id $SLURM_JOB_ID \
--rdzv_backend c10d \
--rdzv_endpoint $MASTER_ADDR:$MASTER_PORT \
train.py \
--model llama-7b \
--data /shared/datasets/openwebtext \
--batch-size 32 \
--gradient-accumulation-steps 4
Python 学習スクリプトのパターン:
import os
import torch
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.data.distributed import DistributedSampler
def setup():
dist.init_process_group(backend="nccl")
rank = dist.get_rank()
world_size = dist.get_world_size()
local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
return rank, world_size, local_rank
def main():
rank, world_size, local_rank = setup()
model = MyModel().cuda(local_rank)
model = DDP(model, device_ids=[local_rank])
dataset = MyDataset(...)
sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
dataloader = DataLoader(dataset, sampler=sampler, batch_size=32)
for epoch in range(num_epochs):
sampler.set_epoch(epoch) # シャッフルに必須
for batch in dataloader:
...
dist.destroy_process_group()
7.2 DeepSpeed(マルチノード)
#!/bin/bash
#SBATCH --job-name=deepspeed-train
#SBATCH --partition=gpu
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:8
#SBATCH --cpus-per-task=64
#SBATCH --mem=0
#SBATCH --exclusive
#SBATCH --time=96:00:00
export MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1)
export MASTER_PORT=$(( RANDOM % (50000 - 30000 + 1) + 30000 ))
export NNODES=$SLURM_NNODES
export NUM_PROCESSES=$(( NNODES * 8 ))
srun bash -c 'accelerate launch \
--main_process_ip $MASTER_ADDR \
--main_process_port $MASTER_PORT \
--machine_rank $SLURM_NODEID \
--num_processes $NUM_PROCESSES \
--num_machines $NNODES \
--use_deepspeed \
--zero_stage 2 \
--mixed_precision fp16 \
train.py \
--model_name_or_path meta-llama/Llama-2-7b \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8'
7.3 Horovod(MPI ベース)
#!/bin/bash
#SBATCH --job-name=horovod-train
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=4
#SBATCH --gres=gpu:4
module load openmpi/4.1.5 cuda/12.2
srun --mpi=pmix python train_horovod.py --epochs 100 --batch-size 64
8. コンテナ統合
8.1 Singularity / Apptainer
#!/bin/bash
#SBATCH --job-name=container_job
#SBATCH --gres=gpu:1
#SBATCH --time=04:00:00
# --nv フラグで GPU サポート
srun singularity exec --nv \
--bind /scratch/$USER:/data \
--bind /shared/datasets:/datasets \
/shared/containers/pytorch_24.03.sif \
python train.py --data /datasets/imagenet
8.2 Enroot + Pyxis(NVIDIA)
Enroot は NVIDIA の軽量コンテナランタイムであり、Pyxis は Slurm の SPANK プラグインとして srun --container-* フラグを提供する。
#!/bin/bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=8
#SBATCH --gres=gpu:8
#SBATCH --exclusive
srun --container-image=nvcr.io/nvidia/pytorch:24.03-py3 \
--container-mounts=/shared/data:/data,/scratch/$USER:/workspace \
--container-workdir=/workspace \
torchrun \
--nnodes=$SLURM_NNODES \
--nproc_per_node=8 \
--rdzv_backend=c10d \
--rdzv_endpoint=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1):29500 \
train.py --data /data
NVIDIA DGX SuperPOD および DGX Cloud で広く利用されている。
9. 設定(slurm.conf)
9.1 主要設定パラメータ
# クラスター識別
ClusterName=my_cluster
SlurmctldHost=controller01
SlurmctldHost=controller02 # バックアップコントローラー
# 認証
AuthType=auth/munge
# スケジューリング
SchedulerType=sched/backfill
SelectType=select/cons_tres # 追跡可能な消費型リソース
SelectTypeParameters=CR_Core_Memory
PriorityType=priority/multifactor
PriorityWeightAge=1000
PriorityWeightFairshare=10000
PriorityWeightJobSize=500
PriorityWeightQOS=2000
PriorityDecayHalfLife=7-0 # 7日間
# リソース管理
ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup,task/affinity
GresTypes=gpu,mps,shard
# アカウンティング
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageTres=gres/gpu
# ジョブのデフォルト値
DefMemPerCPU=4096 # 4GB
MaxMemPerCPU=16384 # 16GB
DisableRootJobs=YES
MpiDefault=pmix_v4
# ノード定義
NodeName=compute[001-100] CPUs=64 RealMemory=256000 State=UNKNOWN
NodeName=gpu[001-032] CPUs=128 RealMemory=1024000 Gres=gpu:a100:8 Feature=a100,nvlink
# パーティション定義
PartitionName=compute Nodes=compute[001-100] Default=YES MaxTime=7-00:00:00
PartitionName=gpu Nodes=gpu[001-032] MaxTime=3-00:00:00 AllowGroups=gpu-users
PartitionName=debug Nodes=compute[001-004],gpu[001-002] MaxTime=01:00:00 PriorityTier=100
9.2 cgroup.conf
ConstrainCores=yes # CPU コアピニング
ConstrainRAMSpace=yes # メモリ上限を強制
AllowedRAMSpace=100 # 割り当てメモリの %(超過時は OOM Kill)
ConstrainSwapSpace=yes
ConstrainDevices=yes # デバイス隔離(GPU)
10. 高度な機能
10.1 Backfill スケジューリング
Slurm の補助スケジューリングループ。短い低優先度ジョブが長い高優先度ジョブの開始を遅延させない限り、先に実行されることを許可する。
SchedulerType=sched/backfill
SchedulerParameters=bf_interval=30,bf_resolution=300,bf_max_job_test=1200
効果的に機能させるには、ジョブの制限時間(--time)の指定が必須である。
10.2 Preemption(プリエンプション)
# slurm.conf
PreemptType=preempt/qos
PreemptMode=REQUEUE # CANCEL, REQUEUE, SUSPEND, GANG
PreemptExemptTime=00:05:00 # プリエンプション前の猶予時間
| モード | 動作 |
|---|---|
| CANCEL | 低優先度ジョブを終了 |
| REQUEUE | 可能であれば再キュー、不可であれば取り消し |
| SUSPEND | ジョブを一時停止 |
| GANG | タイムシェアリング |
10.3 Job Array の大規模投入
# 1000タスク、最大50同時実行
sbatch --array=0-999%50 sweep.sh
# 環境変数: SLURM_ARRAY_JOB_ID, SLURM_ARRAY_TASK_ID
# MaxArraySize: 最大 4,000,001(設定可能)
11. モニタリングとトラブルシューティング
11.1 診断コマンド
scontrol ping # コントローラーへの接続テスト
sdiag # スケジューラー診断(スレッド、キュー、バックフィルサイクル)
scontrol show node X # ノード状態の確認
sacct -j ID --format=JobID,Elapsed,TotalCPU,ReqMem,MaxRSS,State # ジョブ効率
11.2 よくある問題と解決策
| 問題 | 診断 | 解決策 |
|---|---|---|
| ノードが DRAIN | scontrol show node | 問題修正後に scontrol update NodeName=X State=RESUME |
| ジョブが PENDING | squeue -j ID -o "%R"(Reason 確認) | リソース、パーティション上限、QoS、依存関係を確認 |
| GPU 未検出 | slurmd -C、slurmd -G | ドライバー、gres.conf の AutoDetect、デバイスファイルを確認 |
| OOM Kill | sacct --format=MaxRSS,ReqMem | より多くのメモリを要求するか、cgroup 上限を調整 |
| slurmctld 過負荷 | sdiag(スレッド数) | RPC レート制限、ポーリング頻度の削減 |
11.3 よくある PENDING 理由
| 理由 | 意味 |
|---|---|
| Resources | リソース待ち |
| Priority | より高い優先度のジョブが先にある |
| Dependency | 依存ジョブの完了待ち |
| QOSMaxJobsPerUserLimit | QoS のジョブ数上限に到達 |
| PartitionTimeLimit | 要求時間がパーティション上限を超過 |
| ReqNodeNotAvail | 要求したノードが利用不可 |
12. 他のスケジューラーとの比較
| 特性 | Slurm | PBS Pro / Torque | IBM LSF | Kubernetes |
|---|---|---|---|---|
| ライセンス | GPL v2(オープンソース) | AGPL / 商用 | 商用(IBM) | Apache 2.0 |
| 主な用途 | HPC、AI 学習 | HPC、従来型バッチ | エンタープライズ HPC | クラウドマイクロサービス |
| スケーラビリティ | 100K+ ノード | 50K+ | 100K+ | 5K+ |
| GPU サポート | ネイティブ GRES、MIG、MPS | フックベース | GPU-aware | Device Plugin |
| MPI サポート | ネイティブ(PMIx) | ネイティブ | ネイティブ | MPI Operator |
| Fairshare | 内蔵 | Maui/Moab が必要 | 内蔵 | 非搭載 |
| TOP500 採用率 | 約 60〜65% | 約 10〜15% | 約 10〜15% | まれ |
トレンド:Slurm(学習)+ Kubernetes(推論/サービング)のハイブリッド構成が主流
13. References
公式ドキュメント
- Slurm 公式ドキュメント — 全機能の基準リファレンス
- Quick Start User Guide
- Quick Start Admin Guide
- Slurm GRES Scheduling
- Slurm Job Array
- Slurm Containers Guide
- Slurm Configuration Tool — Web ベースの slurm.conf 生成ツール
- Slurm Rosetta Stone (PDF) — PBS/LSF/SGE コマンド対照表
- GitHub: SchedMD/slurm
AI/ML 分散学習
- PyTorch DDP Multi-Node Slurm Examples
- PyTorch Multi-Node Training Tutorial
- NVIDIA DGX Cloud DeepSpeed Examples
- Multi-Node Training on Slurm (GitHub Gist)