6

Tôi đang sử dụng hệ số ma trận của MLlib để đề xuất các mục cho người dùng. Tôi có một ma trận tương tác ngầm lớn của M = 20 triệu người dùng và N = 50 nghìn mục. Sau khi đào tạo mô hình, tôi muốn có danh sách ngắn (ví dụ: 200) đề xuất cho từng người dùng. Tôi đã thử recommendProductsForUsers trong MatrixFactorizationModel nhưng nó rất rất chậm (chạy 9 giờ nhưng vẫn còn xa kết thúc. Tôi đang thử nghiệm với 50 người thực thi, mỗi bộ nhớ 8g). Điều này có thể được mong đợi kể từ khi recommendProductsForUsers cần tính toán tất cả các tương tác của mục người dùng M*N và nhận được hàng đầu cho mỗi người dùng.Tăng tốc lọc cộng tác cho tập dữ liệu lớn trong Spark MLLib

Tôi sẽ cố gắng sử dụng nhiều người thực thi hơn nhưng từ những gì tôi thấy từ chi tiết ứng dụng trên giao diện người dùng Spark, tôi nghi ngờ rằng nó có thể hoàn thành trong giờ hoặc một ngày thậm chí tôi có 1000 người thực thi (sau 9 giờ nó vẫn ở trong số flatmap tại đây https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/mllib/recommendation/MatrixFactorizationModel.scala#L279-L289 , 10000 tổng số nhiệm vụ và chỉ ~ 200 đã hoàn thành) Có bất kỳ thứ gì khác mà tôi có thể điều chỉnh để tăng tốc quá trình đề xuất bên cạnh tăng số lượng người thi hành không?

Đây là mẫu mã:

val data = input.map(r => Rating(r.getString(0).toInt, r.getString(1).toInt, r.getLong(2))).cache 
val rank = 20 
val alpha = 40 
val maxIter = 10 
val lambda = 0.05 
val checkpointIterval = 5 
val als = new ALS() 
    .setImplicitPrefs(true) 
    .setCheckpointInterval(checkpointIterval) 
    .setRank(rank) 
    .setAlpha(alpha) 
    .setIterations(maxIter) 
    .setLambda(lambda) 
val model = als.run(ratings) 
val recommendations = model.recommendProductsForUsers(200) 
recommendations.saveAsTextFile(outdir) 
+0

Bạn có tích cực mà Spark sử dụng đầy đủ 8g RAM? Có lẽ nó thường xuyên truy cập vào bộ nhớ cache trên đĩa. – stholzm

Trả lời

1

@Jack Lei: Bạn đã tìm thấy câu trả lời cho điều này? Bản thân tôi đã thử vài điều nhưng chỉ giúp một chút.

Đối với ví dụ: Tôi cố gắng

javaSparkContext.setCheckpointDir("checkpoint/"); 

này giúp bởi vì nó tránh lặp lại tính toán ở giữa.

Cũng thử thêm nhiều bộ nhớ hơn mỗi Executor và bộ nhớ spark overhead

--conf spark.driver.maxResultSize=5g --conf spark.yarn.executor.memoryOverhead=4000 
Các vấn đề liên quan