Как правильно управлять экземпляром h2o в приложении Shiny

avatar
vlad1490
8 апреля 2018 в 10:18
767
2
3

Я создаю блестящее приложение, которое оценивает данные модели глубокого обучения, используя механизм h2o.

Я мог бы достичь своей цели, просто поместив операцию прогнозирования в функцию. В этой функции я обычно запускаю свою машину глубокого обучения, делаю вычисления и останавливаю ее. К сожалению, это медленно.

Моя цель — запустить h2o в самом начале, когда пользователь запустит shiny app из R-Server, а затем убедиться, что виртуальная машина h2o отключится, когда пользователь закроет браузер.

Я хотел бы предложить наиболее оптимальный способ сделать это, потому что я не полностью удовлетворен этим методом, взятым из здесь, где я только что поместил эти строки кода в скрипт global.R:

#global.R
library(h2o)
h2o.init(nthreads = 2)
onStop(function() {
  # shut down the h2o on app exit see 
  h2o.shutdown(prompt = FALSE)
})

Похоже, что иногда мой экземпляр h2o останавливался раньше, так как я получал сообщение об ошибке Error in h2o.shutdown(prompt = FALSE) : There is no H2O instance running.

... Сейчас тестирую в браузере, но хочу убедиться, что на R-Server не будет никаких последствий

Любая помощь приветствуется!

Источник

Ответы (2)

avatar
Javier Recasens
4 июня 2018 в 19:51
1

Вы можете попробовать использовать try-catch, чтобы предотвратить это сообщение об ошибке. Вот как я инициализирую с моей локальной машины:

  # Try to connect to existing cluster. If it does not exist then initialize.
  errorStatus <- tryCatch({
    h2o.init(startH2O = FALSE)
  }, error = function(err) {
    errorStatus <- err[1]$message
    message(paste0(errorStatus,"\n Initializing new H2O cluster..."))
    # Inititialize H2o cluster
    try({h2o.shutdown(prompt = FALSE)}, silent=TRUE)
    h2o.init(ip = 'localhost', port = 54321, nthreads= -1, max_mem_size = '4g')
    return(errorStatus)
  }) # END tryCatch

  # Shut down H2O cluster on app exit
  onStop(function() {
    try({h2o.shutdown(prompt = FALSE)}, silent=TRUE)
  })
avatar
topchef
8 апреля 2018 в 19:06
1

Когда вы получаете сообщение об ошибке «Нет запущенного экземпляра H2O», это действительно означает, что нечего отключать, поэтому в вашем случае это не ошибка. Конечно, вы должны проверить это, войдя на свой R-сервер и когда вы получите сообщение об ошибке, проверив, запущен ли процесс h2o или нет:

ps -eaf | grep h2o

Метод с использованием global.R полностью допустим для приложения Shiny.

ОБНОВЛЕНИЕ: Имейте в виду, что если вы запустите несколько приложений Shiny, каждое из них может запустить свой собственный экземпляр h2o, или они могут использовать один и тот же экземпляр и столкнуться с конфликтами. Поэтому проверьте это заранее, чтобы не столкнуться с неожиданными конфликтами/ошибками/

.
vlad1490
8 апреля 2018 в 21:18
1

Большое спасибо. Мне просто нужно будет сделать функцию более «отказоустойчивой» внутри блестящей