2016-04-12 4 views
0

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?

Antwort

0

Vielen Dank, dass Sie uns einen einfachen Testfall geschickt haben. Ich habe das parallele DOE-Zeug erst kürzlich hinzugefügt und vergessen, es mit verteilten Komponenten zu testen. Ich werde unserem Bugtracker eine Geschichte hinzufügen und hoffentlich bald behoben.

+0

Großartig, vielen Dank dafür. – frza

+0

Ü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. –

+0

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