SVM Ensemble Out of Memory

时间:2015-10-28 19:40:15

标签: apache-spark apache-spark-mllib

所以我试图建立一个SVM集合应用程序。

我遇到了预测方法的问题。

我将它基于nativeByVoting本机树集合使用。 SVM模型按顺序加载到驱动程序中的数组中。计算权重并将其存储到另一个名为modelWeights

的数组中
  private def predictByVoting(features: Vector): Double = {
val votes = mutable.Map.empty[Int, Double]
models.view.zip(modelWeights).foreach { case (svmmodel, weight) =>
  val prediction = svmmodel.predict(features).toInt
  votes(prediction) = votes.getOrElse(prediction, 0.0) + weight
}
votes.maxBy(_._2)._1}

这是在RDD [LabeledPoints]测试中调用的。 490万行,11 725 480个功能。

val scoresAndLables= test.map{point=>
         val prediction= predictByVoting(point.features)
          (prediction,point.label)
}

当有许多模型时,执行程序内存不足。我的猜测是,这是由火花在每个点发送序列化模型引起的,最终导致OOM。

我尝试合并到更少的分区并重新分区以增加分区。

这是原生树合奏中的限制吗?它们如何在集合方法中防止这些内存不足错误? AM我以不好的方式存储模型和权重?

由于

1 个答案:

答案 0 :(得分:2)

问题是模型和权重数组在每个点都被发送给执行者。导致OOM。

我通过广播模型和费率来解决这个问题,

val bModelsAndRates=sc.broadcast(models.view.zip(modelWeights))

这样模型就会被发送一次,从而限制网络IO。