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。
所以我正在尝试构建 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。