R мишени с H2O

я использую targets как конвейерный инструмент для проекта машинного обучения с H2O. Основная уникальность использования H2O здесь заключается в том, что он создает новый «кластер» (в основном новый локальный процесс / сервер, который общается через Rest API, насколько я понимаю).

У меня возникает двоякая проблема.

  1. Как я могу остановить / управлять кластером в рамках целевой структуры разумным способом
  2. Как я могу сохранить и загрузить данные / модели в рамках целевой структуры

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 не сохраняет данные для целей model а также predict в правильном формате ( format = "qs"). Иногда (я думаю, когда кластер перезапускается или около того) данные становятся «недействительными», и h2o выдает ошибку. Данные в формате h2o в сеансе R являются указателем на фрейм данных h2o (см. Также документы).

Для keras, в котором аналогично хранятся модели вне R, есть опция format = "keras", который вызывает keras::save_model_hdf5()за кулисами. Точно так же H2O потребует h2o::h2o.exportFile() а также h2o::h2o.importFile() для набора данных и h2o::h2o.saveModel() а также h2o::h2o.loadModel()для моделей (см. также документацию).

Есть ли способ создать дополнительные форматы для tar_targetsили мне нужно записать данные в файл и вернуть файл? Обратной стороной этого является то, что этот файл находится за пределами _targets система папок, если не ошибаюсь.

1 ответ

Решение

Объявление 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 не экспортируются . В настоящее время вам нужно сохранить эти файлы вручную, определить пути и написать format = "file" в tar_target(). Я готов рассмотреть форматы на основе H20. Все ли объекты каким-либо образом покрыты h2o.exportFile(), h2o.importFile(), h2o::h2o.saveModel(), а также h2o::h2o.loadModel(), или есть другие типы объектов с разными функциями сериализации? И делает h2o есть утилиты для выполнения этой (де) сериализации в памяти, например serialize_model()/ unserialize_model() в keras?

Другие вопросы по тегам