【问题标题】:Do I need a single bash file for each task in SLURM?SLURM 中的每个任务都需要一个 bash 文件吗?
【发布时间】:2020-04-16 14:49:17
【问题描述】:

我正在尝试在 SLURM 管理的集群中启动多个任务,并希望避免处理数十个文件。 现在,我有 50 个任务(下标 i,为简单起见,i 也是我的程序的输入参数),每个任务都有一个 bash 文件 slurm_run_i.sh,它指示计算配置,以及 srun 命令:

#!/bin/bash
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1 
#SBATCH -J pltCV
#SBATCH --mem=30G

srun python plotConvergence.py i

然后我使用另一个 bash 文件来提交所有这些任务,slurm_run_all.sh

#!/bin/bash
for i in {1..50}:
  sbatch slurm_run_$i.sh 
done

这可行(集群上正在运行 50 个作业),但我发现输入文件超过 50 个很麻烦。搜索解决方案,我想出了 & 命令,得到的东西是:

#!/bin/bash

#SBATCH --ntasks=50
#SBATCH --cpus-per-task=1 
#SBATCH -J pltall
#SBATCH --mem=30G

# Running jobs 
srun python plotConvergence.py 1   &
srun python plotConvergence.py 2   & 
...
srun python plotConvergence.py 49  & 
srun python plotConvergence.py 50  & 
wait
echo "All done"

这似乎也在运行。但是,我无法独立管理这些作业中的每一个:squeue 的输出显示我有一个作业(pltall)在单个节点上运行。由于我正在工作的分区中的每个节点上只有 12 个核心,我假设我的大部分工作都在我被分配到的单个节点上等待。设置 -N 选项也不会改变任何东西。此外,如果我意识到有错误或其他事情,我不能再单独取消一些作业,这对我来说听起来有问题。

我的解释是否正确,有没有比我尝试在 slurm 中处理多个作业而不在许多文件中丢失更好的方法(我猜)?

【问题讨论】:

    标签: bash slurm sbatch


    【解决方案1】:

    您正在寻找的是 Slurm 的 jobs array 功能。

    在您的情况下,您将拥有一个像这样的提交文件 (slurm_run.sh):

    #!/bin/bash
    #SBATCH --ntasks=1
    #SBATCH --cpus-per-task=1 
    #SBATCH -J pltCV
    #SBATCH --mem=30G
    #SBATCH --array=1-50
    
    srun python plotConvergence.py ${SLURM_ARRAY_TASK_ID}
    

    然后提交作业数组

    sbatch slurm_run.sh
    

    您将看到您将提交 50 个作业。您可以一次或一个一个地取消所有这些。有关详细信息,请参阅sbatch 的手册页。

    【讨论】:

    • 谢谢,这完美地回答了这个问题。在我的实际情况中,我打算将字符串参数添加到我的 plotConvergence.py 脚本中,并搜索了数组选项文档。一次偶然的机会,我设法找到了这个我以前没有找到的帖子:stackoverflow.com/questions/43642029/…,你也回答了。我想我可以解决我的问题;非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2011-07-09
    • 2013-08-05
    • 2019-11-13
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多