Mpi4py Deadlock mit scipy.minimieren
Posted: 03 Jun 2025, 18:03
Ich versuche etwas Ähnliches zu tun, wie es in parallelizieren einen Funktionsaufruf mit MPI4PY < /p>
beschrieben ist, aber es gibt einige Dinge, die mich der bereitgestellten Antwort gegenüber skeptisch gegenüber machen. Darüber hinaus habe ich eine Klassenimplementierung, die die Dinge ein wenig anders macht. Hier ist ein "reduzierter" Code, um die Hauptlogik zu demonstrieren: < /p>
Ich verstehe also, dass ich den Minimierer nur auf Rang 0 aufrufen muss. Zusätzlich muss ich den Rang einbeziehen! = 0 Mitarbeiter, um objektiv zu bewerten. Dies ist die Absicht der if/sonst in der Maximierung . Assimitten, objektiv gibt keine auf allen Rang zurück!
beschrieben ist, aber es gibt einige Dinge, die mich der bereitgestellten Antwort gegenüber skeptisch gegenüber machen. Darüber hinaus habe ich eine Klassenimplementierung, die die Dinge ein wenig anders macht. Hier ist ein "reduzierter" Code, um die Hauptlogik zu demonstrieren: < /p>
Code: Select all
from scipy.optimize import minimize
from mpi4py import MPI
import numpy as np
class Solver():
def __init__(self, SampleTimes, InitialArray):
self.comm = MPI.COMM_WORLD
self.rank = self.comm.Get_rank()
self.size = self.comm.Get_size()
self.SampleTimes = SampleTimes
self.InitialArray = InitialArray
self.Finished = False
def f(x_):
return
def Objective(self, x):
self.x = self.comm.bcast(x if self.rank == 0 else None, root=0)
tstep_select = np.array_split(self.SampleTimes, self.size)[self.rank]
local_results = []
for t in tstep_select:
result = self.f(self.x) # Some function of x
local_results.append( (t, result) )
all_results = self.comm.gather(local_results, root=0)
if self.rank==0:
all_results = [item for sublist in all_results for item in sublist]
all_results = np.array(all_results)
all_results = all_results[all_results[:,0].argsort()]
scalar = np.trapz(all_results[:,1], all_results[:,0])
return -scalar
def Maximize(self,):
if self.rank == 0:
self.Max = minimize(self.Objective, self.InitialArray)
self.Finished = self.comm.bcast(True, root=0)
return self.Max
else:
while not self.Finished:
self.Objective(None)
if __name__=='__main__':
t_eval = np.linspace(0, 100, 100)
Instance = Solver(SampleTimes=t_eval)
print(Instance.Maximize())
Code: Select all
class Solver():
def __init__(self, SampleTimes, InitialArray):
self.comm = MPI.COMM_WORLD
self.rank = self.comm.Get_rank()
self.size = self.comm.Get_size()
self.SampleTimes = SampleTimes
self.InitialArray = InitialArray
def f(x_):
return
def Objective(self, x):
self.x = self.comm.bcast(x if self.rank == 0 else None, root=0)
tstep_select = np.array_split(self.SampleTimes, self.size)[self.rank]
local_results = []
for t in tstep_select:
result = self.f(self.x) # Some function of x
local_results.append( (t, result) )
all_results = self.comm.gather(local_results, root=0)
if self.rank==0:
all_results = [item for sublist in all_results for item in sublist]
all_results = np.array(all_results)
all_results = all_results[all_results[:,0].argsort()]
scalar = np.trapz(all_results[:,1], all_results[:,0])
return -scalar
def Maximize(self,):
if self.rank == 0:
self.Max = minimize(self.Objective, self.InitialArray)
return self.Max
else: self.Objective(None)
if __name__=='__main__':
t_eval = np.linspace(0, 100, 100)
Instance = Solver(SampleTimes=t_eval)
print(Instance.Maximize())