在使用插入符号时,我想并行化xgboost的模型拟合过程。从我在xgboost的文档中看到的情况来看,nthread参数在拟合模型时控制要使用的线程数,也就是说,以并行的方式构建树。卡雷特的train函数将执行并行化,例如,为k折叠CV中的每一次迭代运行一个进程。如果是,这种理解是否正确,最好是:
doMC包和registerDoMC函数),通过插入符号的train函数设置nthread=1,以便将该参数传递给xgboost,在trainControl中设置allowParallel=TRUE,并让caret处理交叉验证的并行化;或allowParallel=FALSE和无并行后端注册),并将nthread设置为物理核数,因此并行化只包含在xgboost中。或者没有“更好”的方法来执行并行化?
编辑:我使用tuneLength = 10和search="random"运行了@topepo建议的代码,并在最后一行指定了nthread=1 (否则我理解xgboost将使用多线程)。我得到的结果是:
xgb_par[3]
elapsed
283.691
just_seq[3]
elapsed
276.704
mc_par[3]
elapsed
89.074
just_seq[3]/mc_par[3]
elapsed
3.106451
just_seq[3]/xgb_par[3]
elapsed
0.9753711
xgb_par[3]/mc_par[3]
elapsed
3.184891最后,对于我的数据和这个测试用例,让插入符号处理并行化在运行时是一个更好的选择。
发布于 2016-09-16 17:39:24
要预测出最佳战略是什么并不简单。我的(有偏见的)想法是,您应该并行化花费时间最长的进程。在这里,这将是重采样循环,因为打开的线程/工作者将多次调用该模型。并行化模型fit的相反方法将反复启动和停止工人,理论上也会减慢速度。你的里程可能会不同。
我没有安装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 https://stackoverflow.com/questions/39528392
复制相似问题