2011-11-23 18 views
8

Pracowałem z Mahoutem w ciągu ostatnich kilku dni próbując stworzyć silnik rekomendacji. Projekt pracuję nad zawiera następujące dane: Problemy z wydajnością Apache Mahout

  • użytkowników 12M
  • pozycji
  • 2M
  • 18M użytkownika pozycja boolean sugestie
  • Jestem teraz eksperymentować z 1/3 pełnego zestawu mamy (tj. 6M z 18M zaleceń). Przy każdej konfiguracji próbowałem, Mahout dawał dość rozczarowujące wyniki. Niektóre zalecenia trwały 1,5 sekundy, podczas gdy inne trwały ponad minutę. Myślę, że rozsądny czas na rekomendację powinien wynosić około 100ms.

    Dlaczego Mahout działa tak wolno?
    biegnę aplikacji na Tomcat z następującymi argumentami JVM (choć dodanie ich nie robić wielkiej różnicy):

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

    Poniżej znajdują się fragmenty kodu dla moich eksperymentów:

    podobieństwo Użytkownik 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); 
    

    podobieństwo Użytkownik 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); 
    

    podobieństwo Pozycja 1:

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

    Odpowiedz

    4

    Z łaskawym pomocą społeczności Kornak poprzez jego listy, udało nam się znaleźć rozwiązanie mojego problemu. Cały kod związany z rozwiązaniem został zatwierdzony do wersji Mahout 0.6. Więcej szczegółów można znaleźć w odpowiednim JIRA ticket.

    Używanie VisualVM Stwierdziłem, że wąskim gardłem wydajności było obliczanie podobieństw przedmiotów.Problem ten został rozwiązany przez @Sean przy użyciu bardzo prostej, ale skutecznej poprawki (więcej szczegółów można znaleźć w artykule SVN commit). Ponadto omówiliśmy, jak poprawić strategię SamplingCandidateItemsStrategy, aby umożliwić lepszą kontrolę nad częstotliwością próbkowania.

    Wreszcie, zrobiłem kilka testów z moją aplikacją z wyżej wymienionymi poprawkami. Wszystkie zalecenia trwały mniej niż 1,5 sekundy, a przeważająca większość trwała mniej niż 500 ms. Mahout może z łatwością obsłużyć 100 zaleceń na sekundę (nie próbowałem tego podkreślać).

    2

    Mała sugestia: Twój ostatni fragment powinien używać GenericBooleanPrefItemBasedRecommender.

    Dla zestawu danych algorytm oparty na elementach powinien być najlepszy.

    To brzmi trochę wolno, a minuty są o wiele za długie. Winowajcą są nierówne dane; czas może być skalowany z liczbą ocen dostarczonych przez użytkownika.

    Spójrz na SamplingCandidateItemsStrategy. Pozwoli to ograniczyć ilość pracy wykonanej w tym zakresie poprzez pobieranie próbek w obliczu szczególnie gęstych danych. Możesz podłączyć to do GenericBooleanPrefItemBasedRecommender zamiast używać domyślnego. Myślę, że to da ci siłę do zwiększenia prędkości, a także sprawi, że czas reakcji będzie bardziej przewidywalny.

    +0

    Thnx Sean. Wypróbowałem Twoje sugestie za pomocą następującego kodu http://pastebin.com/XiuJvRha. Ale wydajność nadal nie jest dobra. Nawet przy ustawieniu 6M (1/3 rzeczywistego zestawu) zalecenia nadal trwają od 3 do 15 sekund. Co z tego robisz? –

    +0

    OK - Przetestowałem to nieco więcej i zauważyłem, że dla użytkowników, którzy złożyli 1-2 zalecenia, są szybkie, około 400ms, ale dla użytkowników, którzy zrobili 10 lub 20 rekomendacji, zajmuje to znacznie więcej. Jeden użytkownik z 28 zaleceniami zabrał minutę, aby zakończyć. –

    +0

    Będziesz chciał dostosować wartości w SamplingCandidateItemsStrategy. Spróbuj na przykład (10,5). To wszystko wciąż brzmi dość wolno, choć wygląda całkiem nieźle. Jest trochę rozgrzewki, gdy bufory wypełniają się wstępnie podobieństwem; Nie wiem, czy to jest czynnik? –

    Powiązane problemy