带有 doSMP 和 foreach 的并行随机森林大大增加了内存使用量(在 Windows 上)

Posted

技术标签:

【中文标题】带有 doSMP 和 foreach 的并行随机森林大大增加了内存使用量(在 Windows 上)【英文标题】:Parallel Random Forests with doSMP and foreach drastically increase memory usage (on Windows) 【发布时间】:2012-02-05 07:16:09 【问题描述】:

在串行执行随机森林时,它在我的系统上使用 8GB 的​​ RAM,在并行执行时,它使用超过两倍的 RAM (18GB)。并行执行时如何将其保持在 8GB?代码如下:

install.packages('foreach')
install.packages('doSMP')
install.packages('randomForest')

library('foreach')
library('doSMP')
library('randomForest')

NbrOfCores <- 8 
workers <- startWorkers(NbrOfCores) # number of cores
registerDoSMP(workers)
getDoParName() # check name of parallel backend
getDoParVersion() # check version of parallel backend
getDoParWorkers() # check number of workers


#creating data and setting options for random forests
#if your run this please adapt it so it won't crash your system! This amount of data  uses up to 18GB of RAM.
x <- matrix(runif(500000), 100000)
y <- gl(2, 50000)
#options
set.seed(1)
ntree=1000
ntree2 <- ntree/NbrOfCores


gc()

#running serialized version of random forests

system.time(
rf1 <- randomForest(x, y, ntree = ntree))


gc()


#running parallel version of random forests

system.time(
rf2 <- foreach(ntree = rep(ntree2, 8), .combine = combine, .packages = "randomForest") %dopar% randomForest(x, y, ntree = ntree))

【问题讨论】:

【参考方案1】:

我认为会发生以下情况。当您的父进程产生子进程时,内存是共享的,即内存使用量不会显着增加。然而,随着子进程开始构建随机森林,它们会创建许多新的中间对象,这些对象不在共享内存中,而且可能相当大。

所以我的回答是,令人失望的是,可能没有简单的解决方法,至少使用 randomForest 包 - 虽然如果有人知道我会非常感兴趣。

【讨论】:

【参考方案2】:

随机森林对象可以在中等大小的数据集下变得非常大,因此增加可能与存储模型对象有关。

要对此进行测试,您实际上应该有两个不同的会话。

尝试并行运行另一个占用空间不大的模型(例如 lda),看看您是否获得了相同的内存增长。

【讨论】:

【参考方案3】:

首先,SMP 会复制输入,以便每个进程都有自己的副本。这可以通过使用multicore 进行转义,但还有另一个问题——randomForest 的每次调用也会生成输入的内部副本。

您可以通过使randomForest 放弃森林模型本身(使用keep.forest=FALSE)并在训练的同时进行测试(使用xtest 和可能的ytest 参数)来减少使用量。

【讨论】:

好建议,但我需要森林模型才能对未来进行预测(即,我现在需要构建模型,稍后再对新数据进行评分)。关于多核包:它仅适用于 Unix(我在 Windows 上,参见我的问题)。

以上是关于带有 doSMP 和 foreach 的并行随机森林大大增加了内存使用量(在 Windows 上)的主要内容,如果未能解决你的问题,请参考以下文章

带有异步 lambda 的并行 foreach

foreach、doParallel 和随机生成

为啥随机森林并行化后重要性会受到影响?

使用并行训练带有插入符号的随机森林

foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?

R中的并行处理