SVM 集成内存不足

SVM Ensemble Out Of Memory

所以我正在尝试构建 SVM 集成应用程序。

我的预测方法有问题。

我将其基于本地树集成使用的 predictByVoting。 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)
}

执行器 运行 当模型太多时内存不足。我的猜测是spark每时每刻都在发送序列化模型,最终导致OOM。

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

这也是本地树 Ensembles 的限制吗?他们如何防止集成方法中的这些内存不足错误?我存储模型和权重的方式不对吗?

谢谢

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

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

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

这样模型发送一次,限制网络IO。