OpenMDAO PetscTgtVecWrapper TypeError
Я пытаюсь запустить параллельный рабочий процесс, в котором я оцениваю более 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'
этот ответ:
привел меня искать, где вы создали tgt_idxs
вектор, чтобы увидеть, определен ли он с правильным dtype PETSc.IntType
, Но пока я получаю только Petsc has generated inconsistent data
ошибки, когда я пытаюсь установить dtype массивов, я думаю, что может быть причиной ошибки.
Я еще не пытался переустановить PETSc с --with-64-bit-indices
как предложено в ответе, с которым я связан. Вы запускаете 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
,
2 ответа
Размеры данных, с которыми вы работаете, определенно больше, чем можно выразить с помощью 32-битных индексов, поэтому перекомпилируйте с --with-64-bit-indices
имеет смысл, если вы не можете уменьшить размер данных. OpenMDAO использует PETSc.IntType для наших индексов внутри, поэтому они должны стать 64-битными по размеру, если вы перекомпилируете.
Я никогда не использовал эту опцию на petsc. Некоторое время назад у нас были некоторые проблемы с масштабированием до большего количества ядер, но мы решили, что проблема для нас была с компиляцией OpenMPI. Перекомпиляция OpenMDAO исправила наши проблемы.
Так как эта ошибка появляется при настройке, нам не нужно запускать для тестирования кода. Если вы можете предоставить нам модель, которая показывает проблему, и мы можем ее запустить, то мы можем по крайней мере проверить, возникает ли такая же проблема в наших кластерах.
Было бы хорошо узнать, на скольких ядрах вы можете успешно работать и в какой момент он тоже выходит из строя.