Python scikit 学习 n_jobs

Posted

技术标签:

【中文标题】Python scikit 学习 n_jobs【英文标题】:Python scikit learn n_jobs 【发布时间】:2015-12-22 01:39:03 【问题描述】:

这不是一个真正的问题,但我想了解:

在 Win7 4 核 8 GB 系统上从 Anaconda 发行版运行 sklearn 在 200.000 个样本*200 个值的表上拟合 KMeans 模型。 以 n-jobs = -1 运行:(将if __name__ == '__main__': 行添加到我的脚本后)我看到脚本启动了 4 个进程 每个 10 个线程。每个进程使用大约 25% 的 CPU(总计: 100%)。似乎按预期工作 在 n-jobs = 1 的情况下运行:停留在单个进程上(不足为奇),有 20 个线程,并且还使用 100% 的 CPU。

我的问题:如果库仍然使用所有内核,那么使用 n-jobs(和 joblib)有什么意义?我错过了什么吗?它是特定于 Windows 的行为吗?

【问题讨论】:

n_jobs=1 一起使用其中一个核心 100% 的cpu。每个进程都在不同的核心中运行。在 4 核的 linux 中,当我运行 n_jobs=1 和运行 n_jobs=-1 时,我可以清楚地看到 cpu 使用情况:(100%,~5%, ~5%, ~5%)(100%, 100%, 100%, 100%)。每个进程占用给定核心的 100% 使用率,但如果您有 n_jobs=1,则仅使用一个核心。 感谢您的回复。同时,我无法重现这种现象,所以我猜这可能是由于机器或笔记本状态中的“某些东西”造成的。 有趣的是,我看到 H2O (GBM) 作为单个进程运行,并且在我的 8 核机器上使用了几乎 700% 的 CPU。 @Luengo 但似乎 OMP_NUM_THREADS 在使用 sklearn.linear_model.LassoCV(n_jobs=-1) 时也可以控制最大 cpu% ...你知道为什么吗? (据我所知,sklearn 没有使用 OpenMP) 【参考方案1】: 如果库仍然使用所有内核,那么使用 n-jobs(和 joblib)有什么意义?

它不会,如果您将 n_jobs 指定为 -1,它将使用所有内核。如果设置为 1 或 2,它将仅使用一个或两个内核(在 Linux 下测试完成 scikit-learn 0.20.3)。

【讨论】:

【参考方案2】:

documentation 说:

此参数用于指定有多少并发进程或 线程应该用于与 joblib 并行化的例程。

n_jobs 为整数,指定最大并发数 运行工人。如果给定 1,则根本不使用 joblib 并行性, 这对调试很有用。如果设置为 -1,则使用所有 CPU。为了 使用低于 -1 的 n_jobs,(n_cpus + 1 + n_jobs)。例如与 n_jobs=-2,使用除一个以外的所有 CPU。

n_jobs 默认为 None,表示未设置;通常是 解释为 n_jobs=1,除非当前 joblib.Parallel 后端 上下文另有说明。

有关使用 joblib 及其与 scikit-learn,请参考我们的parallelism notes。

【讨论】:

【参考方案3】:

您应该使用n_jobsjoblib,不要同时使用两者。

【讨论】:

你能解释一下原因吗?

以上是关于Python scikit 学习 n_jobs的主要内容,如果未能解决你的问题,请参考以下文章

python数据分析实战-第8章-用scikit-learn库实现机器学习

python机器学习scikit-learn的安装

将 python scikit 学习模型导出到 pmml

Python Scikit 学习 Knn 最近邻回归

在朴素贝叶斯(Python、scikit)中使用稀疏矩阵/在线学习

python机器学习库scikit-learn:SVR的基本应用