借助 GPU 支持对高维数据进行更快的 Kmeans 聚类

Posted

技术标签:

【中文标题】借助 GPU 支持对高维数据进行更快的 Kmeans 聚类【英文标题】:Faster Kmeans Clustering on High-dimensional Data with GPU Support 【发布时间】:2020-02-09 07:01:20 【问题描述】:

我们一直在使用 Kmeans 对我们的日志进行聚类。 一个典型的数据集有 10 个 Mill。具有 100k+ 特征的样本。

为了找到最佳 k - 我们并行运行多个 Kmeans 并选择具有最佳轮廓得分的一个。在 90% 的情况下,我们的 k 值在 2 到 100 之间。 目前,我们正在使用 scikit-learn Kmeans。 对于这样的数据集,在具有 32 个内核和 244 个 RAM 的 ec2 实例上进行聚类大约需要 24 小时。

我目前一直在研究更快的解决方案。

我已经测试过的:

    Kmeans + Mean Shift Combination - 稍微好一点(对于 k=1024 --> ~13h),但仍然很慢。

    Kmcuda 库 - 不支持稀疏矩阵表示。将需要约 3TB RAM 来将该数据集表示为内存中的密集矩阵。

    Tensorflow (tf.contrib.factorization.python.ops.KmeansClustering()) - 今天才开始调查,但要么我做错了,要么我不知道该怎么做煮它。在我对 20k 样本和 500 个特征的第一次测试中,在单个 GPU 上进行聚类比在 1 个线程中的 CPU 上进行聚类要慢。

    Facebook FAISS - 不支持稀疏表示。

我的名单上还有 PySpark MlLib Kmeans。但是在 1 个节点上有意义吗?

它会在多个 GPU 上更快地针对我的用例进行训练吗?例如,TensorFlow 与 8 Tesla V-100?

有没有我没听说过的魔法图书馆?

或者只是简单地垂直缩放?

【问题讨论】:

1 个节点中的 pyspark 确实没有意义;看看RAPIDS cuML @desertnaut 非常感谢。我想这就是我一直在寻找的。​​span> @desertnaut,你对这个库有什么经验吗?在玩了几天之后,似乎必须将数据集转换为 cudf.Dataframe (GPU对象)。正确的?我无法想象这样的数据集如何适应 GPU 内存。 对不起,我还没有 【参考方案1】:

    明智地选择算法。有聪明的算法,也有用于 kmeans 的愚蠢算法。 Lloyd's 是愚蠢的,但迄今为止你会在 GPU 中找到唯一的一个。它通过不必要的计算浪费了大量资源。因为GPU和“大数据”的人不关心资源效率…… 好的算法包括 Elkan's、Hamerly's、Ying-Yang、Exponion、Annulus 等 - 这些算法比 Lloyd's 快很多

    Sklearn 是这里最好的工具之一,因为它至少包含 Elkan 算法。但是,如果我没记错的话,它可能会反复复制您的数据。也许是大块的,所以你不会注意到它。当我将 sklearn 中的 k-means 与我自己在 Python 中的球形 k-means 进行比较时,我的实现速度要快很多倍。我只能使用稀疏优化与我解释这一点,而 sklearn 版本执行密集操作。但也许这已经得到改善。

    实施质量很重要。有一篇关于对 k-means 进行基准测试的有趣论文。让我谷歌一下:

    Kriegel, H. P., Schubert, E. 和 Zimek, A. (2017)。运行时评估的(黑色)艺术:我们是在比较算法还是实现?知识和信息系统,52(2),341-378。

    它们显示了假设相同的算法可能具有数量级的运行时间差异,具体取决于实现差异。 Spark 在这方面表现不佳......它的开销太高,算法太慢。

    您不需要所有数据。

    K-means 适用于平均值。随着您添加更多数据,平均值的质量会非常缓慢地提高。因此,使用您拥有的所有数据几乎没有用处。只需使用足够大的样本,结果应该具有几乎相同的质量。您也可以利用它进行播种。首先在较小的集合上运行,然后添加更多数据进行优化。

    由于您的数据稀疏,k-means 很可能不是正确的工具。您是否测试过结果的质量?您如何确保适当缩放属性?结果有多少是由向量为 0 的位置而不是由实际的非零值决定的?如此频繁地重新运行 k-means,结果是否真的会有所改善?如果您不再重新运行 k-means 会怎样?如果您只是在 3) 中讨论的样本上运行它会怎样?如果你只选择 k 个随机中心并进行 0 次 k-means 迭代怎么办?你最好的剪影是什么?您可能无法衡量差异,只是白白浪费时间和资源!那么,您如何确保结果的可靠性?

【讨论】:

【参考方案2】:

感谢@desertnaut 对RAPIDS cuml 库的建议。

可以关注here.

【讨论】:

您是否将结果(在质量和运行时间方面)与使用单个 CPU、Greg Hamerly github.com/ghamerly/fast-kmeans 的 C++ 实现以及易于拟合的 示例 进行比较进入主内存? @HasQUIT--Anony-Mousse 不。我以前没见过那个仓库。嗯。奇怪,因为我在网上搜索了很多。但我们最终通过使用更多线程来加速集群。 它支持colab,rapids.ai,这个库看起来不错,为我节省了很多时间。

以上是关于借助 GPU 支持对高维数据进行更快的 Kmeans 聚类的主要内容,如果未能解决你的问题,请参考以下文章

4种更快更简单实现Python数据可视化的方法

在 OpenCl 中,多个 gpu 比单个 gpu 慢。我怎样才能更快?

4种更快更简单实现Python数据可视化的方法

让GPU跑的更快

技术阿里开源深度学习框架XDL,面向高维稀疏数据,支持千亿参数训练规模

matlab如何gpu加速