在 HPC 群集上使用 python 代码 (mpi4py) 提交作业



我正在使用MPI(mpi4py)编写python代码,我想在HPC集群中的队列中的许多节点(每个节点有16个处理器)上实现我的代码。

我的代码结构如下:

from mpi4py import MPI
comm = MPI.COMM_WORLD 
size = comm.Get_size()
rank = comm.Get_rank()
count = 0
for i in range(1, size):
if rank == i:
for j in range(5):
res = some_function(some_argument)
comm.send(res, dest=0, tag=count) 

我能够使用命令在群集的头节点上完美运行此代码

$mpirun -np 48 python codename.py

这里的"代码"是python脚本的名称,在给定的示例中,我选择了48个处理器。在头节点上,对于我的特定任务,作业大约需要 1 秒才能完成(并且它成功地提供了所需的输出)。

但是,当我运行尝试在 HPC 群集的一个队列上提交与作业完全相同的代码时,它会持续运行很长时间(数小时)(未完成),我必须在一天左右后手动终止作业。此外,它不会提供预期的输出。

这是我正在使用的 pbs 文件,

#!/bin/sh
#PBS -l nodes=3:ppn=16 
#PBS -N phy
#PBS -m abe
#PBS -l walltime=23:00:00
#PBS -j eo
#PBS -q queue_name
cd $PBS_O_WORKDIR
echo 'This job started on: ' `date`
module load python27-extras
mpirun -np 48 python codename.py

我使用命令qsub jobname.pbs提交作业。

我很困惑为什么代码应该在头节点上运行得很好,但是当我提交此作业以跨队列中的许多处理器运行代码时,遇到了这个问题。我假设我可能需要更改 pbs 脚本。如果有人可以建议我应该怎么做才能在 HPC 群集中的队列上运行这样的 MPI 脚本作为作业,我将不胜感激。

不需要更改我的代码。这是有效的 pbs 脚本。=)

显然,我需要在作业脚本中调用适当的 mpirun,以便当代码在群集中运行时,它使用与头节点中使用的相同的 mpirun。

这是造成差异的行:/opt/intel/impi/4.1.1.036/intel64/bin/mpirun

这是有效的作业脚本。

#!/bin/sh
#PBS -l nodes=3:ppn=16
#PBS -N phy
#PBS -m abe
#PBS -l walltime=23:00:00
#PBS -j eo
#PBS -q queue_name
cd $PBS_O_WORKDIR
export OMP_NUM_THREADS=16
export I_MPI_PIN=off
echo 'This job started on: ' `date`
/opt/intel/impi/4.1.1.036/intel64/bin/mpirun -np 48 python codename.py

最新更新