R 目标与 H2O
R targets with H2O
我用targets
as a pipelining tool for an ML project with H2O
。
在这里使用 H2O 的主要独特之处在于它创建了一个新的“集群”(基本上是一个新的本地 process/server,据我所知,它通过 Rest API 进行通信)。
我遇到的问题有两个。
- 我如何stop/operate目标框架内的集群以智能方式
- 如何在目标框架中保存和加载 data/models
MWE
我想出的最小工作示例如下所示(即 _targets.R
文件):
library(targets)
library(h2o)
# start h20 cluster once _targets.R gets evaluated
h2o.init(nthreads = 2, max_mem_size = "2G", port = 54322, name = "TESTCLUSTER")
create_dataset_h2o <- function() {
# connect to the h2o cluster
h2o.init(ip = "localhost", port = 54322, name = "TESTCLUSTER", startH2O = FALSE)
# convert the data to h2o dataframe
as.h2o(iris)
}
train_model <- function(hex_data) {
# connect to the h2o cluster
h2o.init(ip = "localhost", port = 54322, name = "TESTCLUSTER", startH2O = FALSE)
h2o.randomForest(x = c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"),
y = c("Species"),
training_frame = hex_data,
model_id = "our.rf",
seed = 1234)
}
predict_model <- function(model, hex_data) {
# connect to the h2o cluster
h2o.init(ip = "localhost", port = 54322, name = "TESTCLUSTER", startH2O = FALSE)
h2o.predict(model, newdata = hex_data)
}
list(
tar_target(data, create_dataset_h2o()),
tar_target(model, train_model(data), format = "qs"),
tar_target(predict, predict_model(model, data), format = "qs")
)
这有点管用,但面临着我在上面和下面遇到的两个问题...
广告 1 - 停止集群
通常我会在我的脚本末尾添加一个h2o::h2o.shutdown(prompt = FALSE)
,但在这种情况下这不起作用。
或者,我想出了一个新目标,它总是 运行.
# in _targets.R in the final list
tar_target(END, h2o.shutdown(prompt = FALSE), cue = tar_cue(mode = "always"))
这在我 运行 tar_make()
时有效,但在我使用 tar_visnetwork()
.
时无效
另一种选择是使用。
# after the h2o.init(...) call inside _targets.R
on.exit(h2o.shutdown(prompt = FALSE), add = TRUE)
我想出的另一种选择是在目标之外处理服务器并且只连接到它。但我觉得这可能会破坏目标工作流程...
您还有其他处理方法吗?
广告 2 - 保存数据集和模型
MWE 中的代码没有以正确的格式 (format = "qs"
) 保存目标 model
和 predict
的数据。有时(我认为当集群重新启动时),数据“无效”并且 h2o 抛出错误。 R 会话中 h2o 格式的数据是指向 h2o 数据帧的指针(另请参阅 docs)。
对于同样在 R 之外存储模型的 keras,有选项 format = "keras"
, which calls keras::save_model_hdf5()
behind the scenes. Similarly, H2O would require h2o::h2o.exportFile()
and h2o::h2o.importFile()
for the dataset and h2o::h2o.saveModel()
and h2o::h2o.loadModel()
for models (see also docs)。
有没有办法为 tar_targets
创建额外的格式,或者我需要将数据写入文件,然后 return 文件?缺点是这个文件在 _targets
文件夹系统之外,如果我没记错的话。
广告 1
我建议在单独的脚本中处理管道外的 H2O 集群。这样,tar_visnetwork()
就不会启动或停止集群,并且您可以更清楚地将软件工程与数据分析分开。
# run_pipeline.R
start_h2o_cluster(port = ...)
on.exit(stop_h2o_cluster(port = ...))
targets::tar_make_clustermq(workers = 4)
广告 2
听起来 H2O 对象是 not exportable。目前,您需要手动保存这些文件,确定路径,然后在 tar_target()
中写入 format = "file"
。我愿意考虑基于 H20 的格式。 h2o.exportFile()
、h2o.importFile()
、h2o::h2o.saveModel()
和 h2o::h2o.loadModel()
是否以某种方式涵盖了所有对象,或者是否存在具有不同序列化功能的更多种类的对象? h2o
是否有像 keras
中的 serialize_model()
/unserialize_model()
那样在内存中执行此(反)序列化的实用程序?
我用targets
as a pipelining tool for an ML project with H2O
。
在这里使用 H2O 的主要独特之处在于它创建了一个新的“集群”(基本上是一个新的本地 process/server,据我所知,它通过 Rest API 进行通信)。
我遇到的问题有两个。
- 我如何stop/operate目标框架内的集群以智能方式
- 如何在目标框架中保存和加载 data/models
MWE
我想出的最小工作示例如下所示(即 _targets.R
文件):
library(targets)
library(h2o)
# start h20 cluster once _targets.R gets evaluated
h2o.init(nthreads = 2, max_mem_size = "2G", port = 54322, name = "TESTCLUSTER")
create_dataset_h2o <- function() {
# connect to the h2o cluster
h2o.init(ip = "localhost", port = 54322, name = "TESTCLUSTER", startH2O = FALSE)
# convert the data to h2o dataframe
as.h2o(iris)
}
train_model <- function(hex_data) {
# connect to the h2o cluster
h2o.init(ip = "localhost", port = 54322, name = "TESTCLUSTER", startH2O = FALSE)
h2o.randomForest(x = c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"),
y = c("Species"),
training_frame = hex_data,
model_id = "our.rf",
seed = 1234)
}
predict_model <- function(model, hex_data) {
# connect to the h2o cluster
h2o.init(ip = "localhost", port = 54322, name = "TESTCLUSTER", startH2O = FALSE)
h2o.predict(model, newdata = hex_data)
}
list(
tar_target(data, create_dataset_h2o()),
tar_target(model, train_model(data), format = "qs"),
tar_target(predict, predict_model(model, data), format = "qs")
)
这有点管用,但面临着我在上面和下面遇到的两个问题...
广告 1 - 停止集群
通常我会在我的脚本末尾添加一个h2o::h2o.shutdown(prompt = FALSE)
,但在这种情况下这不起作用。
或者,我想出了一个新目标,它总是 运行.
# in _targets.R in the final list
tar_target(END, h2o.shutdown(prompt = FALSE), cue = tar_cue(mode = "always"))
这在我 运行 tar_make()
时有效,但在我使用 tar_visnetwork()
.
另一种选择是使用。
# after the h2o.init(...) call inside _targets.R
on.exit(h2o.shutdown(prompt = FALSE), add = TRUE)
我想出的另一种选择是在目标之外处理服务器并且只连接到它。但我觉得这可能会破坏目标工作流程...
您还有其他处理方法吗?
广告 2 - 保存数据集和模型
MWE 中的代码没有以正确的格式 (format = "qs"
) 保存目标 model
和 predict
的数据。有时(我认为当集群重新启动时),数据“无效”并且 h2o 抛出错误。 R 会话中 h2o 格式的数据是指向 h2o 数据帧的指针(另请参阅 docs)。
对于同样在 R 之外存储模型的 keras,有选项 format = "keras"
, which calls keras::save_model_hdf5()
behind the scenes. Similarly, H2O would require h2o::h2o.exportFile()
and h2o::h2o.importFile()
for the dataset and h2o::h2o.saveModel()
and h2o::h2o.loadModel()
for models (see also docs)。
有没有办法为 tar_targets
创建额外的格式,或者我需要将数据写入文件,然后 return 文件?缺点是这个文件在 _targets
文件夹系统之外,如果我没记错的话。
广告 1
我建议在单独的脚本中处理管道外的 H2O 集群。这样,tar_visnetwork()
就不会启动或停止集群,并且您可以更清楚地将软件工程与数据分析分开。
# run_pipeline.R
start_h2o_cluster(port = ...)
on.exit(stop_h2o_cluster(port = ...))
targets::tar_make_clustermq(workers = 4)
广告 2
听起来 H2O 对象是 not exportable。目前,您需要手动保存这些文件,确定路径,然后在 tar_target()
中写入 format = "file"
。我愿意考虑基于 H20 的格式。 h2o.exportFile()
、h2o.importFile()
、h2o::h2o.saveModel()
和 h2o::h2o.loadModel()
是否以某种方式涵盖了所有对象,或者是否存在具有不同序列化功能的更多种类的对象? h2o
是否有像 keras
中的 serialize_model()
/unserialize_model()
那样在内存中执行此(反)序列化的实用程序?