在PyQt5应用程序中,可以在不冻结的情况下通过并行作业运行sklearn

时间:2018-11-22 00:44:23

标签: scikit-learn pyqt multiprocessing qthread joblib

是否可以在不冻结gui的情况下在qt应用程序中运行,比如说sklearn gird search,它使用多个并行作业(n_jobs > 1)?问题在于,用于并行化sklearn代码的joblib无法将多进程运行到线程中。

例如,我正在使用Gridsearch来找到svr的最佳参数,这是相当计算密集的。

这个问题已经问了好几次了,但是没有找到解决方法:

pyqt5-run-sklearn-calculations-on-a-separate-qthread,建议使用QProcess吗?

multiprocessing-backed-parallel-loops-cannot-be-nested-below-threads,问题has been fixed后,threading.current_thread().name = 'MainThread'解决方法不起作用

joblib-parallel-uses-only-one-core-if-started-from-qthread,使用multiprocessing.Pool(processes=4)重写任务。此方法不适用于gridsearch嵌入njobs。

use sklearn cross validation train, in PyQt button,不要犹豫...

为什么不为此目的 提供任何见解(feature)?看起来它会很有用吗?

1 个答案:

答案 0 :(得分:0)

根据我对问题的了解,问题出在joblib使用的默认后端,即loky

在深入研究joblibsklearn文档之后,我通过将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):