我明白爲什麼並行處理只能在XGB訓練中使用,並且不能用於其他模型。然而,令人驚訝的是我注意到用xgb預測也使用了並行處理。爲什麼caret :: predict()僅使用XGBtree進行並行處理?
我注意到這個意外的時候我拆我的大10M +數據幀成塊預測使用的foreach %dopar%
。這導致了一些錯誤,所以試圖解決它們我切換到順序循環與%do%
但在終端注意到所有處理器在哪裏使用。
經過一些試驗和錯誤,我發現caret::train()
似乎使用並行處理,其中模型只有XGBtree(可能是其他模型),但不在其他模型上。
當然,預測可以與任何模型並行進行,而不僅僅是xgb?
是caret::predict()
使用所有可用處理器的默認或預期行爲,並且有沒有一種方法可以通過例如以下方式來控制這種情況:打開或關閉它?
重複的例子:
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% { # %do% is a sequential loop
# get prediction
preds <- pieces[[i]] %>%
mutate(xgb_prediction = predict(xgbFit, newdata = .))
return(preds)
}
如果更改method = "xgbTree"
到例如method =「knn」,然後嘗試再次運行循環,只使用一個處理器。
因此,根據模型的類型,預測似乎會自動使用並行處理。
這是正確的嗎? 它是可控的嗎?
這是否意味着,如果你運行它'nthread = 1',了'predict'將按順序運行呢? –
@F.Privé,我是這麼認爲的,但從未嘗試過自己。 – Picarus
我很快測試它,似乎是這樣。 –