aimclub / iOpt

Framework of intelligent optimization methods iOpt
https://iopt.readthedocs.io
BSD 3-Clause "New" or "Revised" License
52 stars 24 forks source link

Проблемы с сериализацией при использовании numberOfParallelPoints #156

Closed YamLyubov closed 1 year ago

YamLyubov commented 1 year ago

При попытке установить значение numberOfParallelPoints больше 1 сталкиваюсь со следующей ошибкой

image image

kozinove commented 1 year ago

повторяется ли проблема в примере examples/GKLS_example.py?

YamLyubov commented 1 year ago

examples/GKLS_example.py отрабатывает хорошо. Ошибка возникает при использовании в GOLEM

kozinove commented 1 year ago

Очевидно пролблема при создании Pool процессов. Не могли бы Вы дать некую инструкцию по запуску соответствующего примера?

В examples/GKLS_example.py Вы могли заметить что число процессов задается >1 (строка 18)

Также уточните - Вы используете версию github или pip?

После релиза Мы пытаемся в частности привести код к PEP8 согласно https://github.com/aimclub/iOpt/issues/117

YamLyubov commented 1 year ago

Я использовала pip версию iOpt==0.2.1

Добавила пример в ветку https://github.com/aimclub/GOLEM/tree/update-iopt-version. Он находится в файле examples/tuning_example.py.

В примере создается граф, в верщинах которого могут находится параметры. Параметры и их возможные значения задаются через SearchSpace. Максимизируется сумма числовых параметров в вершинах графа.

Весь код связанный с iOpt находится в файле golem/core/tuning/iopt_tuner.py.

kozinove commented 1 year ago

Мы запустили пример. Падение происходит при попытке создать Pool процессов: Calculator.pool = Pool(parameters.number_of_parallel_points, initializer=Calculator.worker_init, initargs=(self.evaluate_method,))

@staticmethod def worker_init(evaluate_method: ICriterionEvaluateMethod): Calculator.evaluate_method = evaluate_method Тут evaluate_method, по сути, просто обертка над задачей, которая в методе вычисляет дополнительные характеристики. worker_init нужен чтобы в каждом порожденном процессе была копия оптимизируемой задачи. Без объекта нет возможность вычислять значение критерия.

Падение происходит из-за того, что не удается сериализовать задачу После экспериментов выяснилось, что проблема в (objective_evaluate) class GolemProblem(Problem, Generic[DomainGraphForTune]): def init(self, graph: DomainGraphForTune, objective_evaluate: ObjectiveEvaluate, problem_parameters: IOptProblemParameters):

    self.objective_evaluate = objective_evaluate

Если я правильно понимаю, это объект содержащий указатель на ф-ю и он не имеет смысл при сериализации.

YamLyubov commented 1 year ago

Да, это указатель на функцию. Как можно попробовать рещить эту проблему?

kozinove commented 1 year ago

Я так понимаю варианты решений есть тут https://stackoverflow.com/questions/72766345/attributeerror-cant-pickle-local-object-in-multiprocessing

Я сам в ближайшее время постараюсь что-то сделать по мануалам

kozinove commented 1 year ago

Я нашел библиотеку https://pypi.org/project/pathos/ Она делает обертку над Pool из multiprocessing и dill Если заменить стандартный pool на from pathos.multiprocessing import _ProcessPool то у меня счет запускается без исключений.

Сама библиотека регульярно обновляется. По всей видиости мы пейдем на нее, но нужно тестировать корректность, т.к. это не стандартная библиотека.

Если есть рекомендации по другим оберткам над Pool из multiprocessing, то пишите рекомендации.

kozinove commented 1 year ago

фикс с созданием pool тут https://github.com/aimclub/iOpt/pull/157

nicl-nno commented 1 year ago

А это ещё актуально или можно закрывать? Фикс вроде влит.

kozinove commented 1 year ago

По моим представлениям можно закрыть