2017-03-03 3 views
1

Je suis en train d'ajuster des modèles de forêt aléatoire en utilisant des paquets caret et ranger, et en essayant d'accélérer en utilisant des processus parallèles. Cependant, le gain de vitesse est très faible. J'utilise un MacBook Pro (Retina, 13 pouces, fin 2013), 2,4 GHz Intel Core i5, 8 Go 1600 MHz DDR3, macOS Sierra 10.12. Un exemple reproductible:Gain de petite vitesse avec exécution parallèle de forêt aléatoire dans Macbook (avec R, caret)

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 

Cela s'exécute en 3,47 minutes. Pendant ce temps, dans le Moniteur d'activité, je vois un processus R avec une utilisation du processeur d'environ 300-330%. Maintenant le parallèle:

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 

Ceci s'exécute en 3.06 minutes. Au cours d'eux, dans le moniteur d'activité, je vois 3 processus R chacun avec l'utilisation du processeur autour de 100-120%. J'ai également testé le paquetage doMC suggéré dans la documentation du caret (http://topepo.github.io/caret/parallel-processing.html), qui a pris 3,10 minutes. Ce gain de vitesse est beaucoup plus petit que ce à quoi je m'attendais, à partir des parcelles de la documentation du caret. Des idées?

sessionInfo:

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 

Mise à jour: Après réponse par slonopotam, j'ai testé les mêmes modèles ci-dessus avec le paquet forêt d'arbres décisionnels (version 4,6 à 12). Courir séquentiellement (pas parallèle) il a fallu 8,14 minutes. Pendant ce temps, dans le moniteur d'activité, je vois un processus R avec CPU 95-100%. Courir en parallèle, il a fallu 3,72 minutes, au cours de laquelle il y avait 3 processus R chacun avec CPU 95-100%. Ajout de cette information juste pour l'achèvement. Merci, slonopotam!

Répondre

1

Le paquet 'ranger' que vous utilisez a un support de multithreading interne. C'est la raison pour laquelle vous observez une utilisation du processeur d'environ 300..330% dans le premier cas, ce qui signifie qu'il utilise déjà au moins 3 cœurs pour l'entraînement. Lorsque vous utilisez doParallel, utilisez multiprocessing au lieu de multithread, mais le nombre total de ressources informatiques utilisées dans l'entraînement est presque le même, donc vous ne voyez pas beaucoup de gain.