Slurm数组任务虚拟核调度异常:仅25任务并行问题排查
问题分析与解决方案
核心错误点
--ntasks=1参数冲突:该参数限制了整个作业的总任务数为1,与数组任务的并行调度逻辑矛盾,导致Slurm无法调度更多并行任务。--ntasks-per-core=1浪费超线程:你的物理核每个包含2个虚拟核,这个参数强制每个物理核仅运行1个任务,相当于把50个虚拟核的额度压缩为25个物理核的可用数,因此只能跑25个并行任务。- 未明确数组并行上限:默认情况下Slurm不会自动用满QoS分配的CPU额度,需要显式指定数组的最大并行数。
修改后的脚本配置
#!/bin/bash #SBATCH --job-name=test #SBATCH --qos=cpus50 #SBATCH --array=1-100%50 # 明确指定最多50个任务并行 #SBATCH --cpus-per-task=1 #SBATCH --nodes=1 #SBATCH --open-mode=append #SBATCH --output=%x.out python3 -c "import os, time; jobid = int(os.getenv('SLURM_ARRAY_TASK_ID')); start = f'JOBID:{jobid:04d} | Start {time.ctime()}'; time.sleep(10); print(f'{start} | End {time.ctime()} |')"
关键调整说明
- 移除
--ntasks=1:数组任务的调度不需要全局任务数限制,移除后Slurm能正确识别每个数组元素为独立任务。 - 移除
--ntasks-per-core=1(或设置为--ntasks-per-core=2):允许每个物理核利用超线程运行2个任务,让50个虚拟核对应50个并行任务。 - 添加
%50到--array参数:显式告知Slurm同时运行最多50个数组任务,刚好匹配QoS分配的50虚拟核额度。
验证方法
提交修改后的脚本后,用squeue -u $USER查看任务状态,应能看到最多50个任务处于RUNNING状态,总耗时会接近预期的20秒左右。
内容的提问来源于stack exchange,提问作者Paloha
相关产品推荐
相关产品推荐

