与MPISLURM一起运行,Python代码花费的时间比单个过程要长

问题描述

我有一些python代码,大约需要12个小时才能在笔记本电脑(MacOS 16GB 2133 MHz LPDDR3)上运行。该代码循环了数千次迭代,并在每个步骤进行了一些密集的处理,因此将问题与MPI处理并行化是有意义的。我可以访问Slurm群集,在该群集中,我已经使用mpicc针对他们的OpenMPI实现构建了mpi4py(用于python 2.7)。然后,我使用sbatch --exclusive mysub.sbatch提交以下提交脚本:

#!/bin/bash
#SBATCH -p par-multi
#SBATCH -n 50
#SBATCH --mem-per-cpu=8000
#SBATCH -t 48:00:00
#SBATCH -o %j.log
#SBATCH -e %j.err

module add eb/OpenMPI/gcc/3.1.1

mpirun python ./myscript.py

应将任务拆分为50个处理器,每个处理器分配8GB内存。 我的代码如下所示:

import numpy as np
import pickle
import mpi4py

COMM = MPI.COMM_WORLD

def split(container,count):
    return [container[_i::count] for _i in range(count)]
    
def read():
    #function which reads a series of pickle files from my home directory
    return data
    
def function1():
    #some process 1
    return f1

def function2():
    #some process 2
    return f2

def main_function(inputs):
    #some process which also calls function1 and function2
    f1 = function1(inputs)
    f2 = function2(f1)
    result = #some more processing
    return result
    
### define global variables and read data ###
data = read()
N = 5000
#etc...

selected_variables = range(N)

if COMM.rank == 0:
    splitted_jobs = split(selected_variables,COMM.size)
else:
    splitted_jobs = None

scattered_jobs = COMM.scatter(splitted_jobs,root=0)

results = []
for index in scattered_jobs:
    outputs = main_function(data[index])
    results.append(outputs)
results = COMM.gather(results,root=0)
        
if COMM.rank == 0:
    all_results = []
    for r in results:
        all_results.append(r)
        
    f = open('result.pkl','wb')
    pickle.dump(np.array(all_results),f,protocol=2)
    f.close()

我可以为我的工作分配的最大运行时间是48小时,这时该工作甚至还没有完成运行。有人可以告诉我提交脚本或代码中是否有某些内容可能会导致它变得很慢?

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)