我正在运行使用
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 分钟。