Параллельные байесовские поисковые СВР, пох似, умирают как в плане использования ЦП, так и в плане прогресса.

Вопрос или проблема

Этот вопрос не о том, почему SVM требуют много времени для обучения, а о ненадежном времени выполнения с использованием skopt BayesSearchCV и, как видно, умирающих процессов.

Краткий обзор:

Я пробую множество моделей. RForest, KNNRegressor, LassoRegression и также SVR. Каждая модель обучается несколько раз для разных временных интервалов временного ряда, а также для разных временных рядов. Они обучаются с использованием собственноручно написанного RollingWindowSplit и BayesianSearchCV для настройки гиперпараметров. (Когда я говорю об обучении, я действительно имею в виду выполнение BayesianSearchCV с этого момента)

Разные временные ряды состоят из одинакового типа признаков, масштабируются и предварительно обрабатываются одинаково, и имеют одинаковую размерность меток. Пробы находятся в одинаковом порядке величины, и все временные ряды обучаются примерно одинаковое время, либо 9 SVR, либо 12 SVR обучаются.

В зависимости от размера обучающего набора, есть от 4 * 5 * 10 подгонок (200) с формой [2832,22] и 8 * 5 * 10 (400) подгонок с формой [2064,22]. Это одинаково для всех моделей.

Поскольку я хочу, чтобы результаты были воспроизводимыми, случайное состояние BayesianSearchCVs установлено на 42. Кросс-валидация также выполняет 5 комбинаций параллельно (n_points) и может использовать все доступные ядра/потоки (n_jobs) моих ЦП.

Проблема:

При обучении SVR, как и ожидалось, они занимают гораздо больше времени, чем, например, LassoRegression. Однако время непостоянно. Для одного временного ряда SVR каждый занимает около 2 часов для обучения. Другому нужно 8 часов. У двух других ни один не завершен после 24 часов.

Когда я наблюдаю за информацией о процессе в диспетчере задач, процессы python, похоже, теряют подпроцессы через некоторое время, и общий потребление ЦП на процесс резко снижается с 60% до 6% (не всегда, и не для всех). Они также, похоже, зависают на одной и той же итерации BayesianSearchCVs, когда я перезапускаю их.

Чтобы показать разницу: один из временных рядов завершил обучение всех 12 SVR, в то время как 2 других застряли на 2-м SVR, а последний работает над 3-м SVR. Это воспроизводимо.

У меня нет никаких проблем с другими моделями. Это начинает меня злить, так как я не могу понять, в чем проблема. Я рассматривал возможность того, что это просто занимает много времени, или существуют незначительные, но имеющие большое влияние различия во временных рядах, но я не могу поверить, что есть такой большой эффект на время выполнения, когда количество строк и масштаб признаков одинаковы для каждого.

Похоже, что после некоторого времени обучение просто затихает, и sklearn/skopt не удается отобразить это корректно (я бы хотел услышать другое объяснение)

Что я попробовал для решения до сих пор:

  • Обучение временных рядов не параллельно.
  • Использование другого случайного состояния
  • Использование без случайного состояния
  • Запуск на другой машине (с гораздо более слабым оборудованием, так что было сложно сравнивать)
  • Перезагрузка моего ПК
  • Много раз перезагрузка моего ПК
  • Перезагрузка VS Code
  • Перезагрузка Кernel Jupyter
  • Молиться 😛

Дополнительная информация:

Обучение проходит в 4 параллельно работающих Jupyter Notebooks, запущенных в VS Code в локальной venv. Мой процессор – AMD Ryzen 7 7800X3D. Запускается на Windows 11.

П.С.: Я знаю, что некоторый код, вероятно, был бы полезен для ответа на это. Если это абсолютно необходимо, я предоставлю некоторый, однако, как я уже писал, некоторые утилитарные методы капсулируют разные части создания объекта и начала обучения, так что публикация минимального работоспособного примера будет далеко от фактического кода, а сам фактический код будет довольно большим.

Ответ или решение

Введение

В данном обсуждении мы сталкиваемся с проблемой, связанной с нестабильным временем выполнения и провисанием процессов при использовании BayesianSearchCV для настройки гиперпараметров моделей SVM (SVR) в рамках ваших временных рядов. Эта проблема требует детального анализа возможных причин и решений, поскольку она может крайне негативно повлиять на эффективность разработки и выполнения моделей машинного обучения.

Описание проблемы

Вы проводите обучение нескольких моделей, включая SVR, RForest, KNNRegressor и LassoRegression, с использованием настроенной процедуры разбиения Rolling Window и BayesianSearchCV. При этом time-series имеют идентичные характеристики, что, казалось бы, должно приводить к сопоставимому времени выполнения. Однако результаты оказались совершенно другими: от 2 часов до застревания в 24 часа и более для SVR. Примечательно, что программные процессы Python иногда теряют подсистемы, что приводит к резкому снижению потребления ЦП. При этом не наблюдается аналогичных проблем с другими моделями, такими как LassoRegression.

Анализ возможных причин

  1. Алгоритмические особенности SVR:

    • Формально, SVR требует больше вычислительных ресурсов по сравнению с линейными моделями вроде LassoRegression. Это связано с тем, что SVR использует ядра для построения высокоразмерного пространства, что может вызывать большее количество вычислительных операций из-за желания модели искать более оптимальные гиперпараметры.
  2. Параллельное выполнение:

    • Параллельные вычисления могут приводить к конкуренции за ресурсы, что может замедлять обработку. Возможно, увеличение семплов, или наложение процессов, которые забирают ресурсы, приводит к замедлению.
  3. Проблемы с управлением памятью:

    • Агрегированные данные и их количество могут различных образом влиять на производительность и потребление оперативной памяти. Возможны утечки памяти или чрезмерное использование модулей, что при использовании больших наборов данных может приводить к падению производительности.
  4. Системные ограничения:

    • Ваши настройки ОС и виртуального окружения могут играть роль. Например, ограничения на использование ресурсов в Windows, фоновая активность, или ограничения в Jupyter могут вносить доп. накладные расходы.
  5. Технические ошибки при сборке:

    • Возможны случаи, когда возникновение ошибок при установке библиотеки сконфигурировало ее на использование последовательных вычислений вместо параллельных, из-за чего динамика зависает.

Рекомендации по устранению проблемы

  1. Профилирование работы:

    • Используйте инструменты профилирования, такие как cProfile или line_profiler, для анализа времени выполнения различных частей вашего кода. Изучите, какие именно этапы занимают больше всего времени.
  2. Упрощение гиперпараметров:

    • Попробуйте сократить пространство гиперпараметров для SVR на первых этапах, чтобы быстрее получить первые результаты. Это поможет понять, где возникает узкое место выполнения.
  3. Параметры ядра:

    • Исследуйте влияние различных типов ядер в SVR. К примеру, ядра RBF могут быть более или менее эффективными, чем линейные.
  4. Контроль ресурсов ЦП и Памяти:

    • Настройте мониторинг ресурсов, чтобы увидеть, как много ЦП и памяти используется в каждой параллельной задаче. Используйте такие утилиты, как htop или встроенные средства Windows для отслеживания.
  5. Запуск на меньших выборках:

    • Если возможно, тестируйте модели на меньших выборках данных для быстрой итерации и понимания природы неконсистентности.
  6. Изолирование процесса:

    • Попробуйте выполнить код на одном ядре или уменьшить количество одновременно работающих процессов, чтобы проверить, возможна ли ошибка в многопоточности.

Заключение

Ваш опыт с SVR и BayesianSearchCV демонстрирует важные аспекты, связанные с производительностью и параллельными вычислениями. Понимание внутренних механизмов работы алгоритмов и грамотное управление ресурсами подсказками значительно упростят процесс обнаружения и устранения проблем. Кроме того, целенаправленная работа с вашим кодом и использование профилирования помогут выделить узкие места и оптимизировать ваши модели.

Оцените материал
Добавить комментарий

Капча загружается...