【发布时间】:2014-12-11 22:58:15
【问题描述】:
我在一个大数据集上运行 k-means。我是这样设置的:
from sklearn.cluster import KMeans
km = KMeans(n_clusters=500, max_iter = 1, n_init=1,
init = 'random', precompute_distances = 0, n_jobs = -2)
# The following line computes the fit on a matrix "mat"
km.fit(mat)
我的机器有 8 个内核。文档说“对于 n_jobs = -2,使用除一个之外的所有 CPU。”我可以看到在执行km.fit 时有几个额外的 Python 进程在运行,但只使用了一个 CPU。
这听起来像GIL issue 吗?如果是这样,有没有办法让所有 CPU 工作? (似乎必须有......否则n_jobs 参数的意义何在)。
我猜我错过了一些基本的东西,有人可以确认我的恐惧或让我回到正轨;如果它实际上涉及更多,我将转向设置一个工作示例。
更新 1。 为简单起见,我将 n_jobs 切换为正值 2。以下是执行期间我的系统发生的情况:
其实我不是机器上唯一的用户,而是
free | grep Mem | awk '{print $3/$2 * 100.0}'
表示 88% 的 RAM 是空闲的(让我感到困惑,因为在上面的屏幕截图中,RAM 使用率看起来至少为 27%)。
更新 2。 我将 sklearn 版本更新为 0.15.2,上面报告的 top 输出没有任何变化。尝试使用不同的 n_jobs 值同样没有任何改进。
【问题讨论】:
-
不是 GIL 问题,因为
KMeans将产生进程,而不是线程。你输入了多少数据?你有足够的内存吗?哪个 scikit-learn 版本?您是否尝试过n_jobs=-1或n_jobs=2(只是为了验证)? -
查看更新。数据约为 3 gigs csv 通过 pandas -> numpy 读取,而机器 RAM 为 24 gigs;我看不出内存是什么问题。当前更新使用
n_jobs = 2。 -
版本:scikit-learn==0.14.1
-
那是旧版本。 K-means 在 0.15 中进行了很多优化。
-
@larsmans 版本更新了,还是不行。
标签: python parallel-processing scikit-learn k-means gil