如何使用一个 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'])
我正在尝试 运行 多个 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'])