2011-11-23 24 views
8

Geçtiğimiz günlerde Mahout ile bir öneri motoru oluşturmaya çalışıyorum. Apache Mahout Performans Sorunları

  • 12M kullanıcıların
  • 2M ürün
  • 18M kullanıcı maddelik boole tavsiyeler
  • Şimdi elimizdeki tam set 1/3 ile deney yaşıyorum: Üzerinde çalıştığım proje aşağıdaki verilere sahip (örneğin 18M önerilerinden 6M). Denediğim herhangi bir yapılandırmada, Mahout oldukça hayal kırıklığı yaratan sonuçlar veriyordu. Bazı öneriler 1,5 saniye sürdü, diğeri ise bir dakika sürdü. Bir tavsiye için makul bir zamanın 100ms zaman diliminde olması gerektiğini düşünüyorum.

    Mahout neden bu kadar yavaş çalışıyor?
    ben (hatta ekleyerek olsa bir fark yapmadığını) Aşağıdaki JVM bağımsız değişken içeren bir Tomcat uygulama çalıştırıyorum:

    : Aşağıda
    -Xms4096M -Xmx4096M -da -dsa -XX:NewRatio=9 -XX:+UseParallelGC -XX:+UseParallelOldGC 
    

    benim deneyler için kod parçacıklarını vardır

    Kullanıcı benzerlik 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); 
    

    Kullanıcı benzerlik 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); 
    

    Öğe benzerlik 1:

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

    cevap

    4

    , benim soruna bir çözüm bulduk. Çözümle ilgili tüm kodlar Mahout 0.6'ya verildi. Daha fazla detay ilgili JIRA ticket adresinde bulunabilir.

    VisualVM'yi Kullanma Performans darboğazının öğe-öğe benzerliklerinin hesaplanmasında olduğunu buldum.Bu, çok basit ama etkili bir düzeltme kullanarak @Sean tarafından ele alındı ​​(daha fazla ayrıntı için SVN commit'a bakın)

    Ayrıca, örnekleme oranı üzerinde daha iyi bir denetim sağlamak için Örnekleme Kalitesini nasıl geliştireceğimizi tartıştık.

    Son olarak, uygulamamla birlikte yukarıda belirtilen düzeltmelerle bazı testler yaptım. Tüm öneriler, ezici çoğunluğu 500 milyondan az olan 1.5 saniyeden az sürdü. Mahout, saniyede 100 tavsiyeyi kolayca idare edebilirdi (bunu daha fazla vurgulamaya çalışmadım).

    2

    Küçük öneri: Son pasajı GenericBooleanPrefItemBasedRecommender kullanmalıdır.

    Veri kümenizde, öğe tabanlı algoritma en iyi şekilde olmalıdır.

    Bu biraz yavaş geliyor ve dakika çok uzun. Suçlu topaklı veridir; Zaman, kullanıcının sağladığı derecelendirme sayısıyla ölçeklenebilir.

    SamplingCandidateItemsStrategy'a bakın. Bu, özellikle yoğun veri karşısında örnekleme yoluyla yapılan iş miktarını sınırlayacaktır. Bunu varsayılanı kullanmak yerine GenericBooleanPrefItemBasedRecommender'a bağlayabilirsiniz. Bence bu, hızı arttırmak için bir kaldıraç ve tepki süresini daha öngörülebilir hale getirecek.

    +0

    Thnx Sean. Önerilerinizi şu kodla http://pastebin.com/XiuJvRha ile denedim. Ancak performans hala iyi değil. 6M setiyle (gerçek setin 1/3'ü) bile, öneriler hala 3-15 sn. Bundan ne yapıyorsun? –

    +0

    Tamam - Biraz daha test ettim ve 1-2 tavsiyede bulunan kullanıcıların hızlı, yaklaşık 400ms olduğunu, ancak 10 veya 20 tavsiyede bulunan kullanıcılar için çok daha fazla zaman aldığını fark ettim. 28 tavsiyesi olan bir kullanıcının tamamlanması bir dakikadan fazla sürdü. –

    +0

    Değerleri SamplingCandidateItemsStrategy'de ayarlamak isteyeceksiniz. Örneğin (10,5) deneyin. Bu oldukça iyi görünüyor, ancak oldukça iyi görünüyor. Önbelleklerin önceden hesaplanmış benzerlikle dolması gibi bir dereceye kadar ısınma vardır; Bu bir faktör olup olmadığını bilmiyorum? –