在 Macbook 中并行执行随机森林的小速度增益(使用 R,插入符号)

Posted

技术标签:

【中文标题】在 Macbook 中并行执行随机森林的小速度增益(使用 R,插入符号)【英文标题】:Small speed gain with parallel execution of random forest in Macbook (using R, caret) 【发布时间】:2017-07-23 19:12:52 【问题描述】:

我正在使用包 caret 和 ranger 拟合随机森林模型,并尝试使用并行进程来加速。但是速度增益非常小。我使用的是 MacBook Pro(Retina,13 英寸,2013 年末)、2.4 GHz Intel Core i5、8 GB 1600 MHz DDR3、macOS Sierra 10.12。一个可重现的例子:

library(caret)
library(mlbench)
data("Sonar")

start <- Sys.time()
mod_1 <- train(Class ~ ., data = Sonar, method = "ranger", num.trees = 10000)
stop <- Sys.time()
duration1 <- stop - start
duration1

运行时间为 3.47 分钟。在此期间,在活动监视器中,我看到一个 R 进程的 CPU 使用率约为 300-330%。现在平行:

library(parallel)
library(doParallel)
cluster <- makeCluster(detectCores() - 1)
registerDoParallel(cluster)

start <- Sys.time()
mod_2 <- train(Class ~ ., data = Sonar, method = "ranger", num.trees = 10000)
stop <- Sys.time()
duration2 <- stop - start
duration2

运行时间为 3.06 分钟。在此期间,在活动监视器中,我看到 3 个 R 进程,每个进程的 CPU 使用率约为 100-120%。我还测试了插入符号文档 (http://topepo.github.io/caret/parallel-processing.html) 中建议的 doMC 包,耗时 3.10 分钟。从插入符号文档中的图表来看,这个速度增益比我预期的要小得多。有什么想法吗?

会话信息:

R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12

locale:
[1] en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] doParallel_1.0.10 ranger_0.6.0      e1071_1.6-7       doMC_1.3.4        iterators_1.0.8  
 [6] foreach_1.4.3     mlbench_2.1-1     caret_6.0-73      ggplot2_2.2.1     lattice_0.20-34  

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.9        magrittr_1.5       splines_3.3.2      MASS_7.3-45        munsell_0.4.3     
 [6] colorspace_1.3-2   minqa_1.2.4        stringr_1.1.0      car_2.1-4          plyr_1.8.4        
[11] tools_3.3.2        nnet_7.3-12        pbkrtest_0.4-6     grid_3.3.2         gtable_0.2.0      
[16] nlme_3.1-130       mgcv_1.8-16        quantreg_5.29      class_7.3-14       MatrixModels_0.4-1
[21] lme4_1.1-12        lazyeval_0.2.0     assertthat_0.1     tibble_1.2         Matrix_1.2-8      
[26] nloptr_1.0.4       reshape2_1.4.2     ModelMetrics_1.1.0 codetools_0.2-15   stringi_1.1.2     
[31] compiler_3.3.2     scales_0.4.1       stats4_3.3.2       SparseM_1.74 

更新: 在 slonopotam 响应后,我使用包 randomForest(版本 4.6-12)测试了上述相同的模型。顺序运行(非并行)耗时 8.14 分钟。在此期间,在活动监视器中,我看到一个 CPU 为 95-100% 的 R 进程。并行运行耗时 3.72 分钟,期间有 3 个 R 进程,每个进程的 CPU 为 95-100%。添加此信息只是为了完成。谢谢,slonopotam!

【问题讨论】:

【参考方案1】:

您使用的包“游侠”确实具有内部多线程支持。这就是为什么您在第一种情况下观察到 CPU 使用率约为 300..330% - 这意味着它已经使用至少 3 个内核进行训练。

使用 doParallel 时,使用的是多处理而不是多线程,但训练中使用的计算资源总数几乎相同,因此您看不到多少收益。

【讨论】:

以上是关于在 Macbook 中并行执行随机森林的小速度增益(使用 R,插入符号)的主要内容,如果未能解决你的问题,请参考以下文章

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

决策树与随机森林

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

随机森林与集成算法

有没有办法在并行随机森林构建过程中跟踪进度?

决策树随机森林GBDTXGBoost