如何在Slurm中基于最大作业数用srun串行运行批量作业?
实现Slurm作业分批次串行提交(单srun作业、并发数限制)
方法一:通过Slurm用户配额配置(需管理员权限)
如果有集群管理员权限,可直接配置Slurm限制用户最大并行作业数,提交的作业会自动排队,达到并发上限后,后续作业等待已有作业完成再启动。
- 配置用户配额:
- 若要全局设置所有用户的最大并行作业数,修改Slurm主配置文件
slurm.conf:MaxJobsPerUser=50 - 若仅针对特定用户配置,先确保
slurm.conf中开启了记账限制:
再通过AccountingStorageEnforce=limitssacctmgr设置用户配额:sacctmgr modify user name=orion set MaxJobs=50
- 若要全局设置所有用户的最大并行作业数,修改Slurm主配置文件
- 重载Slurm配置使修改生效:
scontrol reconfigure - 批量提交作业:
直接循环提交所有srun命令即可,Slurm会自动控制并发数:
此时最多50个作业同时运行,剩余作业处于for i in {1..200}; do srun --job-name=sim_$i your_simulation_command & done waitPENDING状态,每完成一个作业自动启动下一个,实现动态分批。
方法二:本地脚本控制并发提交(无需管理员权限)
如果没有管理员权限,可通过脚本或工具控制srun的并发提交数量,模拟task spooler的-s N功能。
用GNU Parallel实现
- 确保集群已安装GNU Parallel(无权限安装可联系管理员)。
- 创建作业命令列表文件
job_list.txt,每行一个srun命令:srun --job-name=sim_1 your_simulation_command srun --job-name=sim_2 your_simulation_command ... srun --job-name=sim_200 your_simulation_command - 启动并发控制:
Parallel会自动维护作业队列,同时运行最多50个parallel --jobs 50 < job_list.txtsrun任务,完成一个立即启动下一个,直至所有作业执行完毕。
纯Shell脚本实现(无需额外工具)
编写Shell脚本严格分批次提交:
#!/bin/bash MAX_PARALLEL=50 counter=0 for i in {1..200}; do srun --job-name=sim_$i your_simulation_command & counter=$((counter + 1)) # 达到最大并发数时,等待当前批次全部完成 if [ $counter -ge $MAX_PARALLEL ]; then wait counter=0 fi done # 等待最后一批作业完成 wait
该脚本会每提交50个作业后等待全部完成,再提交下一批,严格分成4批执行。
注意事项
- 确保每个
srun命令的资源请求(CPU、内存等)符合集群配置,避免因资源不足导致作业长期pending。 - Slurm配额或Parallel的方法是动态补位(完成一个启动一个),比纯Shell脚本的严格分批次效率更高。
内容的提问来源于stack exchange,提问作者Orion Black
相关产品推荐
相关产品推荐

