【问题标题】:R h2o connection (memory) issueR h2o 连接(内存)问题
【发布时间】:2017-11-01 01:43:49
【问题描述】:

我正在尝试使用 h2o 为数据集的不同部分运行 2 种算法(random forestgbm)的优化网格。我的代码看起来像

for (...)
{
        read data

        # setup h2o cluster
        h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1)

        gbm.grid <- h2o.grid("gbm", grid_id = "gbm.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
                             seed = 42, distribution = "bernoulli",
                             training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o,
                             hyper_params = hyper_params, search_criteria = search_criteria)

    # shutdown h2o
    h2o.shutdown(prompt = FALSE)

    # setup h2o cluster
    h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1)

    rf.grid <- h2o.grid("randomForest", grid_id = "rf.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
                        seed = 42, distribution = "bernoulli",
                        training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o,
                        hyper_params = hyper_params, search_criteria = search_criteria)

    h2o.shutdown(prompt = FALSE)
}

问题是如果我一次性运行for loop,我会得到错误

Error in .h2o.doSafeREST(h2oRestApiVersion = h2oRestApiVersion, urlSuffix = urlSuffix,  : 
  Unexpected CURL error: Failed to connect to localhost port 54321: Connection refused

P.S.:我用的是线路

 # shutdown h2o
h2o.shutdown(prompt = FALSE)

# setup h2o cluster
h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1)

这样我“重置”h2o,这样我就不会耗尽内存

我也读过R H2O - Memory management,但我不清楚它是如何工作的。

更新

在关注 Matteusz 评论后,我在 for loop 之外和 for loop 内部使用 init,我使用 h2o.removeAll()。所以现在我的代码看起来像这样

 h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1)
for(...)
{
read data

gbm.grid <- h2o.grid("gbm", grid_id = "gbm.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
                             seed = 42, distribution = "bernoulli",
                             training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o,
                             hyper_params = hyper_params, search_criteria = search_criteria)

h2o.removeAll()

rf.grid <- h2o.grid("randomForest", grid_id = "rf.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
                        seed = 42, distribution = "bernoulli",
                        training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o,
                        hyper_params = hyper_params, search_criteria = search_criteria)

h2o.removeAll() }

它似乎有效,但现在我在grid optimization 中为random forest 收到此错误(?)

任何想法这可能是什么?

【问题讨论】:

    标签: r memory memory-management machine-learning h2o


    【解决方案1】:

    错误的原因是您没有更改循环中的grid_id 参数。我的建议是让 H2O 通过不指定/为空来自动生成网格 ID。您也可以手动创建不同的网格 ID(每个数据集一个),但这不是必需的。

    当您使用相同的训练集时,您只能将新模型添加到现有网格(通过重复使用相同的网格 ID)。当您将网格搜索放在不同数据集的 for 循环中并保持相同的网格 id 时,它会引发错误,因为您试图将在不同数据集上训练的模型附加到同一个网格。

    【讨论】:

      【解决方案2】:

      这似乎很浪费,每次迭代都启动 h2o 两次。如果你只是想释放内存,你可以改用h2o.removeAll()

      至于原因,h2o.shutdown()(任何 H2O 关闭)不是同步操作,在函数返回后仍可能进行一些清理(例如处理未完成的请求)。您可以使用h2o.clusterIsUp() 检查集群是否真的关闭,然后再使用init 重新启动它。

      【讨论】:

      • 所以我应该把init 放在while(h2o.clusterIsUp()) 之类的东西里面?
      • 你应该首先运行while(h2o.clusterIsUp())(最好在循环内使用sleep)并在该循环之后运行h2o.init。但正如我提到的那样,所有这些都是浪费的,您不需要每次都启动/停止节点。
      • @quant removeAll 还将删除您上传到 H2O 但您在随机森林建模中使用 td.train.h2o 等的所有数据。要么再次上传该数据,要么删除 removeAll 而不是删除您不再需要的东西(以前的模型等)。
      猜你喜欢
      • 2015-04-26
      • 2020-10-04
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多