我targets
用作 ML 项目的流水线工具H2O
。在这里使用 H2O 的主要独特之处在于它创建了一个新的“集群”(据我所知,基本上是一个新的本地进程/服务器,它通过 Rest API 进行通信)。
我遇到的问题有两个。
- 如何以智能方式停止/操作目标框架内的集群
- 如何在目标框架中保存和加载数据/模型
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)
在我的脚本末尾输出 a ,但这在这种情况下不起作用。或者,我想出了一个始终运行的新目标。
# 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 中的代码不会以正确的格式 ( )保存目标model
的数据。有时(我认为当集群重新启动时),数据会“无效”并且 h2o 会引发错误。R 会话中 h2o 格式的数据是指向 h2o 数据帧的指针(另请参见docs)。predict
format = "qs"
对于类似将模型存储在 R 之外的 keras,有选项,它在幕后format = "keras"
调用。同样,对于数据集和模型keras::save_model_hdf5()
,H2O 需要h2o::h2o.exportFile()
and (另见文档)。h2o::h2o.importFile()
h2o::h2o.saveModel()
h2o::h2o.loadModel()
有没有办法创建其他格式tar_targets
或者我需要将数据写入文件并返回文件?_targets
如果我没记错的话,这样做的缺点是该文件位于文件夹系统之外。