我们一直在使用Kmeans来对我们的日志进行聚类。一个典型的数据集有1000万个样本和10万多个特征。
为了找到最佳的k值,我们并行运行多个Kmeans,并选择具有最佳轮廓分数的那个。在90%的情况下,我们的k值在2到100之间。目前,我们使用的是scikit-learn的Kmeans。对于这样的数据集,聚类在32核和244GB RAM的ec2实例上需要大约24小时。
我目前正在研究更快的解决方案。
我已经测试过的方案包括:
-
Kmeans + Mean Shift 组合 – 稍微好一些(对于k=1024时,约13小时),但仍然很慢。
-
Kmcuda 库 – 不支持稀疏矩阵表示。要将该数据集表示为内存中的密集矩阵,需要大约3TB的RAM。
-
Tensorflow (tf.contrib.factorization.python.ops.KmeansClustering()) – 今天刚开始调查,但要么是我做错了什么,要么是我不知道如何正确使用。在第一次测试中,使用2万个样本和500个特征,单个GPU上的聚类比单线程CPU上的速度还要慢。
-
Facebook FAISS – 不支持稀疏表示。
接下来我计划尝试PySpark MlLib的Kmeans。但在一个节点上使用它是否有意义呢?
对于我的用例,使用多个GPU进行训练会更快吗?例如,使用8个Tesla V-100的TensorFlow?
有没有我没听说过的神奇库?
还是简单地垂直扩展?
回答:
感谢@*** 对RAPIDS cuml库的建议。
后续内容可在此处找到这里。