Python scikit learn n_jobs

22
这并不是一个实际的问题,但我想要了解:
  • 在Win7 4核8GB系统上从Anaconda distrib运行sklearn
  • 在200,000 samples*200 values表上拟合一个KMeans模型
  • 使用n-jobs = -1运行:(在我的脚本中添加if __name__ == '__main__':后)我看到脚本启动了4个进程,每个进程有10个线程。每个进程使用约25%的CPU(总共:100%)。似乎按预期工作
  • 使用n-jobs = 1运行:保持在单个进程上(不出所料),有20个线程,并且也使用100%的CPU。
我的问题是:如果库已经使用所有内核,那么使用n-jobs(和joblib)有什么意义?我错过了什么吗?这是Windows特定的行为吗?

23
使用 n_jobs=1 时,它将使用一个核心的100% CPU。每个进程在不同的核心上运行。在具有4个核心的Linux系统中,当我使用 n_jobs=1 运行时,可以清楚地看到CPU使用情况:(100%、〜5%、〜5%、〜5%);而当使用 n_jobs=-1 运行时,则为 (100%, 100%, 100%, 100%)。每个进程占用一个给定核心的100%,但如果您使用 n_jobs=1,则只使用一个核心。 - Imanol Luengo
感谢您的回复。与此同时,我无法重现这种现象,所以我猜测这可能是由于机器或笔记本电脑状态中的某些问题导致的。 - Bruno Hanzen
有趣的是,我发现H2O(GBM)作为单个进程运行,并在我的8核机器上利用了近700%的CPU。 - arun
@Luengo 但是当使用sklearn.linear_model.LassoCV(n_jobs=-1)时,OMP_NUM_THREADS似乎也可以控制最大的CPU利用率...你知道为什么吗?(据我所知,sklearn没有使用OpenMP) - kkkobelief24
3个回答

9
  • 如果库已经使用所有核心,使用n-jobs(和joblib)有什么意义?

如果将n_jobs设置为-1,则会使用所有核心。如果将其设置为1或2,则仅使用一个或两个核心(在Linux下测试scikit-learn 0.20.3)。


7

文档提到:

该参数用于指定使用多少并发进程或线程来执行利用joblib并行化的例程。

n_jobs是一个整数,用于指定最大并发运行工作进程数。如果设为1,则不使用joblib并行化,这对于调试很有用。如果设置为-1,则会使用所有可用的CPU。对于小于-1的n_jobs,使用(n_cpus + 1 + n_jobs)个。例如,当n_jobs=-2时,除了一个CPU之外,将使用所有可用的CPU。

n_jobs默认为None,表示未设置;一般情况下将其解释为n_jobs=1,除非当前joblib.Parallel后端上下文另有规定。

更多有关joblib的使用及其与Scikit-Learn的交互细节,请参见我们的并行处理笔记


-2

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


6
请问您能否解释一下原因? - Kai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接