如何使用一个 slurm 批处理脚本并行 运行 个作业?

How to run jobs in paralell using one slurm batch script?

我正在尝试 运行 多个 python 脚本与一个 Slurm 批处理脚本并行。看看下面的例子:

#!/bin/bash
#
#SBATCH --job-name=test
#SBATCH --output=/dev/null
#SBATCH --error=/dev/null
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=1G
#SBATCH --partition=All
#SBATCH --time=5:00

srun sleep 60
srun sleep 60
wait

如何调整脚本,使执行仅需 60 秒(而不是 120 秒)?将脚本拆分为两个脚本不是一种选择。

如所写,该脚本是运行宁两个sleep命令并行连续两次.

每个srun命令启动一个步骤,并且由于您设置--ntasks=2每个步骤实例化两个任务 (这里是 sleep 命令)。

如果你想运行两个并行的1-task步骤,你应该这样写:

srun --exclusive -n 1 -c 1 sleep 60 &
srun --exclusive -n 1 -c 1 sleep 60 &
wait

然后每个步骤只实例化一个任务,并以&分隔符作为背景,意味着下一个srun可以立即开始。 wait 命令确保脚本仅在两个步骤都完成后终止。

在这种情况下, xargs command and the GNU parallel 命令可用于避免编写多个相同的 srun 行或避免 for- 循环。

例如,如果您有多个文件,您需要 运行 您的脚本:

find /path/to/data/*.csv -print0 | xargs -0 -n1 -P $SLURM_NTASKS srun -n1 --exclusive python my_python_script.py

这相当于写了多少

srun -n 1 -c 1 --exclusive python my_python_script.py /path/to/data/file1.csv &
srun -n 1 -c 1 --exclusive python my_python_script.py /path/to/data/file1.csv &
srun -n 1 -c 1 --exclusive python my_python_script.py /path/to/data/file1.csv &
[...]

GNU parallel 可用于遍历参数值:

parallel -P $SLURM_NTASKS srun  -n1 --exclusive python my_python_script.py ::: {1..1000}

将运行

python my_python_script.py 1
python my_python_script.py 2
python my_python_script.py 3
...
python my_python_script.py 1000

另一种方法就是运行

srun python my_python_script.py

并且,在 Python 脚本中,查找 SLURM_PROCID 环境变量并根据其值拆分工作。 srun 命令将启动脚本的多个实例,每个实例将 'see' 一个不同的值 SLURM_PROCID

import os
print(os.environ['SLURM_PROCID'])