与 Rborist 并行化
Posted
技术标签:
【中文标题】与 Rborist 并行化【英文标题】:Parallelization with Rborist 【发布时间】:2016-12-25 08:04:42 【问题描述】:我有一个大型 n (>1,000,000) 数据集,其中包含少量特征来估计(回归)随机森林,并且一直在寻求实现 Rborist(在 R 中)。我想并行化我的工作,但没有找到太多关于如何完成的指导。我在运行它的机器上使用了 16 个处理器。例如,当我将 doParallel 与 randomForest 包一起使用时,命令:
rf <- foreach(ntree=rep(32, 16), .combine=combine, .packages='randomForest') %dopar% randomForest(x, y, nodesize = 25, ntree=ntree)
它启动了 16 个 R 进程,并且像 randomForest 一样缓慢运行,但确实有效。
Rborist 的类似命令:
rb <- foreach(ntree=rep(32, 16), .combine=combine, .packages='Rborist') %dopar% Rborist(x, y, minNode = 25, ntree=ntree)
抛出错误:
调用组合函数时出错:
警告消息:在 mclapply(argsList, FUN, mc.preschedule = preschedule, mc.set.seed = set.seed, : 所有计划的核心 遇到用户代码错误
有谁知道如何?它似乎没有发生在引擎盖下,因为它在我运行时只使用 1 个 cpu:
rb <- Rborist(x, y, minNode = 25, ntree = 512)
【问题讨论】:
Rborist 是否可以单线程工作?否则,真的不是答案,但我在做大分析时使用随机森林的 h2o 实现,h2o.randomForest。发现它比使用 foreach 更容易。 是的,单线程版本有效。至少在我的设置中,它确实比普通的 randomForest 快得多,尽管它确实需要更多的 RAM,并且预测精度较低(我想知道这是否是由于 randomForest 和 Rborist 的 mininfo 默认值之间的停止标准不同)。 【参考方案1】:Rborist 自身并行运行。它使用我机器上的所有线程(win 10 64bit)。但后来我没有先加载 doParallel / foreach。
ranger 包也是如此,但在 ranger 中,您可以设置要使用的线程数。
快速实现 rf 是我的头等大事:
Rborist(大 n,低 p) ranger(处理大 p,小 n) 随机 forest.ddr(未测试) H2O 中的分布式随机森林。非常快,但利用 停止标准。【讨论】:
嗯,你认为它可能是 Mac/PC 的东西吗?当我在没有加载 doParallel 的情况下运行它时,根据活动监视器,它仍然只使用 1 个 cpu。 不应该,但你永远不知道。通过 gcc 编译并使用 rcpp。如果仍然存在,您可以在 github 上尝试该版本或在 github 页面上提交问题。 @phiver 你如何比较 H2o 与 rborist 和 H2o 与 ranger 的速度与大特性和大 n .. 试图找到一个可以比 h2o 版本更快的 c++ 随机森林并仍然处理这些功能。 @phiver 只询问您的非正式意见。谢谢! @physicist,在单个机器/AWS 实例上,无论是 rborist 还是 ranger 都可以。我更喜欢 ranger,因为它也用于其他包,如 Boruta。对两者的支持仍在进行中,这也很重要。如果你有时间,你可以运行速度比较。可以使用here 获取此代码。我喜欢 H20 的支持和所有其他功能。我的机器在 h2o 和 ranger 之间的速度相当。我的工作不太使用集群:-)。但有些事情确实取决于你认为的大 n / p。【参考方案2】:Rborist 当前使用所有可用的内核。提供一种调整方法是否有用?
您是否尝试过 CRAN 上的最新版本 0.1-3?这包含对回归的默认最小节点大小的更改,在某些情况下提高了准确性。
我们在通过适度(而不是少量)预测变量来提高性能方面取得了一些进展。这也应反映在最新版本的更改中。
大运行内存占用可能是广度优先拆分方法的结果。节省内存的一种方法是将问题分块,但我们还没有做到。
大final内存大小主要是由于缓存叶子信息以供其他包后续使用或用于分位数回归。或许我们应该为对这两个选项都不感兴趣的用户添加一个“noLeaf”选项。
【讨论】:
谢谢——我正在运行 0.1-3 版。当我在 Linux 上运行它时,它使用了所有可用的处理器,但在 OS X 上使用相同代码运行时,它只使用了 8 个可能的处理器中的 1 个。 这可能与您的 OS X 发行版上的 OpenMP 支持状态有关。这听起来类似于其他软件包用户的报告。您是否观察到使用 OpenMP 构建的其他任何 R 包的多核占用?以上是关于与 Rborist 并行化的主要内容,如果未能解决你的问题,请参考以下文章