【问题标题】:Python scikit learn n_jobsPython scikit 学习 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)

标签: python parallel-processing scikit-learn joblib


【解决方案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_jobsjoblib,不要同时使用两者。

      【讨论】:

      • 你能解释一下原因吗?
      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 2023-04-10
      • 1970-01-01
      • 2018-10-21
      • 2016-12-20
      • 2018-02-04
      • 2017-04-26
      • 2016-07-16
      相关资源
      最近更新 更多