2017-09-10 2 views
1

J'utilise foreach et je lis dessus, par exemple.Pourquoi l'utilisation de% boucle% utilise-t-elle plusieurs processeurs? Boucle séquentielle attendue

je crois comprendre que vous utiliseriez %dopar% pour le traitement parallèle et %do% pour séquentiel. En fait, j'avais des problèmes avec %dopar% et en essayant de déboguer je l'ai changé en une boucle que je pensais être séquentielle en utilisant %do%. Il m'est arrivé d'avoir le terminal ouvert et j'ai remarqué que tous les processeurs tournaient pendant que je courais la boucle.

Est-ce prévu?

exemple Reproductible:

library(tidyverse) 
library(caret) 
library(foreach) 

# expected to see parallel here because caret and xgb with train() 
xgbFit <- train(Species ~ ., data = iris, method = "xgbTree", 
       trControl = trainControl(method = "cv", classProbs = TRUE)) 

iris_big <- do.call(rbind, replicate(1000, iris, simplify = F)) 

nr <- nrow(iris_big) 
n <- 1000 # loop over in chunks of 20 
pieces <- split(iris_big, rep(1:ceiling(nr/n), each=n, length.out=nr)) 
lenp <- length(pieces) 

# did not expect to see parallel processing take place when running the block below 
predictions <- foreach(i = seq_len(lenp)) %do% { 

    # get prediction 
    preds <- pieces[[i]] %>% 
    mutate(xgb_prediction = predict(xgbFit, newdata = .)) 

    return(preds) 
} 

bah <- do.call(rbind, predictions) 

enter image description here

Répondre

2

Ma meilleure estimation serait que ces derniers sont en cours d'exécution des processus encore des courses précédentes.

Il en est de même lorsque vous utilisez foreach::registerDoSeq()?

Ma deuxième supposition serait que predict fonctionne en parallèle.

+0

On dirait que c'est votre deuxième estimation et que cela n'a rien à voir avec foreach. J'ai couru prédire sur iris_big pas dans une boucle et j'ai vu que le traitement parallèle avait lieu là aussi. Cependant, seulement avec le modèle xgb. Lorsque je passe à un e.g. knn modèle pas de prédiction parallèle. Bizarre puisque je m'attendrais à ce que le parallèle puisse être utilisé pour prédire avec n'importe quel modèle. Je vais ajouter une balise caret ou peut-être poster une autre question sur pourquoi prédire les utilisations parallèles uniquement avec XGB –

+0

@DougFir Ceci est vraiment intéressant. Je voudrais savoir comment forcer 'predict' à s'exécuter séquentiellement car il peut gâcher avec un parallélisme de plus haut niveau que j'utilise dans mon code. –

+0

Ici pour l'intérêt: https://stackoverflow.com/questions/46153342/why-does-caretpredict-use-parallel-processing-with-xgbtree-only –