R、h2o 和 foreach:java.lang.IllegalStateException
R, h2o and foreach: java.lang.IllegalStateException
在另一个 post 中,我寻求有关在 foreach
循环中并行处理对 h2o.gbm
的调用的帮助。
根据提供的答案,我 运行 一个类似于此示例的脚本:
library(h2o)
data(iris)
data <- as.h2o(iris)
ss <- h2o.splitFrame(data)
gbm <- h2o.gbm(x = 1:4, y = "Species", training_frame = ss[[1]])
h2o.saveModel(path="some path")
h2o.shutdown(prompt = FALSE)
library(foreach)
library(doParallel)
#setup parallel backend to use 12 processors
cl <- makeCluster(12)
registerDoParallel(cl)
#loop
df4 <- foreach(i = seq(20), .combine=rbind) %dopar% {
library(h2o)
port <- 54321 + 3*i
print(paste0("http://localhost:", port))
h2o.init(nthreads = 1, max_mem_size = "10G", port = port) #my local machine runs 128GB
df4 <- data.frame()
gbm <- h2o.loadModel(path="some path")
df4 <- as.data.frame(h2o.predict(gbm, ss[[2]]))[,1]
}
它 运行 在我的真实数据的小样本上非常好(至少比顺序快 50%)
但是当我对我的所有数据 运行 执行此操作时,我在 45 分钟后收到以下错误代码:
Error in { : task 2 failed - "
ERROR MESSAGE:
DistributedException from localhost/127.0.0.1:60984, caused by
java.lang.IllegalStateException: Unable to clean up RollupStats after an
exception (see cause). This could cause a key leakage, key=ff14000000feffffff$_b66dbd609dc068f0137cc88cb42a
"
我不确定是什么原因导致此错误代码。我想这与内存问题有关,因为这段代码将占用我 RAM (128GB) 的 85-95% 和我 CPU(12 个线程)的 100%。
任何人有解决这个问题的想法吗?
对于那些有兴趣的人,我找到了这个错误的原因。其实很简单。
使用 makeCluster(12)
我在 CPU 上请求 12 个线程。
稍后在 foreach
调用中,我进行了一个 h2o.init
调用,我在其中请求了另一个线程。
由于我的机器只有 12 个线程,因此无法正确处理最后一次对附加 (12+1) 个线程的调用。
我通过为集群分配 6 个线程来解决这个问题。这让我有 6 个线程可以对 h2o.init
进行六次单独调用(每个 foreach
调用一个)。
效果很好。
在另一个 post foreach
循环中并行处理对 h2o.gbm
的调用的帮助。
根据提供的答案,我 运行 一个类似于此示例的脚本:
library(h2o)
data(iris)
data <- as.h2o(iris)
ss <- h2o.splitFrame(data)
gbm <- h2o.gbm(x = 1:4, y = "Species", training_frame = ss[[1]])
h2o.saveModel(path="some path")
h2o.shutdown(prompt = FALSE)
library(foreach)
library(doParallel)
#setup parallel backend to use 12 processors
cl <- makeCluster(12)
registerDoParallel(cl)
#loop
df4 <- foreach(i = seq(20), .combine=rbind) %dopar% {
library(h2o)
port <- 54321 + 3*i
print(paste0("http://localhost:", port))
h2o.init(nthreads = 1, max_mem_size = "10G", port = port) #my local machine runs 128GB
df4 <- data.frame()
gbm <- h2o.loadModel(path="some path")
df4 <- as.data.frame(h2o.predict(gbm, ss[[2]]))[,1]
}
它 运行 在我的真实数据的小样本上非常好(至少比顺序快 50%)
但是当我对我的所有数据 运行 执行此操作时,我在 45 分钟后收到以下错误代码:
Error in { : task 2 failed - "
ERROR MESSAGE:
DistributedException from localhost/127.0.0.1:60984, caused by
java.lang.IllegalStateException: Unable to clean up RollupStats after an
exception (see cause). This could cause a key leakage, key=ff14000000feffffff$_b66dbd609dc068f0137cc88cb42a
"
我不确定是什么原因导致此错误代码。我想这与内存问题有关,因为这段代码将占用我 RAM (128GB) 的 85-95% 和我 CPU(12 个线程)的 100%。
任何人有解决这个问题的想法吗?
对于那些有兴趣的人,我找到了这个错误的原因。其实很简单。
使用 makeCluster(12)
我在 CPU 上请求 12 个线程。
稍后在 foreach
调用中,我进行了一个 h2o.init
调用,我在其中请求了另一个线程。
由于我的机器只有 12 个线程,因此无法正确处理最后一次对附加 (12+1) 个线程的调用。
我通过为集群分配 6 个线程来解决这个问题。这让我有 6 个线程可以对 h2o.init
进行六次单独调用(每个 foreach
调用一个)。
效果很好。