如何在Slurm GPU集群节点上为GPU作业预留CPU资源?
解决方案
针对Slurm集群中CPU作业占满节点导致GPU闲置的问题,以下是几种可落地的配置方案:
1. 节点级CPU预留(推荐)
利用Slurm的ReservedCPUs参数在每个GPU节点上固定预留4核给GPU作业,CPU分区的作业无法使用这些预留核,从根源上避免GPU作业因无CPU资源排队。
配置步骤:
- 修改
slurm.conf中的节点定义,为每个GPU节点添加ReservedCPUs参数(适配不同核数的节点):# 8核1GPU节点:预留前4核 NodeName=node01 CPUs=8 Gres=gpu:1 ReservedCPUs=0-3 RealMemory=64000 State=UP # 32核4GPU节点:同样预留前4核 NodeName=node02 CPUs=32 Gres=gpu:4 ReservedCPUs=0-3 RealMemory=256000 State=UP - 创建两个独立分区,区分CPU和GPU作业:
# CPU分区:仅使用非预留CPU,设为非默认分区 PartitionName=cpu_part Nodes=node[01-02] Default=NO MaxTime=7-00:00:00 State=UP # GPU分区:允许使用预留CPU和GPU,设为默认分区(可根据业务调整) PartitionName=gpu_part Nodes=node[01-02] Default=YES MaxTime=2-00:00:00 State=UP - 重启Slurm服务使配置生效:
scontrol reconfigure srun -N all scontrol update nodename=$HOSTNAME state=idle
该方案适配不同核数的节点,配置逻辑清晰,无需依赖动态计算,是解决此类问题最直接的方式。
2. GPU作业优先级与抢占(可选)
如果GPU作业时效性要求高,可配置优先级抢占机制,让GPU作业优先获取资源,必要时终止低优先级的CPU作业释放资源。
配置步骤:
- 在
slurm.conf中启用抢占功能:PreemptType=preempt/partition_prio PreemptMode=REQUEUE # 被抢占的CPU作业会重新排队,而非直接终止 - 为GPU分区设置更高优先级:
PartitionName=gpu_part Priority=1000 ... PartitionName=cpu_part Priority=100 ... - (可选)通过QoS细化规则,给不同类型作业分配优先级:
QOSName=gpu_high Priority=1000 PreemptMode=REQUEUE QOSName=cpu_low Priority=100 Preemptable=YES
此方案需权衡CPU作业的稳定性,适合GPU作业优先级远高于CPU作业的场景。
3. 作业提交约束(辅助手段)
通过提交脚本和权限限制,强制作业分流到对应分区,避免误提交导致的资源抢占:
- GPU作业脚本中明确指定分区和资源需求:
#SBATCH --partition=gpu_part #SBATCH --cpus-per-task=1 # 匹配GPU作业仅需少量CPU的需求 #SBATCH --gres=gpu:1 - CPU作业脚本中指定CPU分区:
#SBATCH --partition=cpu_part - (可选)通过Slurm账户权限,限制不同用户组只能提交对应分区的作业,减少人为误操作。
内容的提问来源于stack exchange,提问作者Atomjack
相关产品推荐
相关产品推荐

