如何配置srun选项实现非排他模式下多任务并行并等待全部完成?
解决方案
问题描述
用户现有如下Slurm sbatch脚本(集群每个节点含128核):
#!/bin/tcsh #SBATCH --nodes=5 srun -n 1 -c 1 ./exec opt1 srun -n 1 -c 1 ./exec opt2 srun -n 1 -c 1 ./exec opt3 srun -n 1 -c 1 ./exec opt4 srun -n 1 -c 1 ./exec opt5 srun -n 1 -c 1 ./exec opt6 srun -n 1 -c 1 ./exec opt7 srun -n 1 -c 1 ./exec opt8 srun -n 1 -c 1 ./exec opt9 srun -n 1 -c 1 ./exec opt10 srun -n 640 ./program.x
当前脚本中前10条srun命令为顺序执行,全部完成后才会运行最后的srun -n 640 ./program.x。由于这10个任务互不依赖,且当前节点默认排他模式(最多同时运行5个任务),改为非排他模式让任务并行执行效率更高,且用户无法确定各任务耗时,需要修改脚本实现10个srun同时运行,等待全部完成后再执行后续程序。
修改后的脚本及选项说明
只需对前10条srun命令添加关键设置,结合shell命令实现需求:
- 给每个
srun添加--exclusive=no选项,取消排他模式,允许同一节点同时运行多个任务 - 每个
srun命令末尾加&,让任务后台运行 - 在10条后台任务后添加
wait命令,等待所有后台任务完成后再执行后续程序
修改后的完整脚本:
#!/bin/tcsh #SBATCH --nodes=5 srun --exclusive=no -n 1 -c 1 ./exec opt1 & srun --exclusive=no -n 1 -c 1 ./exec opt2 & srun --exclusive=no -n 1 -c 1 ./exec opt3 & srun --exclusive=no -n 1 -c 1 ./exec opt4 & srun --exclusive=no -n 1 -c 1 ./exec opt5 & srun --exclusive=no -n 1 -c 1 ./exec opt6 & srun --exclusive=no -n 1 -c 1 ./exec opt7 & srun --exclusive=no -n 1 -c 1 ./exec opt8 & srun --exclusive=no -n 1 -c 1 ./exec opt9 & srun --exclusive=no -n 1 -c 1 ./exec opt10 & wait srun -n 640 ./program.x
核心设置解释
--exclusive=no:覆盖节点默认的排他模式,允许已分配的节点上同时运行多个srun任务,充分利用单节点128核的资源,让10个单核任务并行执行&:将单个srun任务放到后台启动,实现多任务同时运行wait:阻塞脚本执行流程,直到所有后台的srun任务全部结束,才继续执行最后的大规模并行任务
若集群中--share是--exclusive=no的等价选项,也可以替换使用,效果一致。
内容的提问来源于stack exchange,提问作者byrdman1982
相关产品推荐
相关产品推荐

