web-dev-qa-db-fra.com

exécution parallèle d'une forêt aléatoire dans R

Je lance une forêt aléatoire dans R en parallèle

library(doMC)
registerDoMC()
x <- matrix(runif(500), 100)
y <- gl(2, 50)

Exécution parallèle (a pris 73 secondes)

rf <- foreach(ntree=rep(25000, 6), .combine=combine, .packages='randomForest') %dopar%
randomForest(x, y, ntree=ntree) 

Exécution séquentielle (a pris 82 secondes)

rf <- foreach(ntree=rep(25000, 6), .combine=combine) %do%
randomForest(x, y, ntree=ntree) 

En exécution parallèle, la génération de l'arborescence est assez rapide comme 3-7 sec, mais le reste du temps est consommé en combinant les résultats (option combine). Donc, sa seule valeur pour exécuter une exécution parallèle est que le nombre d'arbres est vraiment élevé. Existe-t-il un moyen de modifier l'option "combiner" pour éviter tout calcul sur chaque nœud dont je n'ai pas besoin et le rendre plus rapide

PS. Ci-dessus est juste un exemple de données. En réalité, j'ai environ 100 000 fonctionnalités pour une centaine d'observations.

28
user1631306

Réglage .multicombine à TRUE peut faire une différence significative:

rf <- foreach(ntree=rep(25000, 6), .combine=randomForest::combine,
              .multicombine=TRUE, .packages='randomForest') %dopar% {
    randomForest(x, y, ntree=ntree)
}

Ainsi, combine est appelé une fois plutôt que cinq fois. Sur ma machine de bureau, cela fonctionne en 8 secondes plutôt que 19 secondes.

31
Steve Weston

Savez-vous que le package caret peut faire une grande partie de la prise en main pour les exécutions parallèles (ainsi que la préparation des données, les résumés, ...) pour vous?

En fin de compte, bien sûr, s'il reste des opérations coûteuses dans le calcul de la forêt aléatoire lui-même, vous ne pouvez pas faire grand-chose, car Andy a passé plusieurs années à l'améliorer. Je m'attendrais à ce que peu ou pas de fruits bas soient présents pour la cueillette ...

11
Dirk Eddelbuettel

Le package H20 peut être utilisé pour résoudre votre problème.

Selon H20 documentation page H2O est "le moteur mathématique open source pour les mégadonnées qui calcule des algorithmes d'apprentissage machine distribués parallèles tels que les modèles linéaires généralisés, les machines de renforcement de gradient, les forêts aléatoires et les réseaux de neurones (apprentissage profond) dans divers environnements de cluster. "

Implémentation de la forêt aléatoire à l'aide de H2O:

https://www.analyticsvidhya.com/blog/2016/05/h2o-data-table-build-models-large-data-sets/

4
Ashok Krishna

Je me demande si le code parallelRandomForest vous serait utile?

Selon l'auteur il a fonctionné environ 6 fois plus vite sur son jeu de données avec 16 fois moins de consommation mémoire.

SPRINT a également une implémentation parallèle ici .

3
Richard

En fonction de votre processeur, vous pouvez probablement obtenir une accélération de 5% à 30% en choisissant le nombre de travaux correspondant au nombre de cœurs enregistrés correspondant au nombre de cœurs logiques du système. (il est parfois plus efficace de faire correspondre le nombre de cœurs physiques du système). Si vous avez un ordinateur portable Intel dual-core générique avec Hyper Threading (4 cœurs logiques), DoMC a probablement enregistré un cluster de 4 cœurs. Ainsi, 2 cœurs seront inactifs lorsque les itérations 5 et 6 seront calculées, plus le temps supplémentaire de démarrage/arrêt de deux travaux supplémentaires. Il serait plus efficace de ne créer que 2 à 4 emplois d'arbres supplémentaires.