В приложении PyQt5 возможно ли запускать sklearn с параллельными заданиями без зависания - PullRequest
0 голосов
/ 22 ноября 2018

Возможно ли запустить в приложении qt без зависания графического интерфейса, скажем, sklearn gird search , который использует несколько заданий параллельно (n_jobs > 1)?Проблема в том, что joblib, который используется для распараллеливания sklearn-кода, не может запустить многопроцессорную обработку в потоке.

Например, я использую Gridsearch для поиска лучших параметров для svr, который довольно требователен к вычислениям.

Этот вопрос задавался несколько раз, но решение не найдено:

pyqt5-run-sklearn-computing-on-Отдельно-qthread , предлагаем использовать QProcess?

многопроцессорная поддержка параллельных циклов, которые не могут быть вложенными под потоками , обходной путь threading.current_thread().name = 'MainThread' не работает после устранения проблемы

joblib-параллельный-использует-только-одно-ядро-если-началось-из-qthread , переписать задачу, используя multiprocessing.Pool(processes=4).Этот метод не применим для gridsearch embed njobs.

использовать команду перекрестной проверки sklearn, в кнопке PyQt , Нет ответов ...

И любое понимание, почему это намеренно не поддерживается (это функция )?Кажется, что-то, что было бы весьма полезно?

1 Ответ

0 голосов
/ 07 июля 2019

Насколько я понимаю, проблема заключается в бэкэнде по умолчанию, используемом joblib, а именно loky.

После некоторого поиска в joblib и В документации по sklearn я решил проблему, переключив бэкэнд joblib на threading.Обратите внимание, что вызов register_parallel_backend находится вне функции __init__.

from sklearn.utils import parallel_backend, register_parallel_backend
from joblib._parallel_backends import ThreadingBackend

class ModelTrainer(QRunnable):
    register_parallel_backend('threading', ThreadingBackend, make_default=True)

    def __init__(self, **kwargs):
...