OpenMDAO 1.x: параллельная запись

При запуске анализа в MPI с распределенными компонентами в ParallelGroup я получаю сообщение об ошибке при добавлении DumpRecorder в анализ. Ниже приведен небольшой пример, демонстрирующий это (это было выполнено с последним коммитом основной ветки aaa67a4d51f4081e9e41b250b0a76b077f6f0c21 от 28.10.2015):

import numpy as np
from openmdao.core.mpi_wrap import MPI
from openmdao.api import Component, Group, DumpRecorder, Problem, ParallelGroup


class Sliced(Component):

    def __init__(self):
        super(Sliced, self).__init__()

        self.add_param('x', 0.)
        self.add_output('y', 0.)

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

        unknowns['y'] = params['x'] * 2.


class VectorComp(Component):

    def __init__(self, size):
        super(VectorComp, self).__init__()

        self.add_param('xin', np.zeros(size))

        self.add_output('x', np.zeros(size))

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

        unknowns['x'] = params['xin'] * 2.


class Analysis(Group):

    def __init__(self, size):
        super(Analysis, self).__init__()

        self.add('v', VectorComp(size), promotes=['*'])

        par = self.add('par', ParallelGroup())
        for i in range(size):
            par.add('sec%02d' % i, Sliced())
            self.connect('x', 'par.sec%02d.x' % i, src_indices=[i])


if __name__ == '__main__':

    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=Analysis(4))

    recorder = DumpRecorder('optimization.log')
    # adding specific includes works, but leaving it out results in a crash
    # recorder.options['includes'] = ['x']
    p.driver.add_recorder(recorder)
    p.setup()
    p.run()

Ошибка, которая возникает:

RuntimeError: Cannot access remote Variable 'par.sec00.x' in this process.

Я вижу, что рекордер создает дамп файла для каждого процессора, так что не должен ли метод BaseRecorder._filter_vectors отфильтровывать параметры, отсутствующие на конкретном процессоре? Я еще недостаточно знаком с кодом, чтобы предложить исправление, поэтому я надеюсь, что разработчики OpenMDAO смогут легко понять, что пошло не так.

Ручное указание включений работает, так как тогда параметры Sliced ​​исключаются, но было бы неплохо, если бы в этом не было необходимости, и обрабатывались под капотом.

Я также хочу сообщить вам, ребята, как мы взволнованы новым фреймворком. Это настолько намного быстрее, чем версия 0.x, а функция параллельного FD высоко ценится и работает как шарм!


person frza    schedule 02.11.2015    source источник


Ответы (1)


Были некоторые недавние изменения, которые параллельно ломали регистратор дампа. Мы написали историю, чтобы кто-нибудь это поправил, а пока вы можете попробовать диктофон SqliteRecorder. Это то, что я использовал для тестирования производительности в CADRE. Вы настраиваете его таким же образом, но затем для чтения значений используется sqlitedict. В документах есть небольшой пример, но более практичный пример находится здесь, в коде CADRE:

https://github.com/OpenMDAO/CADRE/blob/master/plot_progress.py

person Kenneth Moore    schedule 02.11.2015