R h2o 连接(内存)问题
R h2o connection (memory) issue
我正在尝试 运行 使用 h2o
为数据集的不同部分的 2 种算法(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)
}
问题是,如果我一次性 运行 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 评论后,我 init
在 for 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 时,它会抛出错误,因为您试图将在不同数据集上训练的模型附加到同一网格。
我正在尝试 运行 使用 h2o
为数据集的不同部分的 2 种算法(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)
}
问题是,如果我一次性 运行 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 评论后,我 init
在 for 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 时,它会抛出错误,因为您试图将在不同数据集上训练的模型附加到同一网格。