在 SLURM 下运行时 Python 多处理性能低下

问题描述 投票:0回答:0

我正在运行使用

multiprocessing
执行并行任务的 Python 代码。当我在我的本地机器上运行它时,一切都按预期工作,但是当我使用每个节点有 64 个内核的 2x AMD 集群时,一切都会显着变慢。我正在使用 SLURM 进行批处理,我想在单个节点上运行并行版本,只需为该单个节点使用总共 64x2 个内核。

当没有发生并行化(串行执行)时,调用脚本是通过:

#!/bin/bash

#SBATCH --mem-per-cpu=2G
#SBATCH --cpus_per_task=64
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --nstaks-per-node=1

module load python
python 0 myscript.py 

0 输入表示脚本应该序列化运行,即内部没有调用多处理模块。假设这大约需要 ~ 5 分钟。

现在调用并行计算时,sh文件改为:

#!/bin/bash

#SBATCH --mem-per-cpu=2G
#SBATCH --cpus_per_task=64
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --nstaks-per-node=1

module load python

export MKL_NUM_THREADS=1
export NUMEXPR_NUM_THREADS=1
export OMP_NUM_THREADS=1

python 1 64 myscript.py 

现在输入1表示脚本应该调用多处理模块进行并行计算,而64表示

multiprocessing.Pool()
应该创建总共64个进程。在这里,从多处理模块创建的每个进程大约需要 30 分钟才能完成,而在我的本地机器上,每个进程大约需要 5 分钟,与序列化调用相同。

我还看到,当使用

sacct
监视作业时,SLURM 表示分配的 CPU 数量等于 128,而不是
cpus_per_task
中指定的 64。

所以我无法理解这个时间差异,我觉得这可能是关于如何从批处理中调用 SLURM,但资源规范对我来说似乎是正确的。同样奇怪的是,在我的机器上,它有 4x2 个内核,并行处理按预期工作,每个过程大约需要 5 分钟。

python multiprocessing slurm
© www.soinside.com 2019 - 2024. All rights reserved.