我正在使用mpi4py库进行并行编程。但是似乎在创建MPIPoolExecutor之前就已生成了进程,因为在执行程序初始化之前,我得到了4倍的相同警告,即存在该进程。这是正常现象吗?我该如何预防?

start_time = time.time()

Nodes = pd.read_csv(Csvfile)
fields = SelectCoordinates(Nodes,min_lon = 10, max_lon = 11, min_lat = 49, max_lat = 50)
ts = pd.read_csv(File to be read)

n=6 # number of steps of forecast
p = 2 # number of lags


L = 1000# size of data we will use
ts = ts.iloc[0*L:1*L]

Farms = ts.shape[1]
colnames = ts.columns.values.tolist()
ts=ts.values


# n = fstep # number of time steps ahead
size = int(len(ts) * 0.66) #Determining train and test set
train = np.zeros(shape=(size,Farms))
test = np.zeros(shape=(len(ts)-size,Farms))
train, test = ts[0:size], ts[size:len(ts)]

#=================Intialization================
G = np.zeros(shape=(Farms*p,Farms*p))#
Gt = np.zeros(shape=(Farms*p,Farms*p))#

gn = np.zeros(shape=(Farms*p,1))

b = np.zeros(shape=(Farms*p,Farms))
X = np.zeros(shape=(Farms*p,Farms)) # Coefficient Matrix
#x = np.ones(shape=(Farms*p,1)) # Coefficient Matrix
#x[0] = 1
lamda = 0.001
c = 0.1
v=0.999
T = len(train)

workers =  MPIPoolExecutor(max_workers = 4)
for t in range(p,T):

    result_list = []

    to_do = list()


    count = 0
    for l in range(p):
        for k in range(4):
            gn[count]=train[t-l-1,k]
            count+=1
    G = G*v +  gn @ gn.T
    Gt = (1/(t-p+1))*G

    if __name__ == '__main__':
        for i in range(4):

            job = workers.submit(OULtraining, train[t,i], X[:,i,np.newaxis], b[:,i,np.newaxis], i, gn)

            job.add_done_callback(log_result)
            to_do.append(job)


        for future in cf.as_completed(to_do):
            result_list.append(future.result())

        result_list = sorted(result_list,key=itemgetter(2))
        for i  in range(4):
            X[:,i,np.newaxis], b[:,i,np.newaxis], s = result_list[i]

    if (t%100==0):
        print(t)
        print("--- %s seconds ---" % (time.time() - start_time))


我想实现一个递归并行算法,并且我希望只创建一个MPIpool,并且在每个时间步中执行一个作业,等待所有作业完成,然后再次使用先前的输出输入调用流程,然后在相同的位置再次调用下一个步骤等

我也得到4倍的打印,但是我只希望主人做打印。似乎整个程序甚至在我创建执行程序之前就运行了4次。如果我使用具有相同代码的ProcessPoolExecutor,一切正常!

最后一个问题。我可以使用ProccesPoolExecutor在不同计算机上的HPC中工作吗?还是我必须使用MPIPoolExecutor?另外,我发现在OpenMPI中,name ==“ main”将不起作用,因为在所有进程中,name ==“ main”。与OpenMPI等效的是:os.environ ['OMPI_COMM_WORLD_RANK'] =='0'。但是,当我使用此命令时,出现以下错误:KeyError:'OMPI_COMM_WORLD_RANK'您是否有关于此的任何信息?

最佳答案

http://mpi4py.readthedocs.io/en/stable/mpi4py.futures.html#mpipoolexecutor的文档中


  MPIPoolExecutor利用了MPI-2标准中引入的动态过程管理功能。特别是,MPI.COMM_SELF()的MPI.Intracomm.Spawn()方法在主(或父)进程中使用,以生成运行Python解释器的新工作程序(或子)进程。主进程使用一个单独的线程(每个MPIPoolExecutor实例一个线程)与工作人员来回通信。工作进程负责在主线程(和唯一线程)中执行任务,直到发出完成信号为止。


我的理解是该池的MPI任务是动态产生的,因此您实际上应该只启动一个MPI任务(例如mpirun -np 1 ...

关于python - 在MPIPoolExecutor初始化之前产生进程。另外,我可以将HPC与ProccesPoolExecutor一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49514975/

10-11 22:53
查看更多