Pyomo экземпляры в многопоточности Python - PullRequest
0 голосов
/ 25 сентября 2019

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

Я подошел к этому двумя способами:

с использованием solver_manager инесколько пиро мип серверов.Здесь я просто должен поставить в очередь инсайны, и менеджер решателя назначил бы проблемы пиро-mip-серверам.Но серверы Pyro MIP занимают много памяти и сохраняют ее даже после вычисления конечного результата.используя opt solver.а) Я могу решить с помощью opt solver напрямую, но это медленно.б) используя многопоточность.Я попытался создать threadPoolExecutor с 5 потоками, а затем решить эти 450 экземпляров в разных потоках.Но простой переход к многопоточности приводит к тому, что pyomo выдает ошибки.

def optimize():
    optsolver = SolverFactory(self.solver_name)
    value = self.initialize_all_values()
    for timestep in range(24):
        instance_list = self.create_instance_list(value)
        futures = {}
        with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
            for instance_object in instance_list:
                futures = {executor.submit(self.thread_solver, instance_object["instance"], optsolver, timestep)}
            for future in concurrent.futures.as_completed(futures):
                try:
                    result = future.result()
                    value.update(result)
                except Exception as e:
                    self.logger.error(e)


def thread_solver(instance, optsolver, timestep):
    result = optsolver.solve(instance)
    if (result.solver.status == SolverStatus.ok) and (
            result.solver.termination_condition == TerminationCondition.optimal):

        instance.solutions.load_from(result)

        my_dict = {}
        for v in instance.component_objects(Var, active=True):
            varobject = getattr(instance, str(v))
            var_list = []
            try:
                for index in varobject:
                    var_list.append(varobject[index].value)
                my_dict[str(v)] = var_list
            except Exception as e:
                self.logger.error("error reading result " + str(e))

        value = {key: my_dict[k][0]}
        return value

    elif result.solver.termination_condition == TerminationCondition.infeasible:
        self.logger.info("Termination condition is infeasible")
        return {}
    else:
        self.logger.info("Nothing fits")
        return {}

Я получаю следующие ошибки / выходные данные:

Ничто не подходит. Решателю не удалось обнаружить входной файл проблемы: / usr / src /app / temp / pyomo / tmpn23yhmz_.pyomo.lp Я установил местоположение временного файла pyomo в "/ usr / src / app / temp / pyomo". Тот же самый код прекрасно работает без многопоточности.Есть ли причина, по которой pyomo не решил проблему?

ОБНОВЛЕНИЕ 1: Я пытался использовать mutex при попытке вызвать optsolver.solve (instance).Это помогло уменьшить вышеупомянутую ошибку и не полностью устранить.Всякий раз, когда возникают эти ошибки, я пытался решить экземпляр снова, и во второй попытке они будут устранены.Итак, многопоточность работает, но я не знаю, почему ошибки по-прежнему возникают.

...