2017-05-31 33 views
0

我正在尝试使用h2o针对数据集的不同部分针对2种算法(random forestgbm)运行优化网格。我的代码看起来像R H2O连接(内存)问题

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 

PS:我使用的是线

# shutdown h2o 
h2o.shutdown(prompt = FALSE) 

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

所以我“重置”h2o,以便我没有用完内存

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

UPDATE

以下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 optimizationrandom forest

enter image description here

任何想法,这可能是?

回答

1

这似乎相当浪费,每次迭代开始h2o两次。如果您只想释放内存,则可以使用h2o.removeAll()代替。

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

+0

所以我应该把'init'放在类似'while(h2o.clusterIsUp())'的东西里面? – quant

+0

你应该首先在while循环内运行'h2o.clusterIsUp())'(最好在循环内使用'sleep'),然后在循环之后运行'h2o.init'。但是正如我所提到的那样是浪费,你不需要每次启动/停止节点。 –

+0

请参阅更新 – quant

1

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

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