Ich versuche, eine DoE parallel auf einem verteilten Code auszuführen, die nicht zu funktionieren scheint. Unten ist ein vereinfachtes Beispiel, das denselben Fehler wie für den echten Code verursacht.parallele DoE mit verteilten Komponenten in OpenMDAO
import numpy as np
from openmdao.api import IndepVarComp, Group, Problem, Component
from openmdao.core.mpi_wrap import MPI
from openmdao.drivers.latinhypercube_driver import LatinHypercubeDriver
if MPI:
from openmdao.core.petsc_impl import PetscImpl as impl
rank = MPI.COMM_WORLD.rank
else:
from openmdao.api import BasicImpl as impl
rank = 0
class DistribCompSimple(Component):
"""Uses 2 procs but takes full input vars"""
def __init__(self, arr_size=2):
super(DistribCompSimple, self).__init__()
self._arr_size = arr_size
self.add_param('invar', 0.)
self.add_output('outvec', np.ones(arr_size, float))
def solve_nonlinear(self, params, unknowns, resids):
if rank == 0:
unknowns['outvec'] = params['invar'] * np.ones(self._arr_size) * 0.25
elif rank == 1:
unknowns['outvec'] = params['invar'] * np.ones(self._arr_size) * 0.5
print 'hello from rank', rank, unknowns['outvec']
def get_req_procs(self):
return (2, 2)
if __name__ == '__main__':
N_PROCS = 4
prob = Problem(impl=impl)
root = prob.root = Group()
root.add('p1', IndepVarComp('invar', 0.), promotes=['*'])
root.add('comp', DistribCompSimple(2), promotes=['*'])
prob.driver = LatinHypercubeDriver(4, num_par_doe=N_PROCS/2)
prob.driver.add_desvar('invar', lower=-5.0, upper=5.0)
prob.driver.add_objective('outvec')
prob.setup(check=False)
prob.run()
Ich betreibe diese mit
mpirun -np 4 python lhc_driver.py
und diese Fehlermeldung erhalten:
Traceback (most recent call last):
File "lhc_driver.py", line 60, in <module>
prob.run()
File "/Users/frza/git/OpenMDAO/openmdao/core/problem.py", line 1064, in run
self.driver.run(self)
File "/Users/frza/git/OpenMDAO/openmdao/drivers/predeterminedruns_driver.py", line 157, in run
self._run_par_doe(problem.root)
File "/Users/frza/git/OpenMDAO/openmdao/drivers/predeterminedruns_driver.py", line 221, in _run_par_doe
for case in self._get_case_w_nones(self._distrib_build_runlist()):
File "/Users/frza/git/OpenMDAO/openmdao/drivers/predeterminedruns_driver.py", line 283, in _get_case_w_nones
case = next(it)
File "/Users/frza/git/OpenMDAO/openmdao/drivers/latinhypercube_driver.py", line 119, in _distrib_build_runlist
run_list = comm.scatter(job_list, root=0)
File "MPI/Comm.pyx", line 1286, in mpi4py.MPI.Comm.scatter (src/mpi4py.MPI.c:109079)
File "MPI/msgpickle.pxi", line 707, in mpi4py.MPI.PyMPI_scatter (src/mpi4py.MPI.c:48114)
File "MPI/msgpickle.pxi", line 161, in mpi4py.MPI.Pickle.dumpv (src/mpi4py.MPI.c:41605)
ValueError: expecting 4 items, got 2
ich in der aktuellen Master keinen Test für diesen Anwendungsfall sehen, tut so, dass die Mittel Sie unterstützen es noch nicht oder ist es ein Fehler?
Großartig, vielen Dank dafür. – frza
Übrigens sieht das so aus, als ob dies ein Problem für LatinHypercubeDriver sein könnte. Ich habe dein Beispiel mit UniformDriver ausgeführt und es ist kein Fehler aufgetreten. Nicht sicher, ob Sie etwas anderes als LatinHypercubeDriver als vorübergehende Abhilfe verwenden können oder nicht, aber nur zur Information. –
läuft für mich auch mit dem 'UniformDriver'. Ich benutze den DoE, um Daten für ein Co-Kriging-Metamodell zu erstellen, und habe nicht wirklich Erfahrung mit den beiden DoE-Treibern, habe aber 'OptimizedLatinHypercubeDriver' ausgewählt, da er den Design-Raum gleichmäßiger abtasten soll. Aber Vorschläge sind willkommen. Ich habe 10 Parameter im Modell. – frza