【问题标题】:KMeans parallel processing failingKMeans 并行处理失败
【发布时间】: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=-1n_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


【解决方案1】:

KMeans 的并行性只是并行运行多个初始化。当你设置 n_init=1 时,只有一个初始化,没有什么可以并行化。目前 n_jobs 的文档字符串似乎是错误的。我不确定那里发生了什么。

【讨论】:

  • 已修复(应该很快就会出现在网站上)。
  • 有趣,我没想到这种可能性。如果这是真的,那是令人失望的,因为即使在单个初始化中,我也希望有很多可以并行化的东西。在 500 个(在我的例子中)初始中心和所有其余点之间有大量的距离计算。
  • 这些都是通过 BLAS 完成的,如果你的 BLAS 是多核的,它们将被并行化。
猜你喜欢
  • 1970-01-01
  • 2018-11-11
  • 2019-12-24
  • 2016-06-30
  • 2014-06-24
  • 1970-01-01
  • 2018-10-30
  • 2011-07-15
  • 2020-06-29
相关资源
最近更新 更多