Python Модель SARIMA автоматически использует все ядра процессора. Как? - PullRequest
1 голос
/ 19 февраля 2020

Я использую скользящее среднее и модель SARIMA для прогнозирования временных рядов на моей машине, которая имеет 12 ядер.

Модель скользящего среднего требует 25 минут для работы на одном ядре. Используя многопроцессорный модуль, я смог сократить время работы до ~ 4 мин (используя 8 из 12 ядер). Проверяя результаты команды top, можно легко увидеть, что многопроцессорная обработка на самом деле использует 8 ядер и поведение соответствует ожидаемому.

Скользящее среднее (1 ядро) -> Использование ЦП для скользящего среднего 1 ядро ​​

Скользящее среднее (8 ядер) -> Использование ЦП для скользящего среднего 8 ядер

Сначала я выполнил те же процедуры, используя модель SARIMA, не используя многопроцессорность. К моему удивлению, он автоматически использовал все ядра / распределял работу по всем ядрам. В отличие от модели скользящего среднего (рисунок 1), где я мог видеть, что загрузка ЦП процесса составляет 100% для одного процесса и ~ 800% кумулятивно при использовании 8 ядер, здесь загрузка ЦП только для одного ядра колебалась между 1000% -1200% (т.е. все 12 ядер). Как и ожидалось, многопроцессорный модуль мне не сильно помог в этом случае, и результаты были намного хуже.

SARIMA (1 ядро) -> Использование ЦП Sarima 1 ядро ​​

SARIMA (8 ядер) -> Загрузка ЦП Sarima 8 core (вместо одного процесса, использующего 1200% в этом случае, некоторые процессы go более 100%)

Мой вопрос заключается в том, почему ОС автоматически распределяет работу по разным ядрам в случае модели SARIMA, в то время как я должен делать это явно (с помощью многопроцессорной обработки) в модели скользящего среднего. Может ли это быть из-за стиля написания программы python?

Другая информация:

  1. Я использую http://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html для настройки SARIMA.

  2. Я использую технику очереди процессов для распараллеливания кода

  3. SARIMA занимает 9 часов на 1 ядре (макс. При 1200%, как показано на изображениях выше) и более 24 часов, если я использую многопроцессорность .

Я новичок в stackoverflow и буду рад дополнить любую другую необходимую информацию. Пожалуйста, дайте мне знать, если что-то не понятно.

Обновлено: Я поднял вопрос об официальном репо пакета пирамиды, и автор ответил. То же самое можно получить здесь: https://github.com/alkaline-ml/pmdarima/issues/301

1 Ответ

0 голосов
/ 19 февраля 2020

Очевидная причина в том, что SARIMA разработан для работы на нескольких ядрах процессора. Принимая во внимание, что скользящее среднее не имеет этой функциональности, реализованной в нем. Это не имеет ничего общего с вашим стилем написания кода. Просто авторы пакета разработали код пакета двумя различными способами:

  1. Отсутствует встроенная многопроцессорная поддержка скользящего среднего и
  2. Встроенная многопроцессорная поддержка SARIMA

Еще одно замечание, которое вы должны исправить, заключается в том, что в случае SARIMA ОС не распределяет автоматически работу по различным ядрам. Код пакета SARIMA - это мастер, который распределяет всю работу по различным ядрам ЦП, поскольку он был разработан для поддержки и работы с несколькими ядрами его авторами.

Обновление:

Ваша догадка заключается в том, что многопроцессорный код с многопроцессорностью на уровне клиента + собственная многопроцессорность должны работать лучше. Но на самом деле это не работает лучше. Это связано с тем, что

  1. Поскольку собственная многопроцессорная обработка SARIMA сама поглощает ресурсы всех ядер вашего ЦП, какими вычислительными возможностями будет обладать многопроцессорная обработка на уровне клиента, чтобы ускорить процесс, поскольку вся вычислительная мощность на всех ядрах ЦП используется собственной многопроцессорной обработкой SARIMA?
  2. Так работает linux ОС или любая ОС. Если для процесса не осталось питания ЦП (в вашем случае это для многопроцессорного процесса на уровне клиента), процесс помещается ОС в очередь до тех пор, пока ЦП не станет доступным для него. Так как ваш многопроцессорный процесс на уровне клиента помещается в очередь и не выполняется активно, поскольку не осталось никакого процессора, он останавливается. Вы можете обратиться к Linux документации ОС для проверки того, что я сказал.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...