我想在使用插入符的同时并行化xgboost的模型拟合过程。从我在xgboost的documentation中看到的,nthread
参数控制在拟合模型时使用的线程数,在这种意义上,以并行方式构建树。 Caret的train
函数将执行并行化,例如,在k-fold CV中运行每次迭代的过程。这种理解是否正确,如果是,最好是:
doMC
包和registerDoMC
函数),通过插入符号列函数设置nthread=1
,以便将该参数传递给xgboost,set {在allowParallel=TRUE
中{1}},让trainControl
处理交叉验证的并行化;或caret
并且没有并行后端注册)并将allowParallel=FALSE
设置为物理核心数,因此并行化仅包含在xgboost中。或者没有“更好”的方式来执行并行化?
编辑:我运行了@topepo建议的代码,nthread
和tuneLength = 10
,并在最后一行指定search="random"
(否则我理解xgboost将使用多线程)。我得到的结果是:
nthread=1
最后,结果是,对于我的数据和这个测试用例,让插入处理并行化在运行时方面是更好的选择。
答案 0 :(得分:9)
预测最佳策略是不容易的。我(偏见)的想法是你应该并行化最长的过程。这里,这将是重新采样循环,因为开放的线程/工作者将多次调用模型。平行化模型的相反方法将反复启动和停止工人,理论上减慢了工作量。你的旅费可能会改变。
我没有安装OpenMP,但下面有代码进行测试(如果您可以报告结果,那将会有所帮助)。
library(caret)
library(plyr)
library(xgboost)
library(doMC)
foo <- function(...) {
set.seed(2)
mod <- train(Class ~ ., data = dat,
method = "xgbTree", tuneLength = 50,
..., trControl = trainControl(search = "random"))
invisible(mod)
}
set.seed(1)
dat <- twoClassSim(1000)
just_seq <- system.time(foo())
## I don't have OpenMP installed
xgb_par <- system.time(foo(nthread = 5))
registerDoMC(cores=5)
mc_par <- system.time(foo())
我的结果(没有OpenMP)
> just_seq[3]
elapsed
326.422
> xgb_par[3]
elapsed
319.862
> mc_par[3]
elapsed
102.329
>
> ## Speedups
> xgb_par[3]/mc_par[3]
elapsed
3.12582
> just_seq[3]/mc_par[3]
elapsed
3.189927
> just_seq[3]/xgb_par[3]
elapsed
1.020509