2016-04-12 5 views
0

分散コードでDoEを並列実行しようとしていますが、動作していないようです。以下は、実際のコードと同じエラーを発生させる単純化された例です。そのため平均を行い、私は最新のマスターで、このユースケースのためのテストが表示されないOpenMDAOの分散コンポーネントとのDoE

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 

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

私は

mpirun -np 4 python lhc_driver.py 

でこれを実行すると、このエラーを取得しますあなたはまだそれをサポートしていないか、バグですか?

答えて

0

このための簡単なテストケースを送信いただきありがとうございます。私は並列DOEのものをかなり最近追加し、分散コンポーネントでテストするのを忘れてしまった。このためにバグトラッカーにストーリーを追加し、うまくいけばそれをすぐに修正します。

+0

よろしくお願いいたします。 – frza

+0

ところで、これはLatinHypercubeDriverに固有の問題かもしれないようです。私はUniformDriverであなたの事例を実行したが、エラーは出なかった。一時的な回避策としてLatinHypercubeDriver以外のものを使用できるかどうかはわかりませんが、FYIのみです。 –

+0

は私のために 'UniformDriver'でも動作します。 DoEを実行してCo-krigingメタモデルのデータを作成していますが、実際にDoEドライバのいずれかの経験はありませんが、最適化されたラテンハイパーキューブドライバを選んだので、より均等にデザインスペースをサンプリングする必要があります。しかし、提案は大歓迎です。モデルには10個のパラメータがあります。 – frza