0

内で1000を超える並列ケースを評価している並列ワークフローを実行しようとしていますParallelGroup。少量のコアで実行するとクラッシュしませんが、ある時点でノード数を増やすとエラーが発生します。これは、問題がどのように分割されているかに関連していることを示しています。

OpenMDAO と PETSc のディープ ダンジョンから、通信テーブルをセットアップする際のターゲット インデックスに関するエラーが表示されます。以下は、エラーのトレースバックの印刷です。

File "/home/frza/git/OpenMDAO/openmdao/core/group.py", line 454, in _setup_vectors
impl=self._impl, alloc_derivs=alloc_derivs)
File "/home/frza/git/OpenMDAO/openmdao/core/group.py", line 1456, in _setup_data_transfer
self._setup_data_transfer(my_params, None, alloc_derivs)
File "/home/frza/git/OpenMDAO/openmdao/core/petsc_impl.py", line 125, in create_data_xfer
File "/home/frza/git/OpenMDAO/openmdao/core/petsc_impl.py", line 397, in __init__
tgt_idx_set = PETSc.IS().createGeneral(tgt_idxs, comm=comm)
File "PETSc/IS.pyx", line 74, in petsc4py.PETSc.IS.createGeneral (src/petsc4py.PETSc.c:74696)
tgt_idx_set = PETSc.IS().createGeneral(tgt_idxs, comm=comm)
File "PETSc/arraynpy.pxi", line 121, in petsc4py.PETSc.iarray (src/petsc4py.PETSc.c:8230)
TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe'

この答え:

https://scicomp.stackexchange.com/questions/2355/32bit-64bit-issue-when-working-with-numpy-and-petsc4py/2356#2356

ベクトルを設定した場所を探してtgt_idxs、正しい dtype で定義されているかどうかを確認しましたPETSc.IntType。しかし、これまでのところPetsc has generated inconsistent data、エラーの原因であると思われる配列の dtype を設定しようとしたときにのみエラーが発生します。

--with-64-bit-indicesリンク先の回答で提案されているように、まだPETScを再インストールしようとはしていません。このように構成された PETSc を実行しますか?

編集:私は今、私が得るエラーを再現する問題の簡素化されたバージョンをセットアップしました:

import numpy as np

from openmdao.api import Component, Group, Problem, IndepVarComp, \
                         ParallelGroup


class Model(Component):

    def __init__(self, nsec, nx, nch):
        super(Model, self).__init__()

        self.add_output('outputs', shape=[nx+1, nch*6*3*nsec])

    def solve_nonlinear(self, params, unknowns, resids):

        pass

class Aggregate(Component):

    def __init__(self, nsec, ncase, nx, nch, nsec_env=12):
        super(Aggregate, self).__init__()

        self.ncase = ncase

        for i in range(ncase):
            self.add_param('outputs_sec%03d'%i, shape=[nx+1, nch*6*3*nsec])

        for i in range(nsec):
            self.add_output('aoutput_sec%03d' % i, shape=[nsec_env, 6])


    def solve_nonlinear(self, params, unknowns, resids):

        pass


class ParModel(Group):

    def __init__(self, nsec, ncase, nx, nch, nsec_env=12):
        super(ParModel, self).__init__()

        pg = self.add('pg', ParallelGroup())

        promotes = ['aoutput_sec%03d' % i for i in range(nsec)]
        self.add('agg', Aggregate(nsec, ncase, nx, nch, nsec_env), promotes=promotes)

        for i in range(ncase):
            pg.add('case%03d' % i, Model(nsec, nx, nch))
            self.connect('pg.case%03d.outputs'%i, 'agg.outputs_sec%03d'%i)

if __name__ == '__main__':

    from openmdao.core.mpi_wrap import MPI

    if MPI:
        from openmdao.core.petsc_impl import PetscImpl as impl
    else:
        from openmdao.core.basic_impl import BasicImpl as impl

    p = Problem(impl=impl, root=Group())
    root = p.root

    root.add('dlb', ParModel(20, 1084, 36, 6))
    import time
    t0 = time.time()
    p.setup()
    print 'setup time', time.time() - t0

すると、評価するケースが多いため、データサイズが膨大になることもわかります。どうにかしてデータサイズを削減できないか見てみましょう。エラーでクラッシュするため、実際にはこれをまったく実行できません。

petsc4py.PETSc.Errorpetsc4py.PETSc.Error: error code 75
[77] VecCreateMPIWithArray() line 320 in /home/MET/Python-2.7.10_Intel/opt/petsc-3.6.2/src/vec/vec/impls/mpi/pbvec.c
[77] VecSetSizes() line 1374 in /home/MET/Python-2.7.10_Intel/opt/petsc-3.6.2/src/vec/vec/interface/vector.c
[77] Arguments are incompatible
[77] Local size 86633280 cannot be larger than global size 73393408
: error code 75

またはTypeError

4

2 に答える 2

1

実行しているデータ サイズは 32 ビット インデックスで表現できるサイズよりも確実に大きいため--with-64-bit-indices、データ サイズを小さくできない場合は で再コンパイルするのが理にかなっています。OpenMDAO はインデックスに PETSc.IntType を内部的に使用するため、再コンパイルするとサイズが 64 ビットになるはずです。

于 2016-05-15T17:57:28.047 に答える
0

私は petsc でそのオプションを使用したことがありません。しばらく前に、より多くのコアにスケールアップする際にいくつかの問題がありましたが、問題は OpenMPI コンパイルにあると判断しました。OpenMDAO を再コンパイルすると、問題が修正されました。

このエラーはセットアップ時に表示されるため、コードをテストするために実行する必要はありません。問題を示しているモデルを提供して実行できれば、少なくともクラスターで同じ問題が発生しているかどうかを確認できます。

正常に実行できるコアの数と、どの時点で故障するかを知っておくとよいでしょう。

于 2016-05-14T17:01:27.720 に答える