H2O «Сетка: невозможно добавить новые модели в сетку с другим вводом обучения» ошибка при распараллеливании выполнения autoML в цикле foreach - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь распараллелить обучение нескольких моделей ML, используя функцию autoML, предоставляемую H2O. Основной код, который я использую, следующий:

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 of function: grid: Невозможно добавить новые модели в сетку с разными тренировочными входами

Я предполагаю, что сетки используются во время фазы autoML, поэтому я попытался найти параметр для передачи grid_id, как я могу сделать в функции h2o.grid, следующим образом:

grid <- h2o.grid(“gbm”,  grid_id = paste0(“gbm_grid_id”, div),
                 ...)

но я не могу найти способ сделать это. Используемая версия пакета H2O - 3.24.0.2.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Короткий ответ на этот вопрос заключается в том, что вы не можете использовать разные рамки обучения в одной сетке.Каждая сетка моделей должна быть связана с одним обучающим набором (идея состоит в том, что вы не хотите сравнивать модели, обученные на разных обучающих наборах).Вот почему вы попали в ошибку.Похоже, что каждый из ваших df.h2o обучающих фреймов - это разные подмножества исходного df фрейма.

Еще одно замечание: параллельная функциональность H2O и R плохо сочетается.Обучение модели H2O уже распараллелено, но другим способом (по причинам масштабируемости).Обучение одной модели распараллелено в H2O (на нескольких ядрах), но H2O не предназначено для обучения нескольких моделей одновременно.Если вы хотите обучить несколько моделей одновременно на одном компьютере, вам придется запустить несколько кластеров H2O в разных сеансах R на разных портах.

0 голосов
/ 09 июля 2019

Возможно также, что вы дважды открываете один и тот же сеанс Н2О на одном и том же IP-адресе, с различными данными обучения, и Н2О запутывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...