Parallel processing mpi4py:内部错误:错误代码409e0e无效(环ID不匹配)

Parallel processing mpi4py:内部错误:错误代码409e0e无效(环ID不匹配),parallel-processing,mpi,mpi4py,Parallel Processing,Mpi,Mpi4py,我正在用python编写代码,并使用mpi4py并行地进行一些优化。我使用的是普通最小二乘法,我的数据太大,无法放在一个处理器上,所以我有一个主进程,然后生成其他进程。这些子进程每个都导入一部分数据,它们分别在整个优化过程中使用这些数据 我使用scipy.optimize.minimize进行优化,因此子进程从父进程接收系数猜测,然后将平方误差之和(SSE)报告给父进程,然后scipy.optimize.minimize进行迭代,试图找到SSE的最小值。在最小化函数的每次迭代之后,父进程向子进程

我正在用python编写代码,并使用mpi4py并行地进行一些优化。我使用的是普通最小二乘法,我的数据太大,无法放在一个处理器上,所以我有一个主进程,然后生成其他进程。这些子进程每个都导入一部分数据,它们分别在整个优化过程中使用这些数据

我使用scipy.optimize.minimize进行优化,因此子进程从父进程接收系数猜测,然后将平方误差之和(SSE)报告给父进程,然后scipy.optimize.minimize进行迭代,试图找到SSE的最小值。在最小化函数的每次迭代之后,父进程向子进程广播新的系数猜测,然后子进程再次计算SSE。在子进程中,该算法在while循环中设置。在父进程中,我只调用scipy.optimize.minimize

在给我一个问题的部分,我正在做一个嵌套优化,或者一个优化中的优化。内部优化是如上所述的OLS回归,然后外部优化是最小化使用内部优化系数的另一个函数(OLS回归)

所以在我的父进程中,我最小化了两个函数,第二个函数调用第一个函数,并对第二个函数的优化的每次迭代进行新的优化。对于这两种优化,子进程有一个嵌套的while循环

希望这一切都有意义。如果需要更多信息,请告诉我

以下是父进程的相关代码:

comm = MPI.COMM_SELF.Spawn(sys.executable,args = ['IVQTparallelSlave_cdf.py'],maxprocs=processes)

# First stage: reg D on Z, X
def OLS(betaguess):
    comm.Bcast([betaguess,MPI.DOUBLE], root=MPI.ROOT)
    SSE = np.array([0],dtype='d')
    comm.Reduce(None,[SSE,MPI.DOUBLE], op=MPI.SUM, root = MPI.ROOT)
    comm.Bcast([np.array([1],'i'),MPI.INT], root=MPI.ROOT)
    return SSE


# Here is the CDF function.
def CDF(yguess, delta_FS, tau):
    # Calculate W(y) in the slave process
    # Solving the Reduced form after every iteration: reg W(y) on Z, X
    comm.Bcast([yguess,MPI.DOUBLE], root=MPI.ROOT)
    betaguess = np.zeros(94).astype('d')
    ###########
    # This calculates the reduced form coefficient
    coeffs_RF = scipy.minimize(OLS,betaguess,method='Powell')
    # This little block is to get the slave processes to stop
    comm.Bcast([betaguess,MPI.DOUBLE], root=MPI.ROOT)
    SSE = np.array([0],dtype='d')
    comm.Reduce(None,[SSE,MPI.DOUBLE], op=MPI.SUM, root = MPI.ROOT)
    cont = np.array([0],'i')
    comm.Bcast([cont,MPI.INT], root=MPI.ROOT)
    ###########
    contCDF = np.array([1],'i')
    comm.Bcast([contCDF,MPI.INT], root=MPI.ROOT) # This is to keep the outer while loop going

    delta_RF = coeffs_RF.x[1]

    return abs(delta_RF/delta_FS - tau)

########### This one finds Y(1) ##############

betaguess = np.zeros(94).astype('d')

######### First Stage: reg D on Z, X ######### 
coeffs_FS = scipy.minimize(OLS,betaguess,method='Powell')

print coeffs_FS

# This little block is to get the slave processes' while loops to stop
comm.Bcast([betaguess,MPI.DOUBLE], root=MPI.ROOT)
SSE = np.array([0],dtype='d')
comm.Reduce(None,[SSE,MPI.DOUBLE], op=MPI.SUM, root = MPI.ROOT)
cont = np.array([0],'i')
comm.Bcast([cont,MPI.INT], root=MPI.ROOT)

delta_FS = coeffs_FS.x[1]

######### CDF Function ######### 
yguess = np.array([3340],'d')
CDF1 = lambda yguess: CDF(yguess, delta_FS, tau)
y_minned_1 = scipy.minimize(CDF1,yguess,method='Powell')
以下是子进程的相关代码:

#IVQTparallelSlave_cdf.py
comm = MPI.Comm.Get_parent()

.
.
.
# Importing data. The data is the matrices D, and ZX
.
.
.
########### This one finds Y(1) ##############
######### First Stage: reg D on Z, X ######### 
cont = np.array([1],'i')
betaguess = np.zeros(94).astype('d')

# This corresponds to 'coeffs_FS = scipy.minimize(OLS,betaguess,method='Powell')' of the parent process
while cont[0]:
    comm.Bcast([betaguess,MPI.DOUBLE], root=0)

    SSE = np.array(((D - np.dot(ZX,betaguess).reshape(local_n,1))**2).sum(),'d')

    comm.Reduce([SSE,MPI.DOUBLE],None, op=MPI.SUM, root = 0)
    comm.Bcast([cont,MPI.INT], root=0)

if rank==0: print '1st Stage OLS regression done'

######### CDF Function ######### 
cont = np.array([1],'i')
betaguess = np.zeros(94).astype('d')
contCDF = np.array([1],'i')
yguess = np.array([0],'d')

# This corresponds to 'y_minned_1 = spicy.minimize(CDF1,yguess,method='Powell')'
while contCDF[0]:
    comm.Bcast([yguess,MPI.DOUBLE], root=0)
    # This calculates the reduced form coefficient
    while cont[0]: 
        comm.Bcast([betaguess,MPI.DOUBLE], root=0)

        W = 1*(Y<=yguess)*D
        SSE = np.array(((W - np.dot(ZX,betaguess).reshape(local_n,1))**2).sum(),'d')    

        comm.Reduce([SSE,MPI.DOUBLE],None, op=MPI.SUM, root = 0)
        comm.Bcast([cont,MPI.INT], root=0)
        #if rank==0: print cont
    comm.Bcast([contCDF,MPI.INT], root=0)
#IVQTparallelSlave_cdf.py
comm=MPI.comm.Get_parent()
.
.
.
#导入数据。数据是矩阵D和ZX
.
.
.
###########这个找到Y(1)##############
#########第一阶段:注册D在Z、X上
cont=np.数组([1],'i')
betaguess=np.zeros(94.astype('d'))
#这对应于父进程的“coeffs_FS=scipy.minimize(OLS,betaguess,method='Powell')”
而cont[0]:
comm.Bcast([betaguess,MPI.DOUBLE],root=0)
SSE=np.array((D-np.dot(ZX,betaguess).重塑(local_n,1))**2.sum(),'D')
comm.Reduce([SSE,MPI.DOUBLE],无,op=MPI.SUM,root=0)
comm.Bcast([cont,MPI.INT],root=0)
如果秩==0:打印“第一阶段OLS回归完成”
#########CDF函数
cont=np.数组([1],'i')
betaguess=np.zeros(94.astype('d'))
contCDF=np.array([1],'i')
yguess=np.array([0],'d')
#这对应于“y_minned_1=spick.minimize(CDF1,yguess,method='Powell')”
而contCDF[0]:
comm.Bcast([yguess,MPI.DOUBLE],root=0)
#这将计算简化形式系数
而cont[0]:
comm.Bcast([betaguess,MPI.DOUBLE],root=0)

W=1*(YMy crystal ball告诉我,您的一些(或大多数)MPI级别正在进行集体调用,如
MPI\u Bcast
(或其mpi4py等价物)以不同的顺序或者不是所有人都参与集体通话。但是我的水晶球可能是错的,所以请给我们看一些代码。谢谢@HristoIliev,我刚刚添加了一些代码。所以根据你的水晶球所说的,我应该使用comm.Barrier()要确保所有进程不会失去同步?您粘贴在此处的代码缺少某些内容,这些内容将在工作进程中终止外部
,而
循环。无论如何,在prima vista上,您的集体看起来是匹配的。您可以做的是记录每个列组的调用。例如,将
B
放入广播d
R
进行缩减。然后比较日志文件-序列应该匹配。我有终止外部while循环的代码,我只是没有包含它,抱歉。所以我在过去2天一直在试验屏障功能,但这还不起作用。您建议如何制作一个日志文件,只为broa打印Bdcast和R用于缩减?我尝试了一个打印函数调用(在这里找到)的函数,但是输出很麻烦。谢谢,@hristoilev
Internal Error: invalid error code 409e0e (Ring ids do not match) in MPIR_Bcast_impl:1328
Traceback (most recent call last):
  File "IVQTparallelSlave_cdf.py", line 100, in <module>
    if rank==0: print 'CDF iteration'
  File "Comm.pyx", line 406, in mpi4py.MPI.Comm.Bcast (src/mpi4py.MPI.c:62117)
mpi4py.MPI.Exception: Other MPI error, error stack:
PMPI_Bcast(1478).....: MPI_Bcast(buf=0x2409f50, count=1, MPI_INT, root=0, comm=0x84000005) failed
MPIR_Bcast_impl(1328):