如何在Slurm中用不同节点运行带不同参数i的.sh脚本?
解决Slurm多节点任务调度警告问题
错误原因
你遇到的警告can't run 1 processes on 10 nodes, setting nnodes to 1,本质是主Slurm脚本仅在分配的10个节点中的某一个上执行,循环内的srun默认会将所有任务调度到当前节点(主脚本运行的节点),导致10个任务挤在同一个节点上,Slurm因此自动调整节点数为1,浪费了其他申请的节点资源。
解决方案
方案1:使用Slurm作业数组(推荐)
作业数组是Slurm专门为批量处理独立任务设计的功能,能自动将每个任务分配到独立节点,写法更简洁规范:
#!/bin/bash #SBATCH --job-name=Name #SBATCH --array=1-10 # 创建10个独立任务,编号1到10 #SBATCH --nodes=1 # 每个数组任务占用1个节点 #SBATCH --ntasks=1 # 每个节点仅运行1个任务 #SBATCH --ntasks-per-node=1 # 用SLURM_ARRAY_TASK_ID获取当前数组任务的编号,替代原循环变量i ./gaia.sh $SLURM_ARRAY_TASK_ID date
提交后,Slurm会自动为每个数组任务(1到10)分配单独的节点,无需手动管理后台进程,所有任务并行执行。
方案2:修正循环+srun的节点分配逻辑
如果坚持使用原有的循环写法,需要手动指定每个srun对应的节点,确保任务分散到10个节点上:
#!/bin/bash #SBATCH --job-name=Name #SBATCH --nodes=10 #SBATCH --ntasks=10 #SBATCH --ntasks-per-node=1 # 获取当前作业分配的所有节点列表 NODES=$(scontrol show hostnames $SLURM_JOB_NODELIST) # 将节点列表转为数组,方便按索引调用 NODE_ARRAY=($NODES) # 循环遍历节点数组(索引0到9对应10个节点) for idx in {0..9} do # 计算任务编号,对应原有的i=1到10 task_id=$((idx + 1)) # 指定srun在对应节点上执行任务,--exclusive确保节点仅运行当前任务 srun --nodes=1 --nodelist=${NODE_ARRAY[$idx]} --exclusive ./gaia.sh $task_id & done # 等待所有后台启动的任务完成,避免主脚本提前退出导致任务被终止 wait date
这个方案中,我们先获取所有分配的节点,再给每个srun指定具体节点,强制任务分散到不同节点执行,最后用wait确保所有任务完成后才结束主脚本。
内容的提问来源于stack exchange,提问作者nikosvil
相关产品推荐
相关产品推荐

