You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Slurm中基于最大作业数用srun串行运行批量作业?

实现Slurm作业分批次串行提交(单srun作业、并发数限制)

方法一:通过Slurm用户配额配置(需管理员权限)

如果有集群管理员权限,可直接配置Slurm限制用户最大并行作业数,提交的作业会自动排队,达到并发上限后,后续作业等待已有作业完成再启动。

  1. 配置用户配额:
    • 若要全局设置所有用户的最大并行作业数,修改Slurm主配置文件slurm.conf:
      MaxJobsPerUser=50
      
    • 若仅针对特定用户配置,先确保slurm.conf中开启了记账限制:
      AccountingStorageEnforce=limits
      
      再通过sacctmgr设置用户配额:
      sacctmgr modify user name=orion set MaxJobs=50
      
  2. 重载Slurm配置使修改生效:
    scontrol reconfigure
    
  3. 批量提交作业:
    直接循环提交所有srun命令即可,Slurm会自动控制并发数:
    for i in {1..200}; do
        srun --job-name=sim_$i your_simulation_command &
    done
    wait
    
    此时最多50个作业同时运行,剩余作业处于PENDING状态,每完成一个作业自动启动下一个,实现动态分批。

方法二:本地脚本控制并发提交(无需管理员权限)

如果没有管理员权限,可通过脚本或工具控制srun的并发提交数量,模拟task spooler的-s N功能。

用GNU Parallel实现

  1. 确保集群已安装GNU Parallel(无权限安装可联系管理员)。
  2. 创建作业命令列表文件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
    
  3. 启动并发控制:
    parallel --jobs 50 < job_list.txt
    
    Parallel会自动维护作业队列,同时运行最多50个srun任务,完成一个立即启动下一个,直至所有作业执行完毕。

纯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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:24:27