我理解为什么在训练期间只能为XGB使用并行处理,并且不能用于其他模型。然而,令人惊讶的是我注意到xgb的预测也使用了并行处理。
当我将大型10M +数据框拆分成预测使用foreach %do%
时,我意外地注意到了这一点。这导致了一些错误,所以试图绕过它们我切换到使用caret::train()
的顺序循环,但在终端中注意到所有正在使用的处理器。
经过一些试验和错误后,我发现caret::predict()
似乎使用并行处理,其中模型仅为XGB树(可能是其他模型),但不在其他模型上。
当然可以预测可以与任何模型并行完成,而不仅仅是xgb?
使用所有可用处理器是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"
如果您将base R
更改为例如method =“knn”然后尝试再次运行循环,只使用一个处理器。
因此,预测似乎根据模型的类型自动使用并行处理。
这是对的吗? 它可以控制吗?
答案 0 :(得分:1)
在本期中,您可以找到所需的信息:
https://github.com/dmlc/xgboost/issues/1345
总之,如果您使用并行性训练模型,预测方法也将以并行处理方式运行。 如果要更改后一种行为,则必须更改设置:
xgb.parameters(bst) <- list(nthread = 1)
另一种方法是更改环境变量:
OMP_NUM_THREADS
正如你解释的那样,这只发生在xgbTree
上