Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
YamLyubov opened this issue Jul 20, 2023 · 11 comments

Comments

@YamLyubov
Copy link
Collaborator

YamLyubov commented Jul 20, 2023

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

image
image

@kozinove
Copy link
Contributor

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

@YamLyubov
Copy link
Collaborator Author

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

@kozinove
Copy link
Contributor

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

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

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

После релиза Мы пытаемся в частности привести код к PEP8 согласно #117

@YamLyubov
Copy link
Collaborator Author

Я использовала 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
Copy link
Contributor

Мы запустили пример.
Падение происходит при попытке создать 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
Copy link
Collaborator Author

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

@kozinove
Copy link
Contributor

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

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

@kozinove
Copy link
Contributor

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

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

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

@kozinove
Copy link
Contributor

фикс с созданием pool тут
#157

@nicl-nno
Copy link

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

@kozinove
Copy link
Contributor

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

@alvls alvls closed this as completed Oct 31, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants