我正在尝试在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的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
的手册页。