Параллельные случайные леса с doSMP и foreach резко увеличивают использование памяти (в Windows) - PullRequest
7 голосов
/ 08 января 2012

При выполнении случайного леса в последовательном режиме он использует 8 ГБ оперативной памяти в моей системе, при параллельном выполнении он использует более чем в два раза больше оперативной памяти (18 ГБ).Как сохранить 8 ГБ при параллельном выполнении?Вот код:

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))

Ответы [ 3 ]

3 голосов
/ 08 января 2012

Прежде всего, SMP продублирует ввод, чтобы каждый процесс получил свою собственную копию. Этого можно избежать, используя multicore, но есть и другая проблема - каждый вызов randomForest также создает внутреннюю копию ввода.

Лучшее, что вы можете сделать, это сократить использование, заставив randomForest удалить саму модель леса (с keep.forest=FALSE) и выполнить тестирование вместе с обучением (используя xtest и, возможно, ytest аргументы).

1 голос
/ 08 января 2012

Объекты случайного леса могут стать очень большими с наборами данных среднего размера, поэтому увеличение может быть связано с хранением объекта модели.

Чтобы проверить это, у вас должно быть два разных сеанса.

Попробуйте запустить другую модель параллельно, у которой нет большого места (например, lda), и посмотрите, получите ли вы то же увеличение памяти.

0 голосов
/ 08 января 2012

Я думаю, что происходит следующее. По мере того, как ваш родительский процесс порождает дочерние процессы, память распределяется, то есть не происходит значительного увеличения использования памяти. Однако, когда дочерние процессы начинают создавать случайные леса, они создают много новых промежуточных объектов, которые не находятся в общей памяти и потенциально довольно велики.

Так что мой ответ заключается в том, что, к сожалению, возможно, нелегко обойти это, по крайней мере с использованием пакета randomForest - хотя мне было бы очень интересно, если бы кто-то знал об этом.

...