首页 > 解决方案 > 获取 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 本地服务器?

标签: openshifth2o

解决方案


另一种方法是使用 H2O MOJO模型(而不是需要存在于 H2O 集群内存中才能进行预测的二元模型)。MOJO 模型可以放在磁盘上,不需要运行 H2O 集群。然后您可以跳过第 2 步并在第 3 步中使用h2o.mojo_predict_pandas()函数。


推荐阅读