2011-11-23 39 views
8

Tôi đã làm việc với Mahout trong vài ngày qua để cố gắng tạo một công cụ đề xuất. Dự án tôi đang làm việc trên có các dữ liệu sau: Các vấn đề về hiệu năng của Apache Mahout

  • người dùng 12M
  • 2M mục
  • 18M sử dụng mục boolean khuyến nghị
  • Tôi bây giờ thử nghiệm với 1/3 tập hợp đầy đủ chúng tôi có (tức là 6 triệu trong số 18 triệu đề xuất). Tại bất kỳ cấu hình nào tôi đã thử, Mahout đã cung cấp kết quả khá đáng thất vọng. Một số đề xuất mất 1,5 giây trong khi một số khác mất hơn một phút. Tôi nghĩ rằng một thời gian hợp lý cho một đề nghị nên được khoảng 100ms khung thời gian.

    Tại sao Mahout hoạt động quá chậm?
    Tôi đang chạy các ứng dụng trên một Tomcat với các đối số JVM sau (mặc dù bổ sung chúng đã không làm cho nhiều sự khác biệt):

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

    Dưới đây là đoạn mã cho các thí nghiệm của tôi:

    tài tương tự 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); 
    

    tài tương tự 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); 
    

    mục tương đồng 1:

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

    Trả lời

    4

    Với sự giúp đỡ của cộng đồng duyên dáng Mahout qua mailing list của mình, chúng tôi đã tìm thấy một giải pháp cho vấn đề của tôi. Tất cả các mã liên quan đến giải pháp đã được đưa vào Mahout 0.6. Bạn có thể tìm thêm chi tiết trong số JIRA ticket tương ứng.

    Sử dụng VisualVM Tôi nhận thấy rằng nút cổ chai hiệu suất là trong tính toán các điểm tương đồng của mục.Điều này đã được giải quyết bởi @Sean bằng cách sử dụng một sửa chữa rất đơn giản nhưng hiệu quả (xem SVN commit để biết thêm chi tiết)

    Ngoài ra, chúng tôi đã thảo luận cách cải thiện SamplingCandidateItemsStrategy để cho phép kiểm soát tốt hơn tốc độ lấy mẫu.

    Cuối cùng, tôi đã thực hiện một số thử nghiệm với ứng dụng của mình với các bản sửa lỗi nói trên. Tất cả các khuyến nghị mất ít hơn 1,5 giây với đa số áp đảo dưới 500ms. Mahout có thể dễ dàng xử lý 100 đề xuất mỗi giây (tôi đã không cố gắng nhấn mạnh nó nhiều hơn thế).

    2

    gợi ý nhỏ: snippet cuối cùng của bạn nên sử dụng GenericBooleanPrefItemBasedRecommender.

    Đối với tập dữ liệu của bạn, thuật toán dựa trên mặt hàng phải là tốt nhất.

    Điều này nghe có vẻ hơi chậm và phút quá dài. Thủ phạm là dữ liệu sần sùi; thời gian có thể mở rộng với số lượng xếp hạng mà người dùng đã cung cấp.

    Nhìn vào SamplingCandidateItemsStrategy. Điều này sẽ cho phép bạn giới hạn số lượng công việc được thực hiện trong lĩnh vực này bằng cách lấy mẫu khi đối mặt với dữ liệu đặc biệt dày đặc. Bạn có thể cắm điều này vào GenericBooleanPrefItemBasedRecommender thay vì sử dụng mặc định. Tôi nghĩ rằng điều này sẽ cung cấp cho bạn một đòn bẩy để tăng tốc độ và cũng làm cho thời gian phản ứng dễ dự đoán hơn.

    +0

    Thnx Sean. Tôi đã thử đề xuất của bạn với mã sau http://pastebin.com/XiuJvRha. Nhưng hiệu suất vẫn không tốt. Ngay cả với bộ 6M (1/3 của bộ thực), các đề xuất vẫn mất từ ​​3-15 giây. Bạn làm gì từ nó? –

    +0

    Ok - Tôi đã thử nghiệm nó nhiều hơn một chút và tôi nhận thấy rằng đối với người dùng đã thực hiện 1-2 đề xuất nhanh chóng, khoảng 400 mili giây, nhưng đối với người dùng đã thực hiện 10 hoặc 20 đề xuất cần nhiều hơn nữa. Một người dùng có 28 đề xuất đã mất hơn một phút để hoàn thành. –

    +0

    Bạn sẽ muốn điều chỉnh các giá trị trong SamplingCandidateItemsStrategy. Hãy thử (10,5) chẳng hạn. Điều này tất cả vẫn còn âm thanh khá chậm, mặc dù nó trông khá tốt. Có một số mức độ khởi động khi các bộ đệm lấp đầy với sự giống nhau được xác định trước; Tôi không biết nếu đó là một yếu tố? –

    Các vấn đề liên quan