我正在尝试在Google Cloud Compute Engine(Ubuntu LTS16.04)上训练R插入符号模型的列表。 xgboost模型(xgblinear和xgbtree)花了很长时间才能完成训练。实际上,从GCP状态监视来看,CPU利用率始终为0。
我使用doMC库进行并行执行。它对于C5.0,glmnet和gbm等模型非常有效。但是,对于xgboost(xgblinear和xgbtree),由于某种原因,由于利用率仍然为0,CPU似乎未运行。 1.卸下doMC并仅在单核上运行,仍然存在相同的问题。 2.将并行执行库更改为doParallel而不是doMC。这一回合,CPU利用率上升了,但是花了5分钟才能完成GCP的培训。在我的本地笔记本电脑上,相同的代码仅用12秒即可完成。 (我在GCP上运行了24个CPU,在本地笔记本电脑上运行了4个CPU) 3. doMC并行执行可与其他算法配合使用。只有xgboost会出现此问题。
代码:
xgblinear_Grid <- expand.grid(nrounds = c(50, 100),
lambda = c(.05,.5),
alpha = c(.5),
eta = c(.3))
registerDoMC(cores = mc - 1)
set.seed(123)
xgbLinear_varimp <- train(formula2, data=train_data, method="xgbLinear", metric=metric, tuneGrid = xgblinear_Grid, trControl=fitControl, preProcess = c("center", "scale", "zv"))
print(xgbLinear_varimp)
未生成任何错误消息。它只是无限地运行。R sessionInfo
答案 0 :(得分:1)
我遇到了同样的问题,花了很长时间才了解背后的三个原因:
xgbLinear
比插入符号库中可用的任何其他机器学习算法需要更多的内存。对于每个内核,即使对于只有1000 x 20维的微型数据集,也可以假设至少1GB RAM,对于更大的数据集,则可以假设更多。
xgbLinear
与并行执行相结合,具有一个最终过程,该过程从线程中重新收集数据。这个过程通常负责“无尽”的执行时间。同样,RAM是限制因素。您可能已经看到以下错误消息,该错误消息通常是由于很少分配RAM引起的:
Error in unserialize(socklist[[n]]) : error reading from connection
xgbLinear
有自己的并行处理算法,该算法与doParallel
算法混合在一起。在这里,有效的解决方案是通过caret :: train()-nthread = 1
-中的附加参数将xgbLinear设置为单线程,并让doParallel进行并行化
作为(2)的说明,您可以在这里看到,如果没有足够的内存,此过程将永远花费: