В приложении PyQt5 возможно ли запускать sklearn с параллельными заданиями без зависания
Можно ли запускать в приложении qt, не замораживая графический интерфейс, скажем, поиск sklearn gird, который использует несколько заданий параллельно (n_jobs > 1
)? Проблема в том, что joblib, который используется для распараллеливания кода sklearn, не может запустить многопроцессорную обработку в потоке.
Например, я использую Gridsearch, чтобы найти лучшие параметры для svr, который довольно интенсивен в вычислительном отношении.
Этот вопрос задавался несколько раз, но решение не найдено:
pyqt5-run-sklearn-расчеты-на-отдельном-qthread, предлагают использовать QProcess
?
мультипроцессорная поддержка параллельных циклов, которые не могут быть вложенными ниже потоков, threading.current_thread().name = 'MainThread'
Обходной путь не работает после устранения проблемы
joblib-параллельный-использует-только-одно-ядро-если-началось-из-qthread, переписать задачу, используя multiprocessing.Pool(processes=4)
, Этот метод не применим для gridsearch embed njobs.
И любая идея, почему это намеренно не поддерживается (это особенность)? Кажется, что-то, что было бы весьма полезно?
0 ответов
Насколько я понимаю, проблема связана с серверной частью по умолчанию, используемой 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):