Apache Mahout 性能问题

Posted

技术标签:

【中文标题】Apache Mahout 性能问题【英文标题】:Apache Mahout Performance Issues 【发布时间】:2012-01-04 15:19:21 【问题描述】:

在过去的几天里,我一直在与 Mahout 合作,试图创建一个推荐引擎。 我正在从事的项目有以下数据:

1200 万用户 2M 项 18M 用户项目布尔推荐

我现在正在试验我们所拥有的全套产品的 1/3(即 1800 万条建议中的 60 万条)。在我尝试的任何配置中,Mahout 都提供了令人失望的结果。一些建议需要 1.5 秒,而其他建议需要一分钟以上。我认为推荐的合理时间应该在 100 毫秒左右。

为什么 Mahout 工作这么慢? 我正在使用以下 JVM 参数在 Tomcat 上运行应用程序(即使添加它们并没有太大区别):

-Xms4096M -Xmx4096M -da -dsa -XX:NewRatio=9 -XX:+UseParallelGC -XX:+UseParallelOldGC

下面是我的实验代码sn-ps:

用户相似度1:

DataModel model = new FileDataModel(new File(dataFile));
UserSimilarity similarity = new CachingUserSimilarity(new LogLikelihoodSimilarity(model), model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, Double.NEGATIVE_INFINITY, similarity, model, 0.5);
recommender = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);

用户相似度2:

DataModel model = new FileDataModel(new File(dataFile));
UserSimilarity similarity = new CachingUserSimilarity(new LogLikelihoodSimilarity(model), model);
UserNeighborhood neighborhood = new CachingUserNeighborhood(new NearestNUserNeighborhood(10, similarity, model), model);
recommender = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);

物品相似度1:

DataModel dataModel = new FileDataModel(new File(dataFile));
ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel);
recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);

【问题讨论】:

【参考方案1】:

在 Mahout 社区通过其邮件列表的慷慨帮助下,我们找到了解决我的问题的方法。所有与解决方案相关的代码都提交到 Mahout 0.6 中。更多详情可查看对应的JIRA ticket。

使用 VisualVM,我发现性能瓶颈在于项目相似性的计算。 @Sean 使用非常简单但有效的修复方法解决了这个问题(有关更多详细信息,请参阅 SVN commit)

此外,我们还讨论了如何改进SamplingCandidateItemsStrategy 以更好地控制采样率。

最后,我使用上述修复程序对我的应用程序进行了一些测试。所有建议都用了不到 1.5 秒,绝大多数用时不到 500 毫秒。 Mahout 每秒可以轻松处理 100 条建议(我并没有试图强调它)。

【讨论】:

【参考方案2】:

小建议:你的最后一个sn-p应该使用GenericBooleanPrefItemBasedRecommender

对于您的数据集,基于项目的算法应该是最好的。

这听起来有点慢,而且分钟太长了。罪魁祸首是块状数据;时间可以随着用户提供的评分数量而变化。

看看SamplingCandidateItemsStrategy。这将允许您通过面对特别密集的数据进行采样来限制在这方面所做的工作量。您可以将其插入GenericBooleanPrefItemBasedRecommender,而不是使用默认值。我认为这将为您提供一个提高速度并让响应时间更可预测的杠杆。

【讨论】:

谢谢肖恩。我使用以下代码 pastebin.com/XiuJvRha 尝试了您的建议。但是性能还是不好。即使使用 6M 集(实际集的 1/3),推荐仍然需要 3-15 秒。你从中得到了什么? 好的 - 我已经测试了更多,我注意到对于已经提出 1-2 条建议的用户来说很快,大约 400 毫秒,但是对于已经提出 10 或 20 条建议的用户来说需要很多时间更多的。一位拥有 28 条建议的用户需要一分钟多的时间才能完成。 您需要调整 SamplingCandidateItemsStrategy 中的值。例如,尝试 (10,5)。这一切听起来仍然很慢,尽管它看起来很不错。当缓存充满预先计算的相似性时,会有一定程度的预热;不知道是不是这个原因? 它适用于大多数用户,但仍有一些用户需要花费大量时间进行查询。这些用户的共同点似乎是他们提出了至少 20-30 条建议。并且结果“RecommendedItem”的值很高。我认为 Mahout 付出了很多努力,因为有很多选项可供选择。我可以做其他调整来防止它整整一分钟吗?也许以某种方式降低采样率? 是的,这就是我的建议——较低的数字意味着较低的采样率。您可以访问探查器吗?这一切似乎仍然比我想象的要慢得多。我想知道您是否可以通过这种方式直接了解经济放缓。这样可以提供更有针对性的建议。

以上是关于Apache Mahout 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

Apache Mahout 中的矢量化

Mahout 预计算项目-项目相似度 - 慢速推荐

0.6 中缺少 Apache Mahout Math VectorWritable?

使用 Apache Mahout 对数据进行分类

如何在实际项目中使用 mahout 随机森林?

mahout 随机森林RF算法