KMeans并行处理失败
我在一个大数据集上运行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的说明现在看起来有点问题,我也不太清楚具体发生了什么。