这不是一个真正的问题,但我想理解:
- 在Win7 4核8gb系统上运行sklearn from Anaconda发行版
- 在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(和joblib)有什么意义?
它没有,如果您将n_jobs指定为-1,它将使用所有内核。如果设置为1或2,它将只使用一个或两个内核(在Linux下完成scikit-learn 0.20.3的测试)。
文档说:
该参数用于指定有多少个并发进程线程应该用于与joblib并行的例程。
n_jobs是一个整数,指定最大并发数运行工人。如果给定1,则根本不使用job并行度,这对调试很有用。设置为-1时,表示使用所有cpu。为使用-1以下的N_jobs, (n_cpu + 1 + N_jobs)。例如n_jobs=-2,所有cpu都被占用
n_jobs默认为None,表示未设置;它通常是解释为n_jobs=1,除非当前job。并行端上下文另有规定。
有关joblib的使用及其与Scikit-learn,请参考我们的并行注释。
您应该使用n_jobs
或joblib
,不要同时使用