Параллельное выполнение случайного леса в R
Я запускаю случайный лес в R параллельно
library(doMC)
registerDoMC()
x <- matrix(runif(500), 100)
y <- gl(2, 50)
Параллельное выполнение (заняло 73 секунды)
rf <- foreach(ntree=rep(25000, 6), .combine=combine, .packages='randomForest') %dopar%
randomForest(x, y, ntree=ntree)
Последовательное выполнение (занимает 82 секунды)
rf <- foreach(ntree=rep(25000, 6), .combine=combine) %do%
randomForest(x, y, ntree=ntree)
При параллельном выполнении генерация дерева довольно быстрая, как 3-7 секунд, но остальное время потребляется при объединении результатов (опция комбинирования). Таким образом, единственное, что стоит выполнить параллельное выполнение, - это количество деревьев, которые действительно высоки. Есть ли способ, который я могу настроить "объединить", чтобы избежать любых вычислений на каждом node, который мне не нужен, и сделать его быстрее
PS. Выше - всего лишь пример данных. В реальности у меня есть около 100 тысяч функций для 100 наблюдений.
Ответы
Ответ 1
Установка .multicombine
в TRUE
может иметь существенное значение:
rf <- foreach(ntree=rep(25000, 6), .combine=randomForest::combine,
.multicombine=TRUE, .packages='randomForest') %dopar% {
randomForest(x, y, ntree=ntree)
}
Это приводит к тому, что combine
вызывается один раз, а не пять раз. На моем настольном компьютере это выполняется за 8 секунд, а не за 19 секунд.
Ответ 2
Знаете ли вы, что пакет caret может выполнять большую часть ручной работы для параллельных прогонов (а также подготовку данных, сводки,... ) для вас?
В конечном счете, конечно, если в процессе вычисления случайных лесных ресурсов есть некоторые дорогостоящие операции, вы можете мало что сделать, поскольку Энди потратил немало лет на его улучшение. Я бы ожидал, что немногие из них не будут подвешивать плоды, чтобы быть рядом для выбора...
Ответ 3
Пакет H20 можно использовать для решения вашей проблемы.
В соответствии с H20 документация страница H2O - это" открытый источник
математический движок для больших данных, который вычисляет параллельное распределение
алгоритмы машинного обучения, такие как обобщенные линейные модели,
градиентные ускорительные машины, случайные леса и нейронные сети
(глубокое обучение) в различных кластерных средах.
Случайная реализация леса с использованием H2O:
https://www.analyticsvidhya.com/blog/2016/05/h2o-data-table-build-models-large-data-sets/
Ответ 4
Интересно, полезен ли вам код parallelRandomForest?
По словам автора, он работал примерно в 6 раз быстрее своего набора данных с потреблением памяти в 16 раз меньше.
SPRINT также имеет параллельную реализацию здесь.
Ответ 5
В зависимости от вашего процессора вы, вероятно, можете получить ускорение на 5% -30%, выбрав количество заданий в соответствии с количеством зарегистрированных ядер, соответствующих количеству системных логических ядер. (иногда более эффективно сопоставлять число физических ядер системы).
Если у вас есть общий двухъядерный ноутбук Intel с Hyper Threading (4 логических ядра), то DoMC, вероятно, зарегистрировал кластер из 4 ядер. Таким образом, 2 ядра будут бездействовать, когда итерации 5 и 6 будут вычисляться плюс дополнительное время запуска/остановки двух дополнительных заданий. Было бы более эффективно делать только 2-4 задания большего количества деревьев.