17

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

  • 在 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 的行为吗?

4

3 回答 3

8
  • 如果库仍然使用所有内核,那么使用 n-jobs(和 joblib)有什么意义?

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

于 2019-03-21T19:02:14.557 回答
2

文档说:

此参数用于指定与 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 交互的更多详细信息,请参阅我们的并行性说明

于 2020-06-01T12:16:38.903 回答
-1

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

于 2020-01-23T09:15:16.423 回答