Python scikit学习n_jobs

Bru*_*zen 5 python parallel-processing scikit-learn joblib

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

  • 在Win7 4核8 GB系统上从Anaconda distrib运行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特定的行为吗?

小智 8

文档

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

n_jobs 是一个整数,指定同时运行的工作线程的最大数量。如果给定 1,则根本不使用 joblib 并行性,这对于调试很有用。如果设置为 -1,则使用所有 CPU。对于低于 -1 的 n_jobs,使用 (n_cpus + 1 + n_jobs)。例如,当 n_jobs=-2 时,将使用除 1 个之外的所有 CPU。

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

有关 joblib 的使用及其与 scikit-learn 交互的更多详细信息,请参阅我们的并行性注释


小智 7

  • 如果库无论如何都使用所有内核,那么使用 n-jobs(和 joblib)有什么意义?

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