ノード制約のないSLURMスケジュールタスク
非常にビジーなGPUクラスターでジョブをスケジュールする必要があります。私はノードについてはあまり気にせず、GPUについてはもっと気にします。私のコードの構造では、各ジョブは一度に1つのGPUしか使用できず、複数のGPUを使用するように通信します。私たちは、一般的にこのような何かをスケジュールする方法が行うことでありgpus_per_task=1
、ntasks_per_node=8
、nodes=<number of GPUs you want / 8>
各ノードが8つのGPUを有しているからです。
すべての人が8つのGPUを必要とするわけではないため、いくつか(<8)のGPUが配置されているノードがよくあります。これは、私のパラメーターを使用してスケジュールすることはできません。私はノードを気にしないので、32個のタスクが必要で、それを実行するために使用するノードの数を気にしないことをslurmに伝える方法はありますか?
たとえば、2つのGPUが残っている1台のマシンで2つのタスクを実行し、残りの30を完全にフリーのノードまたはクラスターをより有効に活用するために実行可能なその他のノードに分割したい場合です。
ntasks
これを行う可能性のあるパラメータがあることは知っていますが、ドキュメントはそれについて少し混乱しています。それは述べています
デフォルトはノードごとに1つのタスクですが、-cpus-per-taskオプションによってこのデフォルトが変更されることに注意してください。
これとは何の関係がcpus_per_task
ありますか?
私も見ました
--ntasksオプションと一緒に使用すると、-ntasksオプションが優先され、-ntasks-per-nodeはノードあたりのタスクの最大数として扱われます。
しかし、私もこの相互作用について混乱しています。これは、私が要求した場合--ntasks=32
--ntasks-per-node=8
、1台のマシンに最大8つのタスクを配置するが、決定した場合はそれより少なくなる可能性があることを意味します(基本的にこれが私が望むものです)
回答
試してみてください--gpus-per-task 1
と--ntasks 32
。ノードごとのタスクまたはノード数が指定されていません。これにより、slurmはタスクをノード間で必要に応じて分散し、十分に活用されていないノードで残りのGPUを使用できます。また、使用可能なGPUが8つしかないため、1つのノードに8つ以上のタスクを配置することはありません。
ntasks
対についてcpus-per-task
:これはあなたの場合は問題ではないはずです。デフォルトでは、タスクは1つのCPUを取得します。使用--cpus-per-tasks x
する場合、x個のCPUが1つのノード上にあることが保証されます。これは--ntasks
、タスクが分散されていると言うだけでは当てはまりませんが、slurmが決定します。ある例のドキュメントでは、このためには。
警告:すべての--gpuオプションが追加されているため、これにはslurm> = 19.05のバージョンが必要です。