Joblib 不在多核上 运行

Joblib doesn't run on multiple cores

我需要拟合多个分类器(来自 scikit-learn)并对它们进行评分。

clf1.fit(x_fit,Y_fit)
clf2.fit(x_fit,Y_fit)
clf3.fit(x_fit,Y_fit)
clf4.fit(x_fit,Y_fit)

acc1 = clf1.score(x_score,Y_score)
acc2 = clf2.score(x_score,Y_score)
acc3 = clf3score(x_score,Y_score)
acc4 = clf4.score(x_score,Y_score)

事实证明这很慢。因此我想利用 joblib 并使我的代码并行执行。这是我的代码

def fit_score(x_fit, Y_fit, x_score, Y_score, clf):
    clf.fit(x_fit, Y_fit)
    return clf.score(x_score, Y_score)

acc1, acc2, acc3, acc4 = Parallel(n_jobs=4)(delayed(fit_score)(x_fit, Y_fit, x_score, Y_score, clf) for clf in [clf1, clf2, clf3, clf4])

不幸的是,这似乎不太奏效。我正在观察 CPU 与 htop 的用法,看起来这仍然是 运行 在一个单核上。我搜索了一个类似的线程,但是大多数人都因为使用并行的开销而增加了运行时间。但就我而言,它似乎根本没有使用并行。

我做错了什么吗?

感谢您的帮助!

有些 sklearn 例程只使用 1 个内核,但有些是为使用多个内核而设计的。 Sklearn 有一个基于 jobkib 的后端,你应该试试。 https://scikit-learn.org/stable/modules/generated/sklearn.utils.parallel_backend.html

我认为解决其余问题需要您在 OS 和 Python 上分享详细信息。

感谢您的回答。我终于弄清楚问题出在哪里了。 不幸的是,我发现,我上面发布的代码实际上是 运行 在四个核心上,正如我想要的那样(每个分类器都在其核心上安装和评分)。但是,由于四个分类器中的三个比第四个早得多,因此几乎看不到代码真正运行多核。

不过谢谢你的帮助!

您可以尝试使用算法的加速实现 - 例如 scikit-learn-intelex - https://github.com/intel/scikit-learn-intelex

通过使用本机优化的库,即使在内核数量有限的情况下,您也可以获得更好的性能。

首先安装包

pip install scikit-learn-intelex

然后在您的 python 脚本中添加

from sklearnex import patch_sklearn
patch_sklearn()