Google 云计算引擎上的 xgboost 超慢
xgboost superslow on Google Cloud Compute Engine
我正在尝试在 Google 云计算引擎 (Ubuntu LTS16.04) 上训练一系列 R 插入符号模型。 xgboost(xgblinear 和 xgbtree)模型花了很长时间才完成训练。事实上,CPU 利用率在 GCP 状态监控中始终为 0。
我使用 doMC 库进行并行执行。它适用于 C5.0、glmnet 和 gbm 等模型。但是,对于 xgboost(xgblinear 和 xgbtree),由于某种原因,CPU 似乎不是 运行ning,因为利用率仍然为 0。故障排除:
1. 去掉单核的doMC和运行,问题依旧。
2. 将并行执行库改为doParallel 而不是doMC。这一轮 CPU 利用率上升,但完成 GCP 训练需要 5 分钟。在我的本地笔记本电脑上,相同的代码只需 12 秒即可完成。 (我在 GCP 上 运行 24 CPUs,在本地笔记本电脑上 4 CPUs)
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
我也遇到了同样的问题,搞了好久才明白背后的三个原因:
xgbLinear
需要比插入符号库中可用的任何其他机器学习算法更多的内存。对于每个内核,您可以假设至少有 1GB RAM,即使对于只有 1000 x 20 维的小数据集也是如此,对于更大的数据集更多。
xgbLinear
结合并行执行有一个从线程重新收集数据的最终过程。这个过程通常负责 'endless' 执行时间。同样,RAM 是限制因素。您可能已经看到以下错误消息,这通常是由 RAM 分配不足引起的:
Error in unserialize(socklist[[n]]) : error reading from connection
xgbLinear
有自己的并行处理算法,它与 doParallel
算法混在一起。这里,有效的解决方案是通过 caret::train() - nthread = 1
中的附加参数将 xgbLinear 设置为单线程 - 然后让 doParallel 进行并行化
如图(1)所示,您可以看到这里的内存利用率接近 80 GB:
和 235GB 用于训练一个 2500x14 维的仍然很小的数据集:
如 (2) 所示,您可以在这里看到,如果您没有足够的内存,这个过程将永远持续下去:
我正在尝试在 Google 云计算引擎 (Ubuntu LTS16.04) 上训练一系列 R 插入符号模型。 xgboost(xgblinear 和 xgbtree)模型花了很长时间才完成训练。事实上,CPU 利用率在 GCP 状态监控中始终为 0。
我使用 doMC 库进行并行执行。它适用于 C5.0、glmnet 和 gbm 等模型。但是,对于 xgboost(xgblinear 和 xgbtree),由于某种原因,CPU 似乎不是 运行ning,因为利用率仍然为 0。故障排除: 1. 去掉单核的doMC和运行,问题依旧。 2. 将并行执行库改为doParallel 而不是doMC。这一轮 CPU 利用率上升,但完成 GCP 训练需要 5 分钟。在我的本地笔记本电脑上,相同的代码只需 12 秒即可完成。 (我在 GCP 上 运行 24 CPUs,在本地笔记本电脑上 4 CPUs) 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
我也遇到了同样的问题,搞了好久才明白背后的三个原因:
xgbLinear
需要比插入符号库中可用的任何其他机器学习算法更多的内存。对于每个内核,您可以假设至少有 1GB RAM,即使对于只有 1000 x 20 维的小数据集也是如此,对于更大的数据集更多。xgbLinear
结合并行执行有一个从线程重新收集数据的最终过程。这个过程通常负责 'endless' 执行时间。同样,RAM 是限制因素。您可能已经看到以下错误消息,这通常是由 RAM 分配不足引起的:Error in unserialize(socklist[[n]]) : error reading from connection
xgbLinear
有自己的并行处理算法,它与doParallel
算法混在一起。这里,有效的解决方案是通过 caret::train() -nthread = 1
中的附加参数将 xgbLinear 设置为单线程 - 然后让 doParallel 进行并行化
如图(1)所示,您可以看到这里的内存利用率接近 80 GB:
和 235GB 用于训练一个 2500x14 维的仍然很小的数据集:
如 (2) 所示,您可以在这里看到,如果您没有足够的内存,这个过程将永远持续下去: