KMeans并行处理失败

2 投票
1 回答
2605 浏览
提问于 2025-04-27 23:05

我在一个大数据集上运行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外,其他所有CPU都会被使用。”我注意到在km.fit执行时,有几个额外的Python进程在运行,但只有一个CPU在工作。

这听起来像是一个GIL问题吗?如果是这样,有没有办法让所有的CPU都工作?(感觉应该有办法……否则设置n_jobs这个参数有什么意义呢)。

我猜我可能漏掉了一些基本的东西,希望有人能确认我的担忧,或者帮我理清思路;如果事情更复杂,我会考虑设置一个可运行的例子。

更新 1. 为了简单起见,我把n_jobs改成了正数2。在执行时,我的系统情况如下:

在这里输入图片描述

实际上我并不是这台机器上唯一的用户,但

free | grep Mem | awk '{print $3/$2 * 100.0}'

显示88%的内存是空闲的(这让我有点困惑,因为上面的截图显示内存使用率至少是27%)。

更新 2. 我把sklearn的版本更新到0.15.2,但上面提到的top输出没有任何变化。尝试不同的n_jobs值也没有改善。

暂无标签

1 个回答

3

KMeans的并行处理其实就是同时进行多个初始化。因为你把n_init设置为1,所以只有一次初始化,没什么可以并行处理的。关于n_jobs的说明现在看起来有点问题,我也不太清楚具体发生了什么。

撰写回答