在多个R进程中运行xgboost的问题

在多个R进程中运行xgboost的问题,r,parallel-processing,xgboost,R,Parallel Processing,Xgboost,同时在多个R进程中运行xgboost是否存在任何已知问题 背景是,我正试图做一个简单的网格搜索,寻找最佳的超参数。由于这台机器上有几个内核,我想我应该并行运行这些模型。但是,xgb.DMatrix死亡时出现错误: > cl <- makeCluster(4) > clusterEvalQ(cl, { + load("processed_data.rdata") + library(xgboost) + traindata <-

同时在多个R进程中运行xgboost是否存在任何已知问题

背景是,我正试图做一个简单的网格搜索,寻找最佳的超参数。由于这台机器上有几个内核,我想我应该并行运行这些模型。但是,
xgb.DMatrix
死亡时出现错误:

> cl <- makeCluster(4)
> clusterEvalQ(cl, {
+     load("processed_data.rdata")
+     library(xgboost)
+     traindata <- xgb.DMatrix(as.matrix(train_df), label=train_y)
+     testdata <- xgb.DMatrix(as.matrix(test_df), label=test_y)
+ })
[[1]]
Error in dim.xgb.DMatrix(x) :
  [12:59:39] amalgamation/../src/c_api/c_api.cc:355: DMatrix/Booster has not been intialized or has already been disposed.
在load()行上有一个额外的
。否则,

也许可以把任务分成几个独立的步骤

library(xgboost)
load("processed_data.rdata")
cl <- makeCluster(4)
clusterEvalQ(cl, {
  traindata <- xgb.DMatrix(as.matrix(train_df), label=train_y)
})
clusterEvalQ(cl, {
  testdata <- xgb.DMatrix(as.matrix(test_df), label=test_y)
})
库(xgboost)
加载(“已处理的_data.rdata”)
cl在load()行上有一个额外的
。否则,

也许可以把任务分成几个独立的步骤

library(xgboost)
load("processed_data.rdata")
cl <- makeCluster(4)
clusterEvalQ(cl, {
  traindata <- xgb.DMatrix(as.matrix(train_df), label=train_y)
})
clusterEvalQ(cl, {
  testdata <- xgb.DMatrix(as.matrix(test_df), label=test_y)
})
库(xgboost)
加载(“已处理的_data.rdata”)

cl解决了这个问题。发生的情况是,
clusterEvalQ
,按照R中的约定,使用最后计算的表达式的值作为头节点的返回值。这是通过将值序列化到worker和head之间的管道中,然后再次反序列化来完成的。但是,
xgb.DMatrix
不能像常规R对象那样序列化,因为它包含外部指针;尝试对其进行反序列化会导致错误

解决方案是将传递给
clusterEvalQ
的表达式的最后一行不是
xgb.DMatrix
调用<代码>空值
将执行以下操作:

> clusterEvalQ(cl, {
+     load(file.path(local_dir, "processed_data.rdata")
+     library(xgboost)
+     traindata <- xgb.DMatrix(as.matrix(train_df), label=train_y)
+     testdata <- xgb.DMatrix(as.matrix(test_df), label=test_y)
+     NULL
+ })
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL
>clusterEvalQ(cl{
+加载(file.path(local\u dir,“processed\u data.rdata”)
+图书馆(xgboost)

+traindata解决了这个问题。发生的情况是,
clusterEvalQ
,按照R中的约定,使用上一个计算表达式的值作为head节点的返回值。这是通过将值序列化到worker和head之间的管道中,然后再次反序列化来完成的。但是,
xgb.DMatrix
不能被删除由于它包含外部指针,所以像常规的R对象一样进行序列化;尝试对其进行反序列化会导致错误

解决方案是将传递给
clusterEvalQ
的表达式的最后一行不是
xgb.DMatrix
调用。将执行以下操作:

> clusterEvalQ(cl, {
+     load(file.path(local_dir, "processed_data.rdata")
+     library(xgboost)
+     traindata <- xgb.DMatrix(as.matrix(train_df), label=train_y)
+     testdata <- xgb.DMatrix(as.matrix(test_df), label=test_y)
+     NULL
+ })
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL
>clusterEvalQ(cl{
+加载(file.path(local\u dir,“processed\u data.rdata”)
+图书馆(xgboost)

+traindata抱歉,打字错误,修复了同样的问题,只有一个
xgb。DMatrix
调用
clusterEvalQ
仍然会导致相同的错误看起来这个博客作者有了并行的打包工作-也许这个页面上的一些东西会有所帮助!我基本上在加载数据方面做了完全相同的事情,所以我不知道为什么它不工作很抱歉,输入错误,修复了同样的问题,只有一个
xgb。DMatrix
调用
clusterEvalQ
仍然会导致相同的错误看起来这个博客作者有了并行的打包工作-也许这个页面上的一些东西会有所帮助!我基本上在加载数据方面做了完全相同的事情,所以我不知道为什么它不起作用