【问题标题】:R, h2o and foreach: java.lang.IllegalStateExceptionR、h2o 和 foreach:java.lang.IllegalStateException
【发布时间】:2017-05-02 20:34:47
【问题描述】:

在另一篇帖子here 中,我寻求帮助,以在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=$05ff14000000feffffff$_b66dbd609dc068f0137cc88cb42a
"

我不确定是什么导致了这个错误代码。我想这与内存问题有关,因为这段代码将占用我 85-95% 的 RAM (128GB) 和 100% 的 CPU(12 个线程)。

任何人有解决此问题的想法吗?

【问题讨论】:

    标签: r memory-management foreach parallel-processing h2o


    【解决方案1】:

    对于那些感兴趣的人,我找到了这个错误的原因。其实很简单。

    使用 makeCluster(12) 我在我的 CPU 上请求 12 个线程。

    稍后在foreach 调用中,我进行了h2o.init 调用,在该调用中我请求了另一个线程。

    由于我的机器只有 12 个线程,因此无法正确处理最后一次调用额外 (12+1) 线程。

    我通过为集群分配 6 个线程来解决此问题。这让我有 6 个线程来对 h2o.init 进行六个单独的调用(每个 foreach 调用一个)。

    这很好用。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 2017-02-21
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2016-12-28
      • 2016-08-01
      相关资源
      最近更新 更多