Ubuntu 18.04单节点SLURM无法并行运行任务求助
看起来你遇到的核心问题是SLURM的任务管理插件配置不正确,导致无法正确分配CPU资源,进而让任务被迫串行执行。咱们一步步来排查和修复:
1. 修复SLURM核心配置(slurm.conf)
你的slurm.conf里有一个关键错误:
TaskPlugin=task/none
task/none意味着SLURM完全不进行任务的CPU绑定和资源隔离,这会导致第一个启动的srun进程直接占用节点的所有CPU资源,后续任务因资源不足只能排队等待。
修改方法:
编辑你的SLURM配置文件(通常路径是/etc/slurm-llnl/slurm.conf),将这一行替换为:
TaskPlugin=task/affinity
这个插件允许SLURM管理任务与CPU核心/线程的绑定关系,确保多个任务可以并行分配到不同的资源上。
另外,你的SelectTypeParameters=CR_Core是合理的(按核心分配资源),如果想充分利用超线程(每个核心2线程)来运行更多并行任务,可以改为:
SelectTypeParameters=CR_Thread
这样每个任务会占用1个线程,你的8线程节点就能同时运行8个单线程任务。
2. 重启SLURM服务使配置生效
修改配置后,必须重启SLURM的控制和节点服务才能让新配置生效:
sudo systemctl restart slurmctld sudo systemctl restart slurmd
3. 使用正确的任务提交脚本
你之前用多个srun加&的方式并不符合SLURM的最佳实践,还容易引发资源分配冲突。推荐用更简洁规范的提交脚本:
#!/bin/bash #SBATCH --nodes=1 #SBATCH --ntasks=3 #SBATCH --cpus-per-task=1 # 用srun一次性启动所有并行任务,%t会自动替换为任务编号(0,1,2) srun python demo.py %t
提交这个脚本:
sbatch your_submit_script.sh
这样SLURM会自动帮你并行启动3个任务,每个任务分配1个CPU核心(或线程,取决于你之前的SelectTypeParameters配置)。
4. 验证修复效果
提交任务后,用以下命令查看任务状态和资源分配:
squeue -o "%N %c %t %J"
你应该能看到3个任务都处于RUNNING状态,每个任务占用1个CPU资源。
为什么之前的--oversubscribe无效?
--oversubscribe需要SLURM有正确的任务管理插件支持,当TaskPlugin=task/none时,SLURM无法识别资源分配规则,这个参数自然无法生效。
内容的提问来源于stack exchange,提问作者Samuele Cornell

