From 8b0add68ddf68939c0f5ac19836f9b3b9cc58432 Mon Sep 17 00:00:00 2001 From: Marco Gaido Date: Tue, 7 Nov 2017 17:29:23 +0100 Subject: [PATCH 1/2] [SPARK-19759][ML] not using blas in ALSModel.predict for optimization --- .../scala/org/apache/spark/ml/recommendation/ALS.scala | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala b/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala index a8843661c873b..cce55206e02eb 100644 --- a/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala +++ b/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala @@ -289,9 +289,11 @@ class ALSModel private[ml] ( private val predict = udf { (featuresA: Seq[Float], featuresB: Seq[Float]) => if (featuresA != null && featuresB != null) { - // TODO(SPARK-19759): try dot-producting on Seqs or another non-converted type for - // potential optimization. - blas.sdot(rank, featuresA.toArray, 1, featuresB.toArray, 1) + var dotProduct = 0.0f + for(i <- 0 until rank) { + dotProduct += featuresA(i) * featuresB(i) + } + dotProduct } else { Float.NaN } From 486734502026c2eb2a7a92d12e12da676013d7dd Mon Sep 17 00:00:00 2001 From: Marco Gaido Date: Wed, 8 Nov 2017 14:44:03 +0100 Subject: [PATCH 2/2] convert for to while loop --- .../main/scala/org/apache/spark/ml/recommendation/ALS.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala b/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala index cce55206e02eb..81a8f50761e0e 100644 --- a/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala +++ b/mllib/src/main/scala/org/apache/spark/ml/recommendation/ALS.scala @@ -290,8 +290,10 @@ class ALSModel private[ml] ( private val predict = udf { (featuresA: Seq[Float], featuresB: Seq[Float]) => if (featuresA != null && featuresB != null) { var dotProduct = 0.0f - for(i <- 0 until rank) { + var i = 0 + while (i < rank) { dotProduct += featuresA(i) * featuresB(i) + i += 1 } dotProduct } else {