为具有超线程的节点正确设置Slurm

时间:2019-07-19 02:09:19

标签: multithreading slurm

我们正在尝试为我们的集群找出最佳的配置,其中大多数节点的架构类似于Procs=48 CoresPerSocket=12 Sockets=2 ThreadsPerCore=2。 我们正在考虑允许2个不同的作业共享使用每个内核中的2个线程,但是我们无法确定什么是正确的设置,或者是否建议使用此设置。

ThreadsPerCore manual entry有点误导: “单个物理核心中的逻辑线程数(例如“ 2”)。请注意,Slurm可以为核心分辨率以下的作业分配资源。如果您的系统每个核心配置了多个线程,则执行除非您配置SelectTypeParameters = CR_CPU加CPU;不配置Sockets,CoresPerSocket或ThreadsPerCore,否则不支持每个线程上的不同作业;一个作业可以在一个作业步骤中为每个线程执行一个任务,或者在每个作业步骤中执行不同的作业步骤。还请注意,如果每个内核运行的线程数超过1个,并且运行select / cons_res或select / cons_tres插件,则将SelectTypeParameters变量设置为CR_CPU以外的变量,以避免出现意外结果,默认值为1。 。”

最后一句话似乎是“每个内核有1个以上线程的CR_CPU会发生意外结果”,而前一句话似乎是“如果每个内核有1个以上线程,则需要使用CR_CPU”,这听起来直接矛盾。还是我们应该理解以下内容:“如果您的系统每个内核运行的线程数超过1,并且您希望在每个线程上执行不同的作业,则应配置SelectTypeParameters = CR_CPU(具有select / cons_res)并设置值个CPU(不设置Sockets,CoresPerSocket或ThreadsPerCore),但最终结果可能会出乎意料”?

我们当前的设置如下(slurm.conf的摘录):

# SCHEDULING
SelectType=select/cons_res
SelectTypeParameters=CR_Core
# Nodes
NodeName=node[01-08]  Procs=48 CoresPerSocket=12 RealMemory=257853 Sockets=2 ThreadsPerCore=2 Weight=20 Gres=gpu:8
# Partitions
PartitionName=defq Default=YES MinNodes=1 AllowGroups=ALL PriorityJobFactor=1 PriorityTier=1 DisableRootJobs=NO RootOnly=NO Hidden=NO Shared=NO GraceTime=0 PreemptMode=OFF ReqResv=NO AllowAccounts=ALL AllowQos=ALL LLN=NO ExclusiveUser=NO OverSubscribe=FORCE:2 OverTimeLimit=0 State=UP Nodes=node[01-08]
PartitionName=cpu Default=NO MinNodes=1 AllowGroups=ALL PriorityJobFactor=1 PriorityTier=1 DisableRootJobs=NO RootOnly=NO Hidden=NO Shared=NO GraceTime=0 PreemptMode=OFF ReqResv=NO AllowAccounts=ALL AllowQos=ALL LLN=NO MaxCPUsPerNode=32 ExclusiveUser=NO OverSubscribe=FORCE:2 OverTimeLimit=0 State=UP Nodes=node[01-08]

请注意,在cpu分区中,我们将“ CPU”(即此处的线程)数限制为32,以便为GPU作业保留一些CPU。

在我们当前的设置下,分配的线程似乎超出了应有的数量。我们的大多数用户只要求一个线程,但是由于CR_Core设置,他们被分配了一个完整的内核(2个线程)。但是,slurm似乎并没有使用分配的数量来计数分配的CPU,而是使用请求的数量,即使后来对其进行了四舍五入,因此最终我们要运行32个2线程作业。

我们应改为使用以下内容:

# SCHEDULING
SelectType=select/cons_res
SelectTypeParameters=CR_CPU
# Nodes
NodeName=node[01-08]  CPUs=48 RealMemory=257853 Weight=20 Gres=gpu:8
# Partitions
PartitionName=defq Default=YES MinNodes=1 AllowGroups=ALL PriorityJobFactor=1 PriorityTier=1 DisableRootJobs=NO RootOnly=NO Hidden=NO Shared=NO GraceTime=0 PreemptMode=OFF ReqResv=NO AllowAccounts=ALL AllowQos=ALL LLN=NO ExclusiveUser=NO OverSubscribe=NO OverTimeLimit=0 State=UP Nodes=node[01-08]
PartitionName=cpu Default=NO MinNodes=1 AllowGroups=ALL PriorityJobFactor=1 PriorityTier=1 DisableRootJobs=NO RootOnly=NO Hidden=NO Shared=NO GraceTime=0 PreemptMode=OFF ReqResv=NO AllowAccounts=ALL AllowQos=ALL LLN=NO MaxCPUsPerNode=32 ExclusiveUser=NO OverSubscribe=NO OverTimeLimit=0 State=UP Nodes=node[01-08]

最重要的是,建议这样做还是我们应该避免在作业之间使用超线程?

注意:

  • 我发现a post在谈论这样的设置,但是没有讨论是否建议这样做,也没有讨论Slurm手册。
  • 我尝试asking SchedMD来澄清他们的文档,但是他们告诉我应该支付支持费用。我认为我的问题很笼统,应该在特定支持合同之外解决。

谢谢

0 个答案:

没有答案