【问题标题】:Picking up the h2o MOJO model (zip file) in a Spring boot App在 Spring Boot 应用程序中获取 h2o MOJO 模型(zip 文件)
【发布时间】:2017-09-24 17:22:00
【问题描述】:

我正在编写一个 Spring boot 应用程序(java 类),它调用另一个 java 类中的 H2o predict 方法。

我已经独立测试了这个 java 类,如果 MOJO 模型与调用 java 的位置相同,我可以读取它并且我可以做出预测。

使用 Spring boot 应用程序,这次我生成的 maven 项目编译的 jar 无法读取该 zip。 我使用 Wrapper h2o 提供的标准方式读取 MOJO zip 文件。

EasyPredictModelWrapper model = new EasyPredictModelWrapper(MojoModel.load("DRF_model_python_1504558159175_1.zip"));

我的 Maven 项目结构如下所示:

Spring boot App生成的jar包也包含如下所示的zip:

我不明白为什么它给了我找不到 MOJO zip 文件的错误(这是一个 IO 异常)。

File DRF_model_python_1504558159175_1.zip cannot be found.

我认为解决方案可能是: 1. 在 Maven pom 文件中添加一些内容,以便生成的 jar 知道从哪里获取模型。 或者 2. 如果 MojoModel.load 方法接受文件的路径而不仅仅是文件名。但我认为这行不通。

有什么想法吗?

【问题讨论】:

    标签: java maven spring-boot machine-learning h2o


    【解决方案1】:

    您需要更改在项目中加载 MOJO zip 文件的方式,而是需要从资源中将 MOJO 文件作为流加载。你可以关注这个example,在那里你可以看到如何将 MOJO 放入资源文件夹,然后调用 addMOJOsFromJARResource 来包含 MOJO。

    项目:https://github.com/h2oai/h2o-tutorials/tree/f67765bc6c68c2058d4b2786d1bbc627d3b70539/tutorials/hive_udf_template/hive_udf_mojo_template

    1. MOJO zip 存储在 src/main/resources/model
    2. 您需要参考下面的 h2o-genmodel 类来

    ```

     import hex.genmodel.MojoReaderBackendFactory;
     import static hex.genmodel.MojoReaderBackendFactory.CachingStrategy;
     import hex.genmodel.MojoReaderBackend;
     import hex.genmodel.ModelMojoReader;
    
    1. 这是包含所有 MOJO.zip 的功能(是的,您可以添加多个 MOJO)到您的项目中

    ```

      public void addMOJOsFromJARResource() {
          try {
            String[] mojo_names = this.getMOJONames();
            for (int i = 0; i < mojo_names.length; i++) {
                MojoReaderBackend reader =
                    MojoReaderBackendFactory.createReaderBackend(
                      getClass().getResourceAsStream(
                         "/models/"+mojo_names[i]), 
                          MojoReaderBackendFactory.CachingStrategy.MEMORY);
                MojoModel model = ModelMojoReader.readFrom(reader);
                this.addModel(model);
            }
           } catch (Exception e) {
             e.printStackTrace();
            throw new RuntimeException();
            }
        }
    

    ``` 这将起作用。

    【讨论】:

    • 我可以只在代码中使用 mojo 模型而不是下载它并再次阅读它以进行项目吗?我可以使用这样的假代码吗: Mojo mojo = h2o.getMojo(**);
    猜你喜欢
    • 2019-12-16
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2020-03-18
    • 1970-01-01
    • 2021-06-08
    • 2018-05-11
    相关资源
    最近更新 更多