Вопрос или проблема
Этот вопрос не о том, почему 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
.
Анализ возможных причин
-
Алгоритмические особенности SVR:
- Формально,
SVR
требует больше вычислительных ресурсов по сравнению с линейными моделями вродеLassoRegression
. Это связано с тем, что SVR использует ядра для построения высокоразмерного пространства, что может вызывать большее количество вычислительных операций из-за желания модели искать более оптимальные гиперпараметры.
- Формально,
-
Параллельное выполнение:
- Параллельные вычисления могут приводить к конкуренции за ресурсы, что может замедлять обработку. Возможно, увеличение семплов, или наложение процессов, которые забирают ресурсы, приводит к замедлению.
-
Проблемы с управлением памятью:
- Агрегированные данные и их количество могут различных образом влиять на производительность и потребление оперативной памяти. Возможны утечки памяти или чрезмерное использование модулей, что при использовании больших наборов данных может приводить к падению производительности.
-
Системные ограничения:
- Ваши настройки ОС и виртуального окружения могут играть роль. Например, ограничения на использование ресурсов в Windows, фоновая активность, или ограничения в
Jupyter
могут вносить доп. накладные расходы.
- Ваши настройки ОС и виртуального окружения могут играть роль. Например, ограничения на использование ресурсов в Windows, фоновая активность, или ограничения в
-
Технические ошибки при сборке:
- Возможны случаи, когда возникновение ошибок при установке библиотеки сконфигурировало ее на использование последовательных вычислений вместо параллельных, из-за чего динамика зависает.
Рекомендации по устранению проблемы
-
Профилирование работы:
- Используйте инструменты профилирования, такие как
cProfile
илиline_profiler
, для анализа времени выполнения различных частей вашего кода. Изучите, какие именно этапы занимают больше всего времени.
- Используйте инструменты профилирования, такие как
-
Упрощение гиперпараметров:
- Попробуйте сократить пространство гиперпараметров для SVR на первых этапах, чтобы быстрее получить первые результаты. Это поможет понять, где возникает узкое место выполнения.
-
Параметры ядра:
- Исследуйте влияние различных типов ядер в SVR. К примеру, ядра RBF могут быть более или менее эффективными, чем линейные.
-
Контроль ресурсов ЦП и Памяти:
- Настройте мониторинг ресурсов, чтобы увидеть, как много ЦП и памяти используется в каждой параллельной задаче. Используйте такие утилиты, как
htop
или встроенные средства Windows для отслеживания.
- Настройте мониторинг ресурсов, чтобы увидеть, как много ЦП и памяти используется в каждой параллельной задаче. Используйте такие утилиты, как
-
Запуск на меньших выборках:
- Если возможно, тестируйте модели на меньших выборках данных для быстрой итерации и понимания природы неконсистентности.
-
Изолирование процесса:
- Попробуйте выполнить код на одном ядре или уменьшить количество одновременно работающих процессов, чтобы проверить, возможна ли ошибка в многопоточности.
Заключение
Ваш опыт с SVR
и BayesianSearchCV
демонстрирует важные аспекты, связанные с производительностью и параллельными вычислениями. Понимание внутренних механизмов работы алгоритмов и грамотное управление ресурсами подсказками значительно упростят процесс обнаружения и устранения проблем. Кроме того, целенаправленная работа с вашим кодом и использование профилирования помогут выделить узкие места и оптимизировать ваши модели.