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

Parallel processing 如何使用一个slurm批处理脚本并行运行作业?,parallel-processing,slurm,Parallel Processing,Slurm,我试图用一个Slurm批处理脚本并行运行多个python脚本。请看下面的示例: #!/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

我试图用一个Slurm批处理脚本并行运行多个python脚本。请看下面的示例:

#!/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命令

如果要并行运行两个单任务步骤,应按以下方式编写:

srun --exclusive -n 1 -c 1 sleep 60 &
srun --exclusive -n 1 -c 1 sleep 60 &
wait
然后,每个步骤仅实例化一个任务,并以&分隔符为背景,这意味着下一个srun可以立即启动。wait命令确保脚本仅在两个步骤都完成时终止

在这种情况下,该命令和命令可用于避免写入多个相同的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命令将启动脚本的多个实例,每个实例将“看到”SLURM_PROCID的不同值


如前所述,该脚本并行运行两个sleep命令,一行两次

每个srun命令启动一个步骤,并且由于您设置了-ntasks=2,因此每个步骤在这里实例化两个任务,即sleep命令

如果要并行运行两个单任务步骤,应按以下方式编写:

srun --exclusive -n 1 -c 1 sleep 60 &
srun --exclusive -n 1 -c 1 sleep 60 &
wait
然后,每个步骤仅实例化一个任务,并以&分隔符为背景,这意味着下一个srun可以立即启动。wait命令确保脚本仅在两个步骤都完成时终止

在这种情况下,该命令和命令可用于避免写入多个相同的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命令将启动脚本的多个实例,每个实例将“看到”SLURM_PROCID的不同值


非常感谢。你的回答非常有价值,帮助我更好地理解Slurm。但是,我不理解关键字-独占。我不需要整个节点。我只想执行脚本[这里是睡眠]。这是违反直觉的,但是-exclusive关键字在这个上下文中有不同的含义;它精确地用于在子步骤中“拆分”分配。有关详细信息,请参阅。在Slurm的最新版本中,这实际上是默认值。谢谢。你的回答非常有价值,帮助我更好地理解Slurm。但是,我不理解关键字-独占。我不需要整个节点。我只想执行脚本[这里是睡眠]。这是违反直觉的,但是-exclusive关键字在这个上下文中有不同的含义;它精确地用于在子步骤中“拆分”分配。有关详细信息,请参阅。在Slurm的最新版本中,这实际上是默认值。