我的目标是导出一个使用 scala(使用苏打水)在 spark 上训练的 h2o 模型,这样我就可以在没有 Spark 的应用程序中导入它。
因此:
- 使用 scala(文档仅显示 r 和 python 的示例)
- 导出使用苏打水(带火花的水)构建的模型
- 在 scala 中导入模型(没有 spark 也没有 h2o 集群,只有
hex-genmodel
包)
因此,我使用ModelSerializationSupport
to export 和MojoModel.load
to import
val gbmParams = new GBMParameters()
gbmParams._train = train
gbmParams._response_column = "target"
gbmParams._ntrees = 5
gbmParams._valid = valid
gbmParams._nfolds = 3
gbmParams._min_rows = 1
gbmParams._distribution = DistributionFamily.multinomial
val gbm = new GBM(gbmParams)
val gbmModel = gbm.trainModel.get
val mojoPath = "./model.zip"
ModelSerializationSupport.exportMOJOModel(gbmModel, new File(mojoPath).toURI, force = true)
val simpleModel = new EasyPredictModelWrapper(MojoModel.load(mojoPath))
失败
error in opening zip file
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:220)
at java.util.zip.ZipFile.<init>(ZipFile.java:150)
at java.util.zip.ZipFile.<init>(ZipFile.java:121)
at hex.genmodel.ZipfileMojoReaderBackend.<init>(ZipfileMojoReaderBackend.java:13)
at hex.genmodel.MojoModel.load(MojoModel.java:33)
...
似乎 mojo 导出器没有使用与hex.genmodel
(显然是 zip)中预期的格式相同的格式
在 h2o 2.1.23 上运行(构建集群时 2.1.24 失败,如https://0xdata.atlassian.net/browse/SW-776上所报告)和 spark 2.1
- 更新:
使用 ModelSerializationSupport 类加载它自己的导出也失败了,同样的例外:
ModelSerializationSupport.loadMOJOModel(new File(mojoPath).toURI)
H2OModel 导出和加载
作为 H2OModel 加载回来(因此使用苏打水)确实有效:
val h2oModelPath = "./model_h2o"
ModelSerializationSupport.exportH2OModel(gbmModel, new File(h2oModelPath).toURI, force = true)
val loadedModel: GBMModel = ModelSerializationSupport.loadH2OModel(new File(h2oModelPath).toURI)
H2OMOJOModel 导出和加载
加载它H2OMOJOModel
确实有效(从实现中复制H2OGBM
):
val mojoModel = new H2OMOJOModel(ModelSerializationSupport.getMojoData(gbmModel))
mojoModel.write.overwrite.save(mojoPath)
H2OMOJOModel.load(mojoPath)
使用 MojoModel 导入的 H2OGBM 导出
尝试使用常规导入MojoModel
失败:
val gbm = new H2OGBM(gbmParams)(h2oContext, myspark.sqlContext)
val gbmModel = gbm.trainModel(gbmParams)
val mojoPath = "./models.zip"
gbmModel.write.overwrite.save(mojoPath)
MojoModel.load(mojoPath)
除了以下例外:
./models.zip/model.ini (No such file or directory)
java.io.FileNotFoundException: ./models.zip/model.ini (No such file or directory)