SBATCH脚本多节点并行任务异常:任务串行于单节点的解决方法
修复SBATCH脚本任务分布问题
你的脚本问题在于循环中逐个调用srun的方式没有利用SLURM预先申请的多节点资源,导致所有任务被调度到单个节点。以下是两种可行的修复方案:
方案一:用单个srun批量启动所有任务(推荐)
利用SLURM的任务分配机制,直接一次性启动40个任务,自动分布到8个节点(每个节点5个任务),同时用SLURM内置变量区分每个任务的配置文件:
#SBATCH --job-name=nrm3 #SBATCH --partition=batch #SBATCH --nodes=8 #SBATCH --ntasks=40 #SBATCH --ntasks-per-node=5 #SBATCH --output=OUTPUTlognrm.3.log # 批量生成所有配置文件 for ((i = 0; i < 40; ++i)); do echo "config_params" > "config_${i}" done # 用单个srun启动40个任务,%t代表任务ID(0-39),对应生成的配置文件 srun -n40 --ntasks-per-node=5 java main "config_%t"
方案二:任务内动态生成配置文件(更简洁)
无需提前循环生成配置文件,让每个任务自行生成对应ID的配置文件:
#SBATCH --job-name=nrm3 #SBATCH --partition=batch #SBATCH --nodes=8 #SBATCH --ntasks=40 #SBATCH --ntasks-per-node=5 #SBATCH --output=OUTPUTlognrm.3.log # 每个任务生成自己的配置文件并运行Java程序 srun -n40 --ntasks-per-node=5 bash -c ' task_id=$SLURM_PROCID echo "config_params" > "config_${task_id}" java main "config_${task_id}" '
问题根源解释
原脚本中循环调用srun -N1 -n1 &时,每个srun会被SLURM当作独立的作业步调度。由于脚本在提交节点执行,这些作业步大概率会被集中调度到同一个节点(提交节点),且无法利用你预先申请的8节点资源池。而单个srun会直接使用SBATCH申请的全部资源,按照--ntasks-per-node=5的规则自动将任务分布到所有节点。
内容的提问来源于stack exchange,提问作者bettersayhello
相关产品推荐
相关产品推荐

