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