如何使用 Slurm/Sbatch 提交/运行多个并行作业?

Mar*_* K. 3 python shell slurm sbatch

我正在尝试向 Slurm 服务器提交大量作业(数百个),并希望避免为我想要运行的每个作业提交新的 shell 脚本。提交的代码是一个 Python 脚本,它在 shell 脚本中采用两个输入变量,这些变量是作业之间唯一发生变化的变量。适用于单个作业的简短 shell 脚本示例如下:

#!/bin/bash

#SBATCH -n 1
#SBATCH -t 01:00:00

srun python retrieve.py --start=0 --end=10
Run Code Online (Sandbox Code Playgroud)

我想要的是使用相同的 python 脚本提交大量作业,并且仅更改作业之间的“开始”和“结束”变量。我读到了一些关于增加所需核心数量('-n')并在每个 srun 命令后编写 & 符号的内容,但到目前为止我还无法让它工作。

如果有人知道快速执行此操作的方法,我将非常感谢您的帮助!

dam*_*ois 8

要在当前解决方案的基础上进行构建,您可以转而使用两个 CPU,而不是一个:

#!/bin/bash

#SBATCH -n 2
#SBATCH -t 01:00:00

srun -n1 --exclusive python retrieve.py --start=0 --end=10 &
srun -n1 --exclusive python retrieve.py --start=10 --end=20 &
wait
Run Code Online (Sandbox Code Playgroud)

(您可能需要--end根据边界是包含还是排除来进行调整)

上面的脚本请求 2 个 CPU 并创建两个使用不同参数运行 Python 脚本的任务。该--exclusive部分对于 20.11 之前的 Slurm 版本是必需的(凭记忆)。sbatch它与请求整个节点的 eponym 选项无关。

与号 ( &) 允许两个任务并行运行,并且该wait命令的作用是确保脚本不会在任务之前终止,否则 Slurm 将杀死它们。

您可以使用 Bashfor循环或使用GNU Parallel命令进行概括。

但是,这不会提交多个作业,而是会提交一个包含多个任务的作业。

如果要提交多个作业,则需要一个作业数组

#!/bin/bash

#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --array=0-10:10

srun python retrieve.py --start=${SLURM_ARRAY_TASK_ID} --end=$((SLURM_ARRAY_TASK_ID+10))
Run Code Online (Sandbox Code Playgroud)

这将提交两个独立的作业,它们将执行与前面描述的作业相同的工作。