python - KMeans 并行处理失败

标签 python parallel-processing scikit-learn k-means gil

我正在大数据集上运行 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。以下是我的系统在执行过程中发生的情况:

enter image description here

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

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

表示 88% 的 RAM 是可用的(让我感到困惑,因为在上面的屏幕截图中 RAM 使用率看起来至少为 27%)。

更新 2。 我将 sklearn 版本更新为 0.15.2,上面报告的 top 输出没有任何变化。尝试使用不同的 n_jobs 值同样没有任何改进。

最佳答案

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

关于python - KMeans 并行处理失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406723/

相关文章:

python - 为什么这个小片段在使用 maxtasksperchild、numpy.random.randint 和 numpy.random.seed 进行多重处理时会挂起?

python - 在 python 中如何设置 LP_c_ubyte 的值

c++ - 标量代码和并行代码之间的不同行为

r - 在 Ubuntu 16.04 VirtualBox 上安装 Rmpi

python - 无法在 Google 应用引擎中使用 TfidfVectorizer

python - tensorflow.python.framework.errors_impl.UnknownError : Failed to rename: Input/output error

python - "import matplotlib.pyplot as plt"时出错

linux - 如何使用 Image Magic 跨多个子目录并行批量转换 1000 张图像

python - 如何在使用带有 python 的朴素贝叶斯训练数据后进行预测?

machine-learning - 在 Scikit 中使用 K Mean 选择特征并恢复特征