我对 Slurm 和这个社区很陌生,所以如果我做错了什么,请以任何方式纠正我!:)
我需要在 HPC 集群上多次并行运行我的可执行文件(Python 脚本)。此可执行文件将 Slurm Array 任务 ID 作为输入。此输入在 Python 脚本中映射到多个参数,然后在此基础上再次导入数据。请注意,可执行文件本身不是内部并行的。我认为我的可执行文件的每次调用都应该只能在一个 CPU 上运行。
我的目标:尽可能多地运行我的可执行文件的多次调用!我在想至少要同时进行 50 次调用。
原则上,我的脚本在集群上按预期工作。我使用这个 Slurm 提交脚本:
#!/bin/bash -l
#SBATCH --job-name=NAME
#SBATCH --chdir=/my/dir
#SBATCH --output=.job/NAME%A_%a.out
#SBATCH --error=.job/NAME%A_%a.err
#SBATCH --mail-type=END
#SBATCH --mail-user=USER
# --- resource specification ---
#SBATCH --partition=general
#SBATCH --array=1-130
#SBATCH --ntasks-per-node=1
#SBATCH --mem=16G
#SBATCH --time=13:00:00
# --- start from a clean state and load necessary environment modules ---
module purge
module load anaconda/3
# --- instruct OpenMP to use the number of cpus requested per task ---
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK:-1}
# --- run executable via srun ---
srun ./path/to/executable.py $SLURM_ARRAY_TASK_ID
然而,通过这种方式,不知何故只有 8 个作业(即“executable.py 1”、“executable.py 2”……)并行执行,每个作业都在不同的节点上。(注意:我不太清楚 'export OMP_NUM_THREADS' 的作用;IT 支持人员告诉我要包含它)。如果“executable.py 1”结束,“executable.py 9”开始。但是,我想要的不仅仅是 8 个同时运行的调用。所以我想,我需要指定每个 inovcation 只需要一个 CPU;也许那时我的更多工作可以在我似乎收到的 8 个节点上并行运行。我的新提交脚本如下所示(为了便于阅读,我只显示了“资源规范”部分,其余部分未更改):
# --- resource specification ---
#SBATCH --partition=general
#SBATCH --array=1-130
#SBATCH --ntasks-per-node=10
#SBATCH --cpus-per-task=1
#SBATCH --mem=16G
#SBATCH --time=13:00:00
但是,这样一来,我的可执行文件似乎为每个 Slurm 数组任务 ID 运行了十次,也就是说,“executable.py 1”运行了十次,“executable.py 2”等等。这不是我的本意。
我认为我的问题的根源在于(i)我被 SBATCH 选项--ntasks-per-node、--ntasks、--cpus-per-task、--nodes 等严重混淆了,并且( ii) 从概念上讲,我不知道“工作”、“工作步骤”或“任务”是什么意思(对于我的情况以及 SBATCH 的手册页)。
如果有人知道哪个 SBATCH 选项组合给了我想要的东西,我将非常感谢您的提示。此外,如果您对如何定义工作步骤和任务等有一般知识(用简单的英语),那就太好了。
请注意,我仔细查看了手册页和一些在线文档。我还询问了我支持的当地人,但遗憾的是他们并没有太大帮助。我真的需要我的脚本大规模并行运行;我也真的很想更好地了解 Slurm 的工作原理。我想补充一点,我不是受过训练的计算机科学家,这不是我通常的比赛场地。
非常感谢大家的时间!