srunでntasksで指定する場合の注意事項。sbatchとはコンテキストが異なるため、1ノードのcpuを100%活かせない可能性がある。
| 登録日 | :2025/10/06 05:01 |
|---|---|
| カテゴリ | :SLURM |
srunで--ntasks(または--ntasks-per-node)のみを指定した場合、割り当てられたノードのCPUコアがすべて有効活用されないケースがあります。
その理由と挙動の違いについて説明します。
Slurmのntasks(タスク数)の意味
ntasksは「起動されるプロセスの数」を指定します(例:MPIのrankやプロセス単位)。
各タスクがデフォルトで1コアしか使わないため、ノードの全CPUを活用したい場合は不十分な場合があります。
なぜCPUを100%使えないか
ノードに例えば32コアがあり、--ntasks=2だけ指定した場合、
2つのプロセス(タスク)が2コアずつ使う、わけではなく
多くの場合、それぞれ1コアだけ割り当てられる(デフォルトcpus-per-task=1、残りのコアはアイドル状態)
つまりノード単位で「要求したタスク数を分配」する動きになる
Slurmは各タスクにcpus-per-task数だけコアを占有させる設計なので、明示的に多コアが必要な場合は--cpus-per-taskも指定してください
解決方法
ノードの全コアを100%使用したい場合は、下記のように明示的に--cpus-per-taskを加える
例(32コアノードの場合):
text
srun --ntasks=1 --cpus-per-task=32
1プロセスだけ起動し、その1つが32コア(全て)使います(OpenMPやマルチスレッド用途)
逆に「並列プロセス型(MPI)」なら--ntasks-per-node=32で各ノード全コア使う構成も可能
text
srun --ntasks-per-node=32 --nodes=1
挙動の背景
sbatchはジョブバッチ投入、srunはインタラクティブ実行ですが、リソース割り当ての原理自体は同じ
ただしsrunはその場でノードへ直接コマンドを分配するため、ノードの利用率を意識する必要があります
必要なプロセス数×必要なコア数を--ntasksと--cpus-per-taskで指定して初めて、意図通り「全コア占有」できる動きになる
タスクのバインディング(どのコアを当てるか)はSlurmの設定(task/affinity等)に依存します
【まとめ】
srunで--ntasksだけ指定だと「プロセス数だけ」立ち上がり、各プロセスはデフォルト1コアしか使わない
ノードの全CPUコアをフル活用したい場合は、--cpus-per-taskまたは--ntasks-per-nodeの値を適切に増やして指定する必要がある
プログラムの並列度(MPIなのかOpenMPなのか)に合わせたリソース割当で、計算ノードの利用率を調整してくださいntasks や ntasks-per-node だけの指定では、srunは単純に「プロセス(タスク)数」だけ起動し、各タスクはデフォルトで 1 コアしか割り当てません。そのため、ノードに多数の CPU コア(例:32 コア)があっても、その全てを自動的に使い切るとは限りません。ノードに2タスクだけ割り当てても各タスクが1コアなら、他のコアは遊んでしまうという状況です。
コンテキストの違い・よくある誤解
mpi系プログラム(多プロセス型):ntasks や ntasks-per-node をコア数分だけ多く指定すれば全コアがプロセスで埋まる
OpenMPやマルチスレッド型アプリ:ntasks=1で cpus-per-task=全コアが基本。ntasksだけだと1コアしか使わない
解決策
全コア使いたい場合は --cpus-per-task を併用すること
例:32コアノードをフル活用したいなら
text
srun --ntasks=1 --cpus-per-task=32
あるいは
text
srun --ntasks-per-node=32
で各ノード32プロセス起動(各タスク1コア利用)
Slurmのプロセス(タスク)とCPUコアの対応は自動ではなく、--cpus-per-taskを指定しないと「各タスクが使えるコア数」は1のままとなります。このため、ノードのCPU資源を使い切りたい場合は、srun実行時のリソース指定を意図した並列モデルに合わせて設計してください。