1

我正在尝试在 SLURM 管理的集群中启动多个任务,并希望避免处理数十个文件。现在,我有 50 个任务(下标 i,为简单起见,i 也是我程序的输入参数),每个任务都有一个slurm_run_i.sh指示计算配置的 bash 文件和 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 中处理多个工作而不在许多文件中丢失更好的方法(我猜)?

4

1 回答 1

1

您正在寻找的是 Slurm 的作业数组功能。

在您的情况下,您将拥有一个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

于 2020-04-18T11:27:46.713 回答