我正在尝试使用H2O提供的autoML功能来并行化多个ML模型的训练。我正在使用的核心代码如下:
library(foreach)
library(doParallel)
project_folder <- "/home/user/Documents/"
ncores <- parallel::detectCores(logical = FALSE)
nlogiccpu <- parallel::detectCores()
max_mem_size <- "4G"
cl<-makeCluster(nlogiccpu)
registerDoParallel(cl)
df4 <-foreach(i = as.numeric(seq(1,length(divisions))), .combine=rbind) %dopar% {
library(dplyr)
library(h2o)
h2o.init(nthreads = ncores, max_mem_size = max_mem_size)
div <- divisions[i]
df.h2o <- as.h2o(
df %>% filter(code == div) )
y <- "TARGET"
x <- names(df.train.x.discretized)
automl.models.h2o <- h2o.automl(
x = x,
y = y,
training_frame = df.h2o,
nfolds = 10,
seed = 111,
project_name = paste0("PRJ_", div)
)
leader <- automl.models.h2o@leader
div_folder <- file.path(project_folder, paste0("Division_", div))
h2o.saveModel(leader,
path = file.path(div_folder, "TARGET_model_bin"))
...
}
仅对所有模型的一部分进行了训练并将其保存在其文件夹中,因为有时会出现以下错误:
water.exceptions.H2OIllegalArgumentException:非法参数: 函数的training_frame:网格:无法将新模型附加到网格 具有不同的训练输入
我想在autoML阶段使用了网格,所以我试图找到一个参数来传递grid_id
,就像在h2o.grid
函数中所做的那样,如下所示:
grid <- h2o.grid(“gbm”, grid_id = paste0(“gbm_grid_id”, div),
...)
但是我找不到做到这一点的方法。 我正在使用的H2O软件包版本是3.2.4.0.2。
有什么建议吗?
答案 0 :(得分:1)
这个问题的简短答案是,您不能在单个网格中使用不同的训练框架。每个模型网格都必须与一个训练集相关联(想法是您不想比较在不同训练集上训练的模型)。这就是为什么您遇到错误。看来您的每个df.h2o
训练帧都是原始df
帧的不同子集。
另一个说明:H2O和R的并行功能不能很好地混合使用。 H2O模型训练已经并行化,但是采用了不同的方式(出于可伸缩性原因)。单个模型的训练在H2O中(在多个内核上)并行进行,但是H2O并非旨在一次训练多个模型。如果要在一台机器上一次训练多个模型,则必须在不同端口上的不同R会话中启动多个H2O群集。
答案 1 :(得分:0)
也可能是您在相同的IP上两次打开相同的h2o会话,使用了不同的训练数据,并且h2o感到困惑。
答案 2 :(得分:0)
h2o.shutdown() 有时该会话使用两个训练数据集运行两次