R мишени с H2O
я использую targets
как конвейерный инструмент для проекта машинного обучения с 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)
в конце моего сценария, но в данном случае это не работает. В качестве альтернативы я придумал новую цель, которая всегда выполняется.
# 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
?