openshift - 获取 H2OFrame 作为对象,而不是获取对 H2O 集群中某个位置的引用
问题描述
我们使用 H2O 库创建并训练了模型。在 OpenShift 容器中配置 H2O 并部署经过训练的模型以获得实时推理。当我们有一个容器时,它运行良好。我们必须扩大规模以应对交易量的增加。遇到了 H2OFrame 的状态性问题。请参阅我的示例代码。
步骤 1:将 JSON 字典转换为 Pandas 框架。
第 2 步:将 Pandas 框架转换为 H2O 框架。
步骤 3:以 H2O 框架作为输入运行模型。
这里第 2 步是返回存储在容器中的数据的句柄。“H2OFrame 类似于 pandas 的 DataFrame 或 R 的 data.frame。关键区别之一是数据通常不保存在内存中,而是位于(可能是远程的)H2O 集群上,因此 H2OFrame 仅代表一个处理该数据。” 所以 Step-3 的请求必须到同一个容器。如果不是,它无法找到 H2O 框架并引发错误。
步骤 1:使用 Pandas dataFrame 将 JSON 字典转换为数据框
ToBeScored = pd.DataFrame([jsonDictionary])
Step-2: 将 panda 数据帧转换为 H2o 帧
ToBeScored_hex = h2o.H2OFrame(ToBeScored)
第三步:运行模型
outPredections = rf_model.predict(ToBeScored_hex)
如果可以在步骤 2 中将 H2OFrame 作为内存对象返回,则可以避免有状态的性质。有什么办法吗?或者,是否可以将 H2O 集群配置为存储 H2OFrame,以便可以从集群中的任何 OpenShift 容器访问它?
有用的链接
H2O 的 Predict 函数只接受 H2OFrame 格式的数据。预测函数 - http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/model_categories.html#h2o.model.model_base.ModelBase.predict
H2O 帧数据类型 - http://docs.h2o .ai/h2o/latest-stable/h2o-py/docs/frame.html
于 2019 年 6 月 19 日更新@ErinLeDell 澄清的后续问题
我们已升级到 H2O 3.24 并使用 MOJO 模型。删除了第 2 步并用此函数调用替换了第 3 步。
import h2o as h
result = h.mojo_predict_csv(input_csv_path="PredictionDataRow.csv",mojo_zip_path="rf_model.zip",
genmodel_jar_path="h2o-genmodel.jar", java_options='-Xmx512m -XX:ReservedCodeCacheSize=256m', verbose=True)
在内部,它执行了以下命令,该命令初始化了一个新的 JVM,并为每次调用启动了 H2O 本地服务器。初始化 H2O 本地服务器以查找 java 的路径。
java = H2OLocalServer._find_java() // Find java path then creates below command line
C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe -Xmx512m -XX:ReservedCodeCacheSize=256m -cp h2o-genmodel.jar hex.genmodel.tools.PredictCsv --mojo C:\Users\admin\Documents\Code\python\rf_model.zip --input PredictionDataRow.csv --output C:\Users\admin\Documents\Code\python\prediction.csv --decimal
问题 1:有什么方法可以使用现有的 JVM,而不是总是为每个事务生成一个新的?
问题2:有没有办法通过java路径来避免H2O本地服务器初始化?除了查找 java 路径之外,是否需要 H2OLocalServer?如果无法避免,是否可以一次初始化本地服务器并将新请求定向到现有的 H2O 本地服务器而不是启动新的 H2O 本地服务器?
解决方案
另一种方法是使用 H2O MOJO模型(而不是需要存在于 H2O 集群内存中才能进行预测的二元模型)。MOJO 模型可以放在磁盘上,不需要运行 H2O 集群。然后您可以跳过第 2 步并在第 3 步中使用h2o.mojo_predict_pandas()函数。
推荐阅读
- android - Google Classroom API - 如何在检索课程列表时格式化 setFields 参数
- r - 如何使用条形图更改填充颜色
- android - 如何在 Android 的 Google 地图中绘制徒手多边形?
- ios - SwiftUI 误导性错误:“Int”不可转换为“CGFloat”
- django - Nginx 反向代理到 Django 接收“上游过早关闭的连接,同时从上游读取响应标头”
- shell - 如果通过自动化运行,kubectl exec into pod 导致每次都无法使用 TTY 错误
- html - Rmarkdown 无法编织成 pdf、work 或 html
- vscode-settings - 如何删除vscode右侧滚动条上的符号?
- ios - Swift 属性仅在存在 didSet 时正确设置(可以为空)
- sql - 如何使用queryBuilder修复“错误:预期文字,得到'SELECT'”?