SciKit学习并行处理0.17到0.18(Python 2.7)

时间:2017-05-15 14:45:50

标签: python scikit-learn multiprocessing

出于某种原因,下面的代码使用了所有可用的内核,即使我已将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

1 个答案:

答案 0 :(得分:3)

来自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以禁用线性代数调用中的多线程。