【问题标题】:R h2o server CURL error, kind of repeatableR h2o 服务器 CURL 错误,有点可重复
【发布时间】:2017-07-27 20:25:19
【问题描述】:

起初我以为这是一个随机问题,但重新运行脚本又发生了。

Error in .h2o.doSafeREST(h2oRestApiVersion = h2oRestApiVersion, urlSuffix = urlSuffix,  : 
Unexpected CURL error: Recv failure: Connection reset by peer

我正在使用 Gradient Boosting Machine 模型对中等大小的数据集(大约 40000 x 30)进行网格搜索。网格中最大的树是 1000。这通常发生在运行几个小时后。我将max_mem_size 设置为 30Gb。

for ( k in 1:nrow(par.grid)) {
    hg = h2o.gbm(training_frame = Xtr.hf, 
                 validation_frame = Xt.hf,
                 distribution="huber",
                 huber_alpha = HuberAlpha,
                 x=2:ncol(Xtr.hf),        
                 y=1,                     
                 ntrees = par.grid[k,"ntree"],
                 max_depth = depth,
                 learn_rate = par.grid[k,"shrink"],
                 min_rows = par.grid[k,"min_leaf"],
                 sample_rate = samp_rate,
                 col_sample_rate = c_samp_rate,
                 nfolds = 5,
                 model_id = p(iname, "_gbm_CV")
                 )
    cv_result[k,1] = h2o.mse(hg, train=TRUE)
    cv_result[k,2] = h2o.mse(hg, valid=TRUE)
  }

【问题讨论】:

  • 您是否尝试过为 H2O 提供更多内存?它可能在 H2O 集群上内存不足。我不知道您要训练多少个模型(技术上将有 (5+1)*nrow(par.grid) 个模型,因为您有 nfolds = 5),但 GBM 模型可能很大并且会占用您的 RAM...
  • @ErinLeDell 我可以确认它是 RAM。这实际上是另一个循环中的一个内循环,因此内存需求更大。你的问题是为什么它保留所有 (5+1)*N 模型?运行完成后,应该覆盖以前的模型,对吧?

标签: r h2o


【解决方案1】:

尝试在最里面的循环中添加gc()。更好的是明确使用h2o.rm()

所以,它会变成这样:

for ( k in 1:nrow(par.grid)) {
  hg = h2o.gbm(...stuff...,
             model_id = p(iname, "_gbm_CV")
             )
  cv_result[k,1] = h2o.mse(hg, train=TRUE)
  cv_result[k,2] = h2o.mse(hg, valid=TRUE)
  h2o.rm(hg);rm(hg);gc()
}

理论上这应该无关紧要,但如果 R​​ 保持参考,那么 H2O 也会。

如果您认为您可能想要进一步研究任何模型,并且您有足够的本地磁盘空间,您可以在调用h2o.mse() 之前执行h2o.saveModel()。 (当然,您需要指定一个以某种方式总结所有参数的文件名......)

根据评论更新:如果您不需要保留任何模型或数据,那么使用h2o.removeAll() 是另一种快速回收所有内存的方法。 (如果您确实需要保留的任何数据或模型能够快速且轻松地重新加载,那么这种方法也值得考虑。)

【讨论】:

  • 我认为内存问题出在 java 服务器上,它保留了与 CV 迭代一样多的数据集副本。所以gc() 无济于事。我最终做的是在外循环中调用 h2o.removeAll() 。
  • @horaceT 是的,它是 h2o(java 服务器)持有内存。但它不会在它认为客户端正在使用它时释放它,显然即使在重新使用模型 ID 时也是如此,这就是为什么你在 R 客户端上执行显式 gc() 的原因。 h2o.removeAll() 有这个选项时会更好;我将编辑我的答案以提及这一点。
  • 我的经验是gc() 对 R 的内存问题没有多大帮助。遗憾的是,尽管 R 在近年来如此受欢迎,但它的核心弱点从未得到解决。或者也许只是我在抱怨......
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多