繁体   English   中英

使用xgboost和插入符号进行并行处理

[英]Parallel processing with xgboost and caret

我想在使用插入符的同时并行化xgboost的模型拟合过程。 从我在xgboost的文档中看到的, nthread参数控制在拟合模型时使用的线程数,在这种意义上,以并行方式构建树。 Caret的train函数将执行并行化,例如,在k-fold CV中运行每次迭代的过程。 这种理解是否正确,如果是,是否更好:

  1. 注册内核数量(例如,使用doMC包和registerDoMC函数),通过插入符号列函数设置nthread=1 ,以便将该参数传递给xgboost,在trainControl设置allowParallel=TRUE ,并让caret处理并行化交叉验证; 要么
  2. 禁用插入符并行化( allowParallel=FALSE且没有并行后端注册)并将nthread设置为物理核心数,因此并行化仅包含在xgboost中。

或者没有“更好”的方法来执行并行化?

编辑:我运行@topepo建议的代码, tuneLength = 10search="random" ,并在最后一行指定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

最后,事实证明,对于我的数据和此测试用例,让插入符号处理并行化在运行时方面是更好的选择。

预测最佳策略是不容易的。 我(偏见)的想法是你应该并行化最长的过程。 这里,这将是重新采样循环,因为开放的线程/工作者将多次调用模型。 平行化模型的相反方法将反复启动和停止工人,理论上减慢了工作量。 你的旅费可能会改变。

我没有安装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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM