OpenMDAO PetscTgtVecWrapper 类型错误
OpenMDAO PetscTgtVecWrapper TypeError
我正在尝试获得 运行 的并行工作流程,其中我正在评估 ParallelGroup
中的 1000 多个并行案例。如果我 运行 在少量内核上它不会崩溃,但在某些时候增加节点数量会引发错误,这表明它与问题的划分方式有关。
我从 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'
这个答案:
让我寻找你设置 tgt_idxs
向量的位置,以查看它是否使用正确的 dtype PETSc.IntType
定义。但是到目前为止,当我尝试设置我认为可能导致错误的数组的 dtype 时,我只收到 Petsc has generated inconsistent data
错误。
我还没有按照我链接到的答案中的建议尝试使用 --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
.
我从未在 petsc 上使用过该选项。不久前,我们确实在扩展到更多内核时遇到了一些问题,但我们确定问题出在 OpenMPI 编译上。重新编译 OpenMDAO 解决了我们的问题。
由于此错误在设置时出现,我们不需要 运行 测试代码。如果您可以向我们提供显示问题的模型,并且我们可以 运行 它,那么我们至少可以验证我们的集群是否发生了同样的问题。
最好知道您可以成功 运行 多少个核心以及它在什么时候发生故障。
您 运行 的数据大小肯定大于 32 位索引可以表示的数据大小,因此如果您无法减小数据大小,则使用 --with-64-bit-indices
重新编译是有意义的. OpenMDAO 在内部为我们的索引使用 PETSc.IntType,所以如果你重新编译它们应该变成 64 位大小。
我正在尝试获得 运行 的并行工作流程,其中我正在评估 ParallelGroup
中的 1000 多个并行案例。如果我 运行 在少量内核上它不会崩溃,但在某些时候增加节点数量会引发错误,这表明它与问题的划分方式有关。
我从 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'
这个答案:
让我寻找你设置 tgt_idxs
向量的位置,以查看它是否使用正确的 dtype PETSc.IntType
定义。但是到目前为止,当我尝试设置我认为可能导致错误的数组的 dtype 时,我只收到 Petsc has generated inconsistent data
错误。
我还没有按照我链接到的答案中的建议尝试使用 --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
.
我从未在 petsc 上使用过该选项。不久前,我们确实在扩展到更多内核时遇到了一些问题,但我们确定问题出在 OpenMPI 编译上。重新编译 OpenMDAO 解决了我们的问题。
由于此错误在设置时出现,我们不需要 运行 测试代码。如果您可以向我们提供显示问题的模型,并且我们可以 运行 它,那么我们至少可以验证我们的集群是否发生了同样的问题。
最好知道您可以成功 运行 多少个核心以及它在什么时候发生故障。
您 运行 的数据大小肯定大于 32 位索引可以表示的数据大小,因此如果您无法减小数据大小,则使用 --with-64-bit-indices
重新编译是有意义的. OpenMDAO 在内部为我们的索引使用 PETSc.IntType,所以如果你重新编译它们应该变成 64 位大小。