SLURM单GPU作业独占节点,如何实现多作业共享单节点GPU?
解决SLURM单节点同时运行多单GPU作业的方案
嘿,这个问题我之前帮不少用户解决过——核心问题要么是你的作业默认占满了节点的CPU/内存资源,要么是集群节点默认设置了独占模式,导致其他单GPU作业没法在同一节点调度。下面给你一步步的优化方案:
一、先调整你的作业脚本参数
你的现有脚本只指定了GPU数量,但没限制CPU和内存,SLURM可能默认把整个节点的资源分给单个作业,导致其他作业进不来。修改后的脚本参考如下:
#!/bin/bash #SBATCH --gres=gpu:1 # 每个作业用1块GPU #SBATCH --ntasks-per-node=1 # 每个作业只跑1个任务 #SBATCH --cpus-per-task=4 # 给每个作业分配4核CPU(根据节点总CPU数调整:比如节点16核配4块GPU,每GPU对应4核刚好) #SBATCH --mem-per-gpu=8G # 限制每个GPU对应的内存(避免一个作业占满节点内存) #SBATCH --exclusive=no # 明确允许节点共享(如果集群默认是独占模式的话) #SBATCH -p ghp-queue # 指定目标队列 # 可选:打印分配的GPU,确认SLURM资源分配正确 echo "当前作业分配的GPU编号:$SLURM_STEP_GPUS" # 运行你的程序 ./myprog.exe
关键参数说明:
--cpus-per-task:必须设置!如果不指定,SLURM可能默认把节点所有CPU分给单个作业,其他作业就没CPU资源可调度了。--mem-per-gpu:避免单个作业吃光节点内存,导致其他作业因内存不足被拒绝调度。--exclusive=no:如果你的集群节点默认设置了Exclusive=yes(单作业独占节点),这个参数会强制允许节点共享。
二、检查集群节点的共享配置
如果改了脚本还是不行,那大概率是集群节点默认设置了独占模式,分两种情况处理:
如果你是集群管理员
可以修改节点的共享属性,让它允许多作业共享:
# 临时修改单个节点(SLURM重启后失效) scontrol update NodeName=你的节点名 Shared=yes # 永久修改(编辑slurm.conf文件,添加或修改对应配置) DefaultShared=yes # 或者针对特定节点单独设置 NodeName=你的节点名 Shared=yes
如果你是普通用户(无管理员权限)
直接联系集群管理员,说明需求:需要将ghp-queue队列对应的节点设置为共享模式,允许单GPU作业在同一节点并行运行。
三、验证优化是否生效
提交3-4个修改后的作业,用以下命令确认效果:
- 用
squeue查看作业是否分配到同一个节点:
squeue -u 你的用户名
如果多个作业的NODELIST列显示同一个节点,说明调度成功。
- 登录到该节点,用
nvidia-smi查看GPU使用情况:
ssh 节点名 nvidia-smi
应该能看到多个进程分别占用不同的GPU设备。
注意事项
- 一定要根据节点的实际硬件配置调整
--cpus-per-task和--mem-per-gpu:比如节点有24核CPU、4块GPU,那每作业分配6核CPU会更合理。 - 如果你的程序本身会占用大量CPU/内存,要适当调整资源分配,避免作业之间互相干扰导致性能下降。
内容的提问来源于stack exchange,提问作者ta8
相关产品推荐
相关产品推荐

