SLURM 中的每个任务都需要一个 bash 文件吗?
Do I need a single bash file for each task in SLURM?
我正在尝试在 SLURM 管理的集群中启动多个任务,并希望避免处理数十个文件。
现在,我有 50 个任务(下标 i,为了简单起见,i 也是我程序的输入参数),每个任务都有一个 bash 文件 slurm_run_i.sh
指示计算配置,以及s运行 命令:
#!/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 个作业 运行ning),但我发现拥有超过 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) 运行ning。由于我正在工作的分区中的每个节点上只有 12 个核心,因此我假设我的大部分作业都在等待我分配到的单个节点上。设置 -N 选项也不会改变任何东西。此外,如果我意识到有错误或其他问题,我不能再单独取消某些作业,这对我来说听起来有问题。
我的解释是否正确,是否有比我尝试在 slurm 中处理多个作业而不会在许多文件中丢失更好的方法(我猜)?
您正在寻找的是 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
的手册页。
我正在尝试在 SLURM 管理的集群中启动多个任务,并希望避免处理数十个文件。
现在,我有 50 个任务(下标 i,为了简单起见,i 也是我程序的输入参数),每个任务都有一个 bash 文件 slurm_run_i.sh
指示计算配置,以及s运行 命令:
#!/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 个作业 运行ning),但我发现拥有超过 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) 运行ning。由于我正在工作的分区中的每个节点上只有 12 个核心,因此我假设我的大部分作业都在等待我分配到的单个节点上。设置 -N 选项也不会改变任何东西。此外,如果我意识到有错误或其他问题,我不能再单独取消某些作业,这对我来说听起来有问题。
我的解释是否正确,是否有比我尝试在 slurm 中处理多个作业而不会在许多文件中丢失更好的方法(我猜)?
您正在寻找的是 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
的手册页。