Ошибки MPI MPI_ERR_IN_STATUS и BadPickleGet в OpenMDAO при параллельном запуске внешних кодов со многими процессорами

Проблема с OpenMDAO, с которой я работаю, довольно сложна, поэтому я не думаю, что было бы полезно публиковать весь сценарий. Тем не менее, базовая установка заключается в том, что корень моей проблемы — это ParallelFDGroup (на самом деле пока не конечная разность — просто запуск задачи один раз), которая содержит несколько обычных компонентов, а также параллельную группу. Параллельная группа отвечает за выполнение 56 экземпляров внешнего кода (один компонент на экземпляр кода). Странно, когда запускаю задачу с 4-8 процессорами, вроде все нормально работает (иногда работает даже с 10-12 процессорами). Но когда я пытаюсь использовать больше процессоров (20+), я постоянно получаю следующие ошибки. Он обеспечивает две трассировки:

Traceback (most recent call last):
  File "opt_5mw.py", line 216, in <module>
    top.setup()   #call setup
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/problem.py", line 644, in setup
    self.root._setup_vectors(param_owners, impl=self._impl, alloc_derivs=alloc_derivs)
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/group.py", line 476, in _setup_vectors
    self._u_size_lists = self.unknowns._get_flattened_sizes()
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/petsc_impl.py", line 204, in _get_flattened_sizes
    return self.comm.allgather(sizes)
  File "MPI/Comm.pyx", line 1291, in mpi4py.MPI.Comm.allgather (src/mpi4py.MPI.c:109194)
  File "MPI/msgpickle.pxi", line 746, in mpi4py.MPI.PyMPI_allgather (src/mpi4py.MPI.c:48575)
mpi4py.MPI.Exception: MPI_ERR_IN_STATUS: error code in status

Traceback (most recent call last):
  File "opt_5mw.py", line 216, in <module>
    top.setup()   #call setup
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/problem.py", line 644, in setup
    self.root._setup_vectors(param_owners, impl=self._impl, alloc_derivs=alloc_derivs)
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/group.py", line 476, in _setup_vectors
    self._u_size_lists = self.unknowns._get_flattened_sizes()
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/petsc_impl.py", line 204, in _get_flattened_sizes
    return self.comm.allgather(sizes)
  File "MPI/Comm.pyx", line 1291, in mpi4py.MPI.Comm.allgather (src/mpi4py.MPI.c:109194)
  File "MPI/msgpickle.pxi", line 749, in mpi4py.MPI.PyMPI_allgather (src/mpi4py.MPI.c:48609)
  File "MPI/msgpickle.pxi", line 191, in mpi4py.MPI.Pickle.loadv (src/mpi4py.MPI.c:41957)
  File "MPI/msgpickle.pxi", line 143, in mpi4py.MPI.Pickle.load (src/mpi4py.MPI.c:41248)
cPickle.BadPickleGet: 65

Я работаю под Ubuntu с OpenMDAO 1.7.3. Я пробовал работать как с mpirun.openmpi (OpenRTE) 1.4.3, так и с mpirun (Open MPI) 1.4.3, и в каждом случае получал одинаковый результат.

Я нашел этот пост, который, кажется, предполагает, что что-то не так с установка МПИ. Но если бы это было так, мне кажется странным, что задача работала бы для небольшого количества процессоров, но не для большего числа. Я также могу запустить относительно простую задачу OpenMDAO (без внешних кодов) с 32 процессорами без происшествий.

Поскольку трассировка ссылается на неизвестные OpenMDAO, я задался вопросом, существуют ли ограничения на размер неизвестных OpenMDAO. В моем случае каждый компонент внешнего кода имеет несколько десятков выходных массивов, каждый из которых может содержать до 50 000–60 000 элементов. Может это проблематично? Каждый компонент внешнего кода также считывает один и тот же набор входных файлов. Это тоже может быть проблемой? Я попытался убедиться, что доступ для чтения и записи определен правильно, но, возможно, этого недостаточно.

Любые предложения о том, что может быть виновником в этой ситуации, приветствуются.

РЕДАКТИРОВАТЬ: я должен добавить, что я пытался запустить проблему без фактического запуска внешних кодов (т.е. компоненты в параллельной группе вызываются и настраиваются, но внешние подпроцессы фактически никогда не создаются), и проблема сохраняется.

EDIT2: я сделал еще несколько отладок по этой проблеме и подумал, что должен поделиться тем немногим, что я обнаружил. Если я сведу проблему только к параллельной группе, содержащей экземпляры внешнего кода, проблема не исчезнет. Однако если я уменьшу количество компонентов в параллельной группе практически до нуля — только функцию печати для настройки и дляsolve_nonlinear— тогда задача может успешно «выполняться» с большим количеством процессоров. Я начал добавлять строки настройки одну за другой, чтобы посмотреть, что создаст проблемы. Я столкнулся с проблемами при попытке добавить в компоненты много больших неизвестных. На самом деле я все еще могу добавить только одно большое неизвестное — например, это работает:

self.add_output('BigOutput', shape=[100000])

Но когда я пытаюсь добавить слишком много больших выходных данных, как показано ниже, я получаю ошибки:

for i in range(100):
    outputname = 'BigOutput{0}'.format(i)
    self.add_output(outputname, shape=[100000])

Иногда я просто получаю общую ошибку нарушения сегментации от PETSc. В других случаях я получаю довольно длинную трассировку, которая слишком длинна, чтобы публиковать ее здесь — я опубликую только начало на случай, если она даст какие-либо полезные подсказки:

*** glibc detected *** python2.7: free(): invalid pointer: 0x00007f21204f5010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7da26)[0x7f2285f0ca26]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(sqlite3_free+0x4f)[0x7f2269b7754f]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(+0x1cbbc)[0x7f2269b87bbc]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(+0x54d6c)[0x7f2269bbfd6c]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(+0x9d31f)[0x7f2269c0831f]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(sqlite3_step+0x1bf)[0x7f2269be261f]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/_sqlite3.so(pysqlite_step+0x2d)[0x7f2269e4306d]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/_sqlite3.so(_pysqlite_query_execute+0x661)[0x7f2269e404b1]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x8942)[0x7f2286c6a5a2]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x86c3)[0x7f2286c6a323]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x86c3)[0x7f2286c6a323]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x89e)[0x7f2286c6b1ce]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(+0x797e1)[0x7f2286be67e1]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyObject_Call+0x53)[0x7f2286bb6dc3]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(+0x5c54f)[0x7f2286bc954f]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyObject_Call+0x53)[0x7f2286bb6dc3]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_CallObjectWithKeywords+0x43)[0x7f2286c60d63]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(+0x136652)[0x7f2286ca3652]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x7f2286957e9a]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f2285f8236d]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 9706352                            /home/austinherrema/miniconda2/bin/python2.7
00600000-00601000 rw-p 00000000 08:03 9706352                            /home/austinherrema/miniconda2/bin/python2.7
00aca000-113891000 rw-p 00000000 00:00 0                                 [heap]
7f21107d6000-7f2241957000 rw-p 00000000 00:00 0
etc...

person aherrema    schedule 15.12.2016    source источник
comment
у вас, вероятно, не хватает памяти с большим количеством неизвестных... есть ограничение на 32-битную математику.   -  person Justin Gray    schedule 17.12.2016


Ответы (1)


трудно догадаться, что здесь происходит, но если это работает для небольшого количества процессоров, а не для более крупных, можно предположить, что проблема проявляется, когда вы используете более одного узла, и данные должны передаваться по сети. . Я видел плохие компиляции MPI, которые вели себя подобным образом. Все бы работало, если бы я сохранил работу на одном узле, но сломал более одного узла.

Трассировка показывает, что вы даже не проходите настройку. Так что вряд ли это будет что-то в вашем внешнем коде или любом другом методе запуска компонентов.

Если вы работаете в кластере, компилируете ли вы свой собственный MPI? Обычно вам нужно скомпилировать очень специфичные опции/библиотеки для любой библиотеки HPC. Но большинство систем HPC предоставляют модули, которые вы можете загрузить с предварительно скомпилированным mpi.

person Justin Gray    schedule 15.12.2016
comment
Спасибо за ваши мысли! Я не совсем обдумал тот факт, что он даже не прошел настройку, так что это может быть полезно. На самом деле мы работаем на нашей собственной машине, поэтому нам не пришлось делать ничего слишком сумасшедшего в отношении компиляции MPI. Просто установил ванильный MPI с помощью apt-get. Опять же, если бы проблема была связана с проблемой самого MPI, я бы ожидал, что он будет вести себя таким образом для любой проблемы с использованием большего количества процессоров, верно? Но это не так. Я могу без проблем запустить простую задачу оптимизации omdao на 32 процессорах. - person aherrema; 15.12.2016
comment
После еще нескольких экспериментов вы можете оказаться правы насчет проблемы с несколькими узлами. Определенно кажется, что у нас меньше проблем при использовании процессоров, равных только одному узлу (хотя трудно понять, какие процессоры используются для каких попыток). Все еще не объясняет, почему я могу выполнить простую задачу с полным числом процессоров, но все же кажется актуальным. Возможно, проблема с mpi4py... - person aherrema; 15.12.2016
comment
@aherrema Один быстрый момент, возможно, вы уже проверили, но это очень важно при использовании mpi4py, поскольку позже вы можете столкнуться со странным поведением: проверяли ли вы, что используемый вами mpi4py построен для точно такого же типа (OpenMPI, MPICH, и т.д.) и версию библиотеки MPI, которую вы загружаете в свою среду? Однажды у меня была проблема, вызванная этим, но я не знаю, применимо ли это в вашем случае. Вы можете проверить с помощью: from mpi4py import MPI name, version = MPI.get_vendor() или просто напечатать MPI.get_vendor() - person fedepad; 16.12.2016
comment
@fedepad Я ценю предложение и инструкции по проверке версии mpi4py. При запуске MPI.get_vender() я получаю ('Open MPI', (1, 4, 3)), что похоже на OpenMPI 1.4.3, который я использую. Так что я не думаю, что это все. Но спасибо! - person aherrema; 16.12.2016
comment
Добавил немного информации в исходный пост. Кажется, проблема как-то связана с неизвестными... - person aherrema; 16.12.2016