获取 H2OFrame 作为对象而不是获取对 H2O 集群中某个位置的引用

Get H2OFrame as object instead of getting reference to a location in H2O cluster

我们使用 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])

第 2 步:将熊猫数据帧转换为 H2o 帧

 ToBeScored_hex = h2o.H2OFrame(ToBeScored)

第 3 步:运行 模型

 outPredections = rf_model.predict(ToBeScored_hex)

如果 H2OFrame 可以在步骤 2 中作为内存对象返回,则可以避免有状态的性质。有什么办法吗? 或者,是否可以将 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 而不是每次都生成一个新的 JVM?
问题 2:有没有办法通过 java 路径来避免 H2O 本地服务器初始化?除了查找 java 路径之外,还需要 H2OlocalServer 吗?如果无法避免,那么是否可以初始化本地服务器一次并将新请求定向到现有的 H2O 本地服务器,而不是启动新的 H2O 本地服务器?

另一种方法是在步骤 3 中使用 H2O MOJO model (instead of a binary model which needs to exist in H2O cluster memory to make predictions). MOJO models can sit on disk and do not require a running H2O cluster. Then you can skip Step 2 and use the h2o.mojo_predict_pandas() 函数。