如何正确管理Shiny App中的h2o实例

时间:2018-04-08 10:18:44

标签: r shiny shiny-server h2o

我正在构建一个闪亮的应用程序,使用h2o引擎对深度学习模型的数据进行评分。

我可以通过简单地将预测操作放入函数中来实现我的目标。在这个函数中,我通常会启动我的深度学习机,进行计算并停止它。不幸的是,这很慢。

我的目标是在用户从h2o启动shiny app时开始R-Server,然后在用户关闭时确保h2o虚拟机关闭浏览器。

我会建议最好的方法来做到这一点,因为我对here中的这个方法不完全满意,我只是把这些代码行放到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 个答案:

答案 0 :(得分:1)

当您收到错误“没有H2O实例正在运行”时,它确实意味着没有任何东西可以关闭,因此在您的情况下,这不是错误。当然,你应该通过登录你的R-Server来测试,当你得到错误检查h2o进程是否正在运行时:

ps -eaf | grep h2o

使用global.R的方法对于Shiny app来说是完全合法的。

更新: 请注意,如果您运行多个Shiny应用程序,每个应用程序可能会启动自己的h2o实例,或者它们可能共享同一个实例并遇到冲突。因此,请事先测试一下,不要遇到意外的冲突/错误/

答案 1 :(得分: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)
  })