R h2o连接(内存)问题

R h2o连接(内存)问题,r,memory,memory-management,machine-learning,h2o,R,Memory,Memory Management,Machine Learning,H2o,我正在尝试使用h2o为数据集的不同部分运行两种算法(random forest和gbm)的优化网格。我的代码看起来像 for (...) { read data # setup h2o cluster h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1) gbm.grid <- h2o.grid("gbm", grid_

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

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)
}
附言:我在用电话

 # shutdown h2o
h2o.shutdown(prompt = FALSE)

# setup h2o cluster
h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1)
它似乎有效,但现在我在
grid optimization
中得到了这个错误(?)
random森林


你知道这可能是什么吗?

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


至于原因,
h2o.shutdown()
(任何h2o关闭)不是一个同步操作,在函数返回后仍然可以进行一些清理(例如处理未完成的请求)。您可以使用
h2o.clustrisup()
在使用
init
再次启动集群之前,检查集群是否确实已关闭。这似乎非常浪费,每次迭代启动h2o两次。如果只想释放内存,可以使用
h2o.removeAll()


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

重新启动集群。错误的原因是您没有更改循环中的
grid\u id
参数。我的建议是让H2O自动生成一个网格id,不指定/NULL。您还可以手动创建不同的网格ID(每个数据集一个),但这不是必需的


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

错误的原因是您没有更改循环中的
grid\u id
参数。我的建议是让H2O自动生成一个网格id,不指定/NULL。您还可以手动创建不同的网格ID(每个数据集一个),但这不是必需的


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

因此,我应该将
init
放在类似
while(h2o.clustrisup())
的内部。您应该首先运行
while(h2o.clustrisup())
(最好在循环中使用
sleep
),然后在该循环之后运行
h2o.init
。但正如我提到的,所有这些都是浪费,您不需要每次启动/停止节点。@quant
removeAll
也将删除您上载到H2O的所有数据,而您在随机林建模中使用的是
td.train.H2O
等。要么再次上传该数据,要么取代
removeAll
只删除您不再需要的东西(以前的型号等)。因此我应该将
init
放在类似
while(h2o.clustrisup())
?您应该首先运行
while(h2o.clustrisup())
(最好在循环中使用
sleep
)然后在循环之后运行
h2o.init
。但正如我提到的,所有这些都是浪费,您不需要每次启动/停止节点。@quant
removeAll
也将删除您上载到H2O的所有数据,而您在随机林建模中使用的是
td.train.H2O
等。要么重新上传数据,要么不要
removeAll
只需删除不再需要的东西(以前的型号等)。
 # shutdown h2o
h2o.shutdown(prompt = FALSE)

# setup h2o cluster
h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1)
 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() }