slurm.confを書く
目標
要件に合ったslurm.confを最初から作成し、整合性を検証するスクリプトを自分で作ります。
なぜ重要なのか
Slurmの設定ミスは、エラーが遅れて思わぬところに現れます。ノードがINVALやDOWNで外れ、ログに原因が1行出ているのに、それを見ないと何日も迷います。最もよくある2つは、CPUsがソケット×コア×スレッドと異なることと、パーティションが定義されていないノードを参照することです。どちらも人が手で計算するときに起きるミスで、どちらもスクリプトで事前に見つけられます。
実際のslurmdは動かしません。作成した設定と検証スクリプトを採点します。
このラボの要件
- クラスター名は
labhub-hpc、コントローラーのホストはctl01 - ノード3台:
gpu-node01からgpu-node03まで。それぞれソケット2 / ソケットあたりコア16 / コアあたりスレッド2 / メモリ257000MB / GPUはa100が4枚 - パーティション2つ:
batch(全ノード、既定、最大24時間)、short(全ノード、最大1時間)
ステップ
/etc/slurmと/root/slurmの2つのディレクトリを作成してください。/etc/slurm/slurm.confを作成し、次のキーを入れてください。ClusterName=labhub-hpc、SlurmctldHost=ctl01、SlurmUser=slurm、StateSaveLocation=/var/spool/slurmctld、SlurmdSpoolDir=/var/spool/slurmd、AuthType=auth/munge- スケジューリング関連のキーを追加してください。
SchedulerType=sched/backfill、SelectType=select/cons_tres、SelectTypeParameters=CR_Core_Memory、ProctrackType=proctrack/cgroup、TaskPlugin=task/cgroup,task/affinity - ノード3台を定義してください。各行は
NodeName=で始め、Sockets、CoresPerSocket、ThreadsPerCore、CPUs、RealMemory、Stateを含める必要があります。CPUsの値は、ソケット×コア×スレッドと一致している必要があります。 - パーティション2つを定義してください。
batchはDefault=YESとMaxTime=24:00:00、shortはMaxTime=01:00:00です。どちらのパーティションも、Nodes=に書いたノードがステップ4で定義したものである必要があります。 - ログとアカウント関連のキーを追加してください。
SlurmctldLogFile=/var/log/slurm/slurmctld.log、SlurmdLogFile=/var/log/slurm/slurmd.log、JobAcctGatherType=jobacct_gather/cgroup、ReturnToService=2 mungeユーザーとグループを作成し、/etc/munge/munge.keyを1024バイトのランダムデータで生成したうえで、権限を0400、所有者をmunge:mungeに設定してください。/root/slurm/validate.shを作成してください。最初の引数でslurm.confのパスを受け取り、次の2つのルールを検査します。違反がなければ終了コード0、あれば0以外の値で終了する必要があります。- ルール1: すべての
NodeName=行で、CPUsがSockets × CoresPerSocket × ThreadsPerCoreと等しいこと - ルール2: すべての
PartitionName=行のNodes=に出てくるノードが、NodeName=で定義されていること(範囲表記gpu-node[01-03]を展開して確認してください) 採点ツールが、あなたの/etc/slurm/slurm.conf(通過する必要があります)と/opt/fixtures/slurm/broken/slurm.conf(失敗する必要があります)の両方に対して実行します。
- ルール1: すべての
参考
- ランダムキーの生成:
dd if=/dev/urandom of=/etc/munge/munge.key bs=1 count=1024 - 範囲表記の展開:
gpu-node[01-03]→gpu-node01 gpu-node02 gpu-node03。bashのブレース展開やseqで処理できます。 - 実際のノードの値は、そのノードで
slurmd -Cを実行すればそのまま出ます。手計算より安全です。 - よくある間違い1: ステップ4で
CPUs=32のように計算を間違える場合です。2×16×2 = 64です。 - よくある間違い2: ステップ8のスクリプトが範囲表記を展開せず、正常な設定まで失敗と判定してしまう場合です。
設定ディレクトリを準備する
/etc/slurmと/root/slurmの2つのディレクトリを作成してください。
標準のパスは/etc/slurmです。作業用のディレクトリも別に作成してください。
基本のキーを書く
/etc/slurm/slurm.confを作成し、次のキーを入れてください。
ClusterName=labhub-hpc、SlurmctldHost=ctl01、SlurmUser=slurm、StateSaveLocation=/var/spool/slurmctld、SlurmdSpoolDir=/var/spool/slurmd、AuthType=auth/munge
クラスター名、コントローラーのホスト、実行アカウント、状態の保存先、認証方式が基本です。
スケジューラーとリソース選択
スケジューリング関連のキーを追加してください。
SchedulerType=sched/backfill、SelectType=select/cons_tres、SelectTypeParameters=CR_Core_Memory、ProctrackType=proctrack/cgroup、TaskPlugin=task/cgroup,task/affinity
GPUクラスターでは、リソースをコア単位に分ける選択プラグインが必要です。メモリも消費リソースに含める必要があります。
ノードを定義する
ノード3台を定義してください。各行はNodeName=で始め、Sockets、CoresPerSocket、ThreadsPerCore、CPUs、RealMemory、Stateを含める必要があります。CPUsの値は、ソケット×コア×スレッドと一致している必要があります。
CPUsはソケット×コア×スレッドと一致している必要があります。計算を2回確認してください。
パーティションを定義する
パーティション2つを定義してください。batchはDefault=YESとMaxTime=24:00:00、shortはMaxTime=01:00:00です。どちらのパーティションも、Nodes=に書いたノードがステップ4で定義したものである必要があります。
Nodesに書いたノードは、すべて定義されている必要があります。既定のパーティションは1つだけ指定します。
ログとアカウント
ログとアカウント関連のキーを追加してください。
SlurmctldLogFile=/var/log/slurm/slurmctld.log、SlurmdLogFile=/var/log/slurm/slurmd.log、JobAcctGatherType=jobacct_gather/cgroup、ReturnToService=2
コントローラーとノードそれぞれのログのパスが必要です。リソース収集のプラグインも指定してください。
mungeキーを準備する
mungeユーザーとグループを作成し、/etc/munge/munge.keyを1024バイトのランダムデータで生成したうえで、権限を0400、所有者をmunge:mungeに設定してください。
キーファイルの権限と所有者が正確であって初めて、mungedが起動します。サイズにも決まった値があります。
整合性を検証するスクリプト
/root/slurm/validate.shを作成してください。最初の引数でslurm.confのパスを受け取り、次の2つのルールを検査します。違反がなければ終了コード0、あれば0以外の値で終了する必要があります。
- ルール1: すべての
NodeName=行で、CPUsがSockets × CoresPerSocket × ThreadsPerCoreと等しいこと - ルール2: すべての
PartitionName=行のNodes=に出てくるノードが、NodeName=で定義されていること(範囲表記gpu-node[01-03]を展開して確認してください) 採点ツールが、あなたの/etc/slurm/slurm.conf(通過する必要があります)と/opt/fixtures/slurm/broken/slurm.conf(失敗する必要があります)の両方に対して実行します。
採点ツールが、正常な設定とフィクスチャの壊れた設定の両方に対して実行します。終了コードで区別してください。