Проблемы с производительностью Apache Mahout - PullRequest
8 голосов
/ 23 ноября 2011

В последние несколько дней я работал с Mahout, пытаясь создать механизм рекомендаций.Проект, над которым я работаю, содержит следующие данные:

12M пользователей 2M элементов 18M пользовательских логических элементов

Я сейчас экспериментируюс 1/3 от полного набора, который мы имеем (т.е. 6M из 18M рекомендаций).При любой конфигурации, которую я пробовал, Mahout давал весьма неутешительные результаты.Некоторые рекомендации заняли 1,5 секунды, а другие - более минуты.Я думаю, что разумное время для рекомендации должно составлять около 100 мс.

Почему Mahout работает так медленно?
Я запускаю приложение на Tomcat со следующей JVMаргументы (хотя их добавление не имеет большого значения):

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

Ниже приведены фрагменты кода для моих экспериментов:

Сходство пользователя 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);

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

С любезной помощью сообщества Mahout через его список рассылки мы нашли решение моей проблемы. Весь код, связанный с решением, был передан в Mahout 0.6. Более подробную информацию можно найти в соответствующем билете JIRA .

Используя VisualVM, я обнаружил, что узкое место в производительности заключается в вычислении сходства элементов. Эта проблема была решена @Sean с помощью очень простого, но эффективного исправления (см. SVN commit для более подробной информации)

Кроме того, мы обсудили, как улучшить SamplingCandidateItemsStrategy , чтобы обеспечить более точное управление частотой дискретизации.

Наконец, я провел некоторое тестирование с моим приложением с вышеупомянутыми исправлениями. Все рекомендации заняли менее 1,5 секунд, а подавляющее большинство - менее 500 мс. Mahout мог легко обрабатывать 100 рекомендаций в секунду (я не пытался подчеркнуть это больше).

2 голосов
/ 23 ноября 2011

Небольшое предложение: ваш последний фрагмент должен использовать GenericBooleanPrefItemBasedRecommender.

Для вашего набора данных наилучшим должен быть алгоритм на основе элементов.

Звучит немного медленно, а минуты - это слишком долго. Виновником являются кусковые данные; время может изменяться в зависимости от количества оценок, предоставленных пользователем.

Посмотрите на SamplingCandidateItemsStrategy. Это позволит вам ограничить объем работы, выполняемой в этом отношении, путем выборки перед лицом особенно плотных данных. Вы можете подключить это к GenericBooleanPrefItemBasedRecommender вместо использования по умолчанию. Я думаю, что это даст вам рычаг для увеличения скорости, а также сделает время отклика более предсказуемым.

...