Mpi4py Deadlock mit scipy.minimierenPython

Python-Programme
Anonymous
 Mpi4py Deadlock mit scipy.minimieren

Post by Anonymous »

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>

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())
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!

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())

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post