在 Spring 启动应用程序中获取 h2o MOJO 模型(zip 文件)
Picking up the h2o MOJO model (zip file) in a Spring boot App
我正在编写一个 Spring 启动应用程序 (java class),它调用另一个 java class 中的 H2o 预测方法。
我已经独立测试了这个 java class,如果 MOJO 模型与调用 java 的位置相同,我可以读取它并且我可以做出预测。
使用Spring启动应用程序,这次我的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 方法接受文件路径而不仅仅是文件名。但是我觉得这样不行。
有什么想法吗?
您需要更改在项目中加载 MOJO zip 文件的方式,而是需要从资源中以流的形式加载 MOJO 文件。您可以按照此 example 了解如何将 MOJO 放入资源文件夹,然后调用 addMOJOsFromJARResource 以包含 MOJO。
- MOJO zip 存储在 src/main/resources/model
- 您需要参考下面的 h2o-genmodel 类 到
```
import hex.genmodel.MojoReaderBackendFactory;
import static hex.genmodel.MojoReaderBackendFactory.CachingStrategy;
import hex.genmodel.MojoReaderBackend;
import hex.genmodel.ModelMojoReader;
- 这是将所有 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();
}
}
```
这会起作用。
我正在编写一个 Spring 启动应用程序 (java class),它调用另一个 java class 中的 H2o 预测方法。
我已经独立测试了这个 java class,如果 MOJO 模型与调用 java 的位置相同,我可以读取它并且我可以做出预测。
使用Spring启动应用程序,这次我的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 方法接受文件路径而不仅仅是文件名。但是我觉得这样不行。
有什么想法吗?
您需要更改在项目中加载 MOJO zip 文件的方式,而是需要从资源中以流的形式加载 MOJO 文件。您可以按照此 example 了解如何将 MOJO 放入资源文件夹,然后调用 addMOJOsFromJARResource 以包含 MOJO。
- MOJO zip 存储在 src/main/resources/model
- 您需要参考下面的 h2o-genmodel 类 到
```
import hex.genmodel.MojoReaderBackendFactory;
import static hex.genmodel.MojoReaderBackendFactory.CachingStrategy;
import hex.genmodel.MojoReaderBackend;
import hex.genmodel.ModelMojoReader;
- 这是将所有 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();
}
}
``` 这会起作用。