如何在SLURM中为同一块GPU设备定义多个gres资源?
问题根因
Slurm原生GRES GPU插件默认以整卡为调度粒度,不允许为同一块物理GPU重复定义配置条目,你配置多条同设备条目触发了配置校验规则,就会返回fatal: Gres GPU plugin failed to load configuration报错。
通用实现方案
无需修改CUDA代码即可生效的方案有两种,可根据你的Slurm版本选择:
方案1:自定义GRES显存分片(全Slurm版本兼容,适用所有ML任务场景)
该方案为逻辑显存配额调度,是目前小显存ML任务共享GPU的主流落地方式:
- 首先修改
slurm.conf,新增自定义GRES类型:GresTypes=gpu,gpumem # 单卡16G就配置16份gpumem,2卡就配置32份,以此类推 NodeName=你的计算节点主机名 Gres=gpumem:16 - 再修改
gres.conf,配置gpumem和物理GPU的绑定规则,不需要重复定义GPU条目:# 单卡16G,拆分16份1G的gpumem配额,绑定到nvidia0和对应CPU核 Name=gpumem Type=1G File=/dev/nvidia0 CPUs=0-7 Count=16 # 如有第二块GPU,新增对应行即可 # Name=gpumem Type=1G File=/dev/nvidia1 CPUs=8-15 Count=16 - 提交任务时按需申请gpumem配额即可,比如需要2G显存就执行:
注:该方案默认是软配额,不会强制限制任务实际显存使用,如需硬隔离,可搭配NVIDIA MPS服务、cgroup显存限制或nvidia-docker运行任务。srun --gres=gpumem:2 python your_ml_script.py
方案2:Slurm原生GPU共享调度(20.02及以上版本支持)
如果使用较新版本的Slurm,可直接用原生支持的多实例调度功能,无需自定义GRES:
- 修改
slurm.conf添加以下配置:SelectType=select/cons_tres GresTypes=gpu TaskPlugin=task/affinity,task/cgroup - 修改
gres.conf,在GPU配置条目新增MultipleInstances=yes参数,允许同卡多任务共享:AutoDetect=nvml Name=gpu Type=对应GPU型号 File=/dev/nvidia0 CPUs=0-7 Count=1 MultipleInstances=yes # 多卡按同样格式新增配置行即可 - 重启slurmctld和slurmd服务后,提交任务时正常指定
--gpus-per-task=1即可,Slurm会自动调度多个任务到同一块GPU运行。
内容的提问来源于stack exchange,提问作者GDegottex
相关产品推荐
相关产品推荐

