【问题标题】:SciKit Learn Parallel Processing 0.17 to 0.18 (Python 2.7)SciKit 学习并行处理 0.17 到 0.18 (Python 2.7)
【发布时间】:2017-05-16 02:54:36
【问题描述】:

由于某种原因,即使我将 n_jobs 设置为 1,下面的代码仍在使用所有可用的内核。我是否遗漏了什么或者我应该在 scikit 上提交问题?

import numpy as np
from sklearn import linear_model

liReg = linear_model.LinearRegression(n_jobs=1)

a = np.random.rand(10000,20)
b = np.random.rand(10000)

for i in range(1000):
    liReg.fit(a, b)
    liReg.predict(a)

我有两台相同的服务器,但一台运行 scikit v0.18 和一台 v0.17 - 这仅在使用 0.18 时发生。

这是time python example.py的输出:

使用 0.17 - 只使用一个核心:

real    0m8.381s
user    0m6.387s
sys     0m1.677s

使用 0.18 - 使用所有内核:

real    0m32.308s # I guess longer due to overhead of parallel process management
user    2m53.612s
sys     20m48.285s

【问题讨论】:

  • 并行处理有这么多开销是很奇怪的。我在我的电脑上试过,它使用所有内核,但运行时间为 6 秒(在 Ipython 中使用 %timeit)。我有 sklearn v0.18
  • 使用n_jobs=2,它似乎仍然使用了我所有的核心,但速度较慢(10 秒,%timeit)
  • (我有 64 个双核 cpu...所以这可以解释更戏剧性的效果...)无论如何它仍然使用所有核心仍然很奇怪吗?

标签: python scikit-learn multiprocessing


【解决方案1】:

来自 Github 上的@GaelVaroquaux:https://github.com/scikit-learn/scikit-learn/issues/8883#issuecomment-301567818

您很可能正在使用支持并行的线性代数库 (如 MKL 或 openBLAS)。因此,不是 scikit-learn 在做 并行计算,它无法控制它(它是一个组件 在 scikit-learn 中使用)。您需要了解如何控制 对应的计算砖。

在我的例子中,我在 fedora linux 上使用 OpenBLAS,所以我简单地添加了: export OPENBLAS_NUM_THREADS=1 到我的.bashrc 以禁用线性代数调用中的多线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2016-05-28
    • 2018-05-18
    • 2016-05-23
    • 2017-12-19
    • 2023-04-10
    相关资源
    最近更新 更多