Bash 脚本 - 确保 slurm 上始终启动 N 个进程

Bash 脚本 - 确保 slurm 上始终启动 N 个进程

任务

在使用该命令在远程计算机上启动的 M 个作业/命令列表中srun,确保始终有 N 个任务正在运行或请求 (N<=M),直到所有 M 个作业都已启动。

动机

(包括在内,因为它可能会引起其他建议)。我必须运行一组模拟,目前我通过两步过程来完成。这两个步骤都基于包含MSTR_FILE有关模拟的基本信息:

  1. 第一步:根据 的内容MSTR_FILE,创建模拟所需的目录和文件
  2. 第二步:根据 的内容MSTR_FILE,现在为文件中的每个条目启动一个作业

第二步的基本循环如下所示:

for d in $(cat $MSTR_FILE | cut -d " " -f 1);do
   cd $d
   srun -p My_Queue $(cat sim_command_file)&
   cd ..
done

这工作正常,但是我的模拟设置 ( MSTR_FILE) 最终有 50 到 100 个条目,甚至可能更多。这样的循环只会遍历整个列表并获取资源,直到列表本身的末尾。在共享资源环境中,这并不是真正理想的:)

我的部分工作解决方案

我对脚本进行了修改,基本上wait直到完成一定数量的作业为止。脚本的相关部分如下所示:

N=10
swp_list=($(cat $MSTR_FILE | cut -d " " -f 1))
cnt=0
list_size=$(#{swp_list[@]})

while [ $cnt -lt $list_size ];do
   for i in $(seq 0 $N);do
       ix=$(($cnt+$i))
       if [ $ix -lt $list_size ];then
          d=${swp_list[ix]}
          cd $d
          srun -p My_Queue $(cat sim_command_file)&
          cd ..
       fi
    done
    wait
    ((cnt+=$N))
done

据我测试,这种方法似乎工作得很好,因为N一次只启动作业。然而,它也有一个严重的缺点:有时并非所有请求的作业都会N同时启动。其中一些作业在分配节点之前会等待很长时间。即使情况并非如此,某些模拟任务也可能需要比其他任务更长的时间,甚至显着延长。

我的部分工作解决方案无法解决任何问题:它只是等待N数据包中的所有作业完成。然而,我希望有一种queue总是充满下一个工作的内容MSTR_FILE,这样就不会浪费时间。

相关内容