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_jobs
或joblib
,不要同时使用两者。
【讨论】:
你能解释一下原因吗?以上是关于Python scikit 学习 n_jobs的主要内容,如果未能解决你的问题,请参考以下文章
python数据分析实战-第8章-用scikit-learn库实现机器学习