R h2o 连接(内存)问题

R h2o connection (memory) issue

我正在尝试 运行 使用 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)

这样我就"reset"h2o,这样我就不会运行内存不足

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

更新

在关注 Matteusz 评论后,我 initfor loop 之外和 for loop 内部我使用 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

收到此错误 (?)

知道这可能是什么吗?

这看起来很浪费,每次迭代都要启动 h2o 两次。如果你只是想释放内存,你可以使用 h2o.removeAll() 代替。

至于原因,h2o.shutdown()(任何 H2O 关闭)不是同步操作,并且在函数 returns 之后仍会进行一些清理(例如处理未完成的请求)。在使用 init.

再次启动之前,您可以使用 h2o.clusterIsUp() 检查集群是否确实已关闭

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

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