Closed YamLyubov closed 1 year ago
повторяется ли проблема в примере examples/GKLS_example.py?
examples/GKLS_example.py отрабатывает хорошо. Ошибка возникает при использовании в GOLEM
Очевидно пролблема при создании Pool процессов. Не могли бы Вы дать некую инструкцию по запуску соответствующего примера?
В examples/GKLS_example.py Вы могли заметить что число процессов задается >1 (строка 18)
Также уточните - Вы используете версию github или pip?
После релиза Мы пытаемся в частности привести код к PEP8 согласно https://github.com/aimclub/iOpt/issues/117
Я использовала 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.
Мы запустили пример. Падение происходит при попытке создать 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
Если я правильно понимаю, это объект содержащий указатель на ф-ю и он не имеет смысл при сериализации.
Да, это указатель на функцию. Как можно попробовать рещить эту проблему?
Я так понимаю варианты решений есть тут https://stackoverflow.com/questions/72766345/attributeerror-cant-pickle-local-object-in-multiprocessing
Я сам в ближайшее время постараюсь что-то сделать по мануалам
Я нашел библиотеку https://pypi.org/project/pathos/ Она делает обертку над Pool из multiprocessing и dill Если заменить стандартный pool на from pathos.multiprocessing import _ProcessPool то у меня счет запускается без исключений.
Сама библиотека регульярно обновляется. По всей видиости мы пейдем на нее, но нужно тестировать корректность, т.к. это не стандартная библиотека.
Если есть рекомендации по другим оберткам над Pool из multiprocessing, то пишите рекомендации.
фикс с созданием pool тут https://github.com/aimclub/iOpt/pull/157
А это ещё актуально или можно закрывать? Фикс вроде влит.
По моим представлениям можно закрыть
При попытке установить значение
numberOfParallelPoints
больше 1 сталкиваюсь со следующей ошибкой