Задачи, отложенные навсегда с Celery, RabbitMQ и statsmodels

Я пытаюсь распределить некоторые задачи линейной регрессии, используя Celery с RabbitMQ. Настройка отлично работает с примером функции add(x,y), но когда я создаю экземпляр класса statsmodels OLS, например.

self.model = sm.OLS(self.y, self.X) 

рабочий ожидает неопределенное время, потребляя 100% ЦП.

Что здесь происходит?


person kyrre    schedule 24.06.2013    source источник
comment
У меня такая же проблема. Вы когда-нибудь решали эту проблему?   -  person Alan Illing    schedule 18.03.2014


Ответы (1)


По умолчанию сельдерей использует многопроцессорную библиотеку в качестве реализации параллелизма. Метод OLS StatsModels делает вызов Lapack, который (наряду со многими функциями в Lapack/BLAS) запускает собственный пул потоков для ускорения вычислений. К сожалению, потоки не наследуются после разветвления подпроцесса, поэтому создается зомби.

Вот обсуждение проблем Celery: https://github.com/celery/celery/issues/1842< /а>

Но, как указано в последнем посте, это не вина Сельдерея.

Существует долгое обсуждение проблемы OpenBLAS: https://github.com/xianyi/OpenBLAS/issues/294

Надеюсь, это не будет проблемой в будущем, потому что сборки OpenBLAS по умолчанию теперь безопасны для разветвления: http://numpy-discussion.10968.n7.nabble.com/Default-builds-of-OpenBLAS-разработка-ветка-теперь-форк-безопасная-td36523.html

(По состоянию на 9 февраля 2014 г. вам может потребоваться обновить версию или установить последнюю сборку для разработчиков).

Два обходных пути:

  • Используйте пул процессов потоков в celery (по умолчанию используется prefork). Опция --pool=threads
  • Не используйте функции, основанные на Lapack или BLAS. Реализация линейной регрессии на чистом Python доступна в scipy: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html, например
person Alan Illing    schedule 18.03.2014