Google Cloud Compute Engine上的xgboost超慢

时间:2019-06-09 14:53:38

标签: r google-cloud-platform xgboost

我正在尝试在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

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,花了很长时间才了解背后的三个原因:

  1. xgbLinear比插入符号库中可用的任何其他机器学习算法需要更多的内存。对于每个内核,即使对于只有1000 x 20维的微型数据集,也可以假设至少1GB RAM,对于更大的数据集,则可以假设更多。

  2. xgbLinear与并行执行相结合,具有一个最终过程,该过程从线程中重新收集数据。这个过程通常负责“无尽”的执行时间。同样,RAM是限制因素。您可能已经看到以下错误消息,该错误消息通常是由于很少分配RAM引起的: Error in unserialize(socklist[[n]]) : error reading from connection

  3. xgbLinear有自己的并行处理算法,该算法与doParallel算法混合在一起。在这里,有效的解决方案是通过caret :: train()-nthread = 1-中的附加参数将xgbLinear设置为单线程,并让doParallel进行并行化

如(1)所示,您可以在此处看到内存利用率接近80 GB: enter image description here

和235GB,用于训练2500x14维的仍然很小的数据集: enter image description here

作为(2)的说明,您可以在这里看到,如果没有足够的内存,此过程将永远花费:

enter image description here