J'utilise foreach et je lis dessus, par exemple.Pourquoi l'utilisation de% boucle% utilise-t-elle plusieurs processeurs? Boucle séquentielle attendue
- https://www.r-bloggers.com/the-wonders-of-foreach/
- https://www.rdocumentation.org/packages/foreach/versions/1.4.3/topics/foreach
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)
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 –
@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. –
Ici pour l'intérêt: https://stackoverflow.com/questions/46153342/why-does-caretpredict-use-parallel-processing-with-xgbtree-only –