Как Hydras sweeper, в частности Ax-sweeper, освобождает/выделяет память?

#hydra-python

Вопрос:

Поэтому я использую Hydra 1.1 и hydra-ax-sweeper==1.1.5 для управления своей конфигурацией, а также для выполнения некоторой оптимизации гиперпараметров в среде minerl. Для этой цели я загружаю много данных в память (пик около 50 ГБ при загрузке с многопроцессорной обработкой, падает до 30 ГБ после полной загрузки) с помощью многопроцессорной обработки (с помощью pytorch).

При обычном запуске это не проблема (у моей машины более 90 Гб оперативной памяти), одна тренировка заканчивается без каких-либо проблем.

Однако, когда я запускаю один и тот же код с -m опцией (и hydra/sweeper: ax в конфигурации), код останавливается примерно через 2-3 запуска очистителя, застревая на этапе загрузки данных, потому что вся память системы ( память подкачки) занята.

Сначала я подумал, что это какая-то проблема с minerl кодом среды, который запускает java-код в подпроцессе. Поэтому я попытался запустить свой код без среды (только данные объемом 30 ГБ), и у меня все еще та же проблема. Поэтому я подозреваю, что у меня есть некоторая утечка памяти между уборщиком Гидры.

Итак, мой вопрос в том, как уборочная машина Hydra(или уборочная машина с топором) работает в промежутках между зачистками? У меня всегда складывалось впечатление , что он запускает main(cfg: DictConfig) @hydra.main(...) функцию с помощью, принимает скалярный возврат(оценку) и запускает байесовский оптимизатор с этой оценкой, при main() этом вызывается аналогично функции (все внутри правильно освобождается/мусор собирается между каждым запуском развертки).

Разве это не так? Должен ли я затем загружать данные где-то за пределами main() и хранить их между развертками?

Заранее большое вам спасибо!

Ответ №1:

Испытания hydra-ax-sweeper могут выполняться параллельно, в зависимости от результата вызова get_max_parallelism функции, определенной в ax.service.ax_client . Я подозреваю, что у вашей машины заканчивается память из-за этого параллелизма.

Плагин Hydra Ax в настоящее время не имеет группы конфигурации для настройки этого max_parallelism параметра, поэтому он автоматически устанавливается ax.

Загрузка данных за пределы main (как вы предложили) может быть хорошим решением этой проблемы.

Комментарии:

1. Привет @Яша ! спасибо за ответ и извините за поздний ответ. Спасибо за подробный ответ, хотя я не настолько знаком со всеми деталями вокруг AX, я приму этот ответ. К сожалению, процесс загрузки данных также требует некоторых параметров конфигурации от hydra, поэтому его перемещение довольно нетривиально. Я поднял вопрос в гидре гитхуб. В противном случае, я думаю, что я уберу часть загрузки данных и внесу в нее какие-либо изменения main() .

Ответ №2:

У Hydra sweepers, как правило, нет возможности контролировать параллелизм. За это отвечает лаунчер, который вы используете. Встроенная базовая программа запуска запускает задания последовательно, поэтому она не должна вызывать проблем с памятью. Если вы используете другие пусковые установки, вам может потребоваться контролировать их параллелизм с помощью определенных параметров пусковой установки.