如何在Java Application中运行H2O Deep Water TensorFlow MOJO?

时间:2017-08-22 11:52:30

标签: java tensorflow deep-learning h2o

我使用TensorFlow后端构建了 H2O深水模型(遵循Deep Water Booklet MNIST示例)。

(首先,我对H2O GBM模型做了同样的事情,以验证它在我的Java应用程序中没有深水依赖性的情况下工作。这很有效。)

我下载了Deep Water TensorFlow模型(我用Python构建):

modelfile = model.download_mojo(path="/h2o_testdata/generatedModels", get_genmodel_jar=True)

我认为这一步再次正常。现在,我想在我的Java应用程序中使用模型zip文件:

我在项目中添加了依赖项(h2o-genmodel.jar通过Maven和deepwater-all.jar通过复制和粘贴,因为我在Maven上找不到它)。 似乎我需要添加一些额外的依赖项或源代码来添加/应用TensorFlow'后端'(不知道'后端'在这里意味着什么,因为我只想在Java中进行推理,而不是模型训练)?< / strong>

我实例化模型:

EasyPredictModelWrapper model = new EasyPredictModelWrapper(MojoModel.load("src/main/resources/generatedModels/DeepWater_model_python_1503388273301_1.zip"));

以下是例外:

java.lang.UnsatisfiedLinkError: /private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66: dlopen(/private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66, 1): no suitable image found.  Did find:
    /private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
    /private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at deepwater.backends.tensorflow.LibraryLoader.loadNativeLib(LibraryLoader.java:87)
    at deepwater.backends.tensorflow.TensorflowBackend.<clinit>(TensorflowBackend.java:30)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at hex.genmodel.algos.deepwater.DeepwaterMojoModel.createDeepWaterBackend(DeepwaterMojoModel.java:96)
    at hex.genmodel.algos.deepwater.DeepwaterMojoReader.readModelData(DeepwaterMojoReader.java:31)
    at hex.genmodel.ModelMojoReader.readAll(ModelMojoReader.java:143)
    at hex.genmodel.ModelMojoReader.readFrom(ModelMojoReader.java:34)
    at hex.genmodel.MojoModel.load(MojoModel.java:35)
    at com.github.megachucky.kafka.streams.machinelearning.Kafka_Streams_Deep_Learning_H2O_MNIST.main(Kafka_Streams_Deep_Learning_H2O_MNIST.java:15)
Exception in thread "main" java.lang.UnsatisfiedLinkError: Cannot find TensorFlow native library for OS: darwin, architecture: x86_64. See https://github.com/tensorflow/tensorflow/tree/master/java/README.md for possible solutions (such as building the library from source).
    at org.tensorflow.NativeLibrary.load(NativeLibrary.java:66)
    at org.tensorflow.TensorFlow.init(TensorFlow.java:27)
    at org.tensorflow.TensorFlow.<clinit>(TensorFlow.java:31)
    at org.tensorflow.Graph.<clinit>(Graph.java:194)
    at deepwater.backends.tensorflow.models.ModelFactory.readMetaGraph(ModelFactory.java:143)
    at deepwater.backends.tensorflow.models.ModelFactory.LoadModelFromFile(ModelFactory.java:220)
    at deepwater.backends.tensorflow.TensorflowBackend.buildNet(TensorflowBackend.java:74)
    at hex.genmodel.algos.deepwater.DeepwaterMojoReader.readModelData(DeepwaterMojoReader.java:64)
    at hex.genmodel.ModelMojoReader.readAll(ModelMojoReader.java:143)
    at hex.genmodel.ModelMojoReader.readFrom(ModelMojoReader.java:34)
    at hex.genmodel.MojoModel.load(MojoModel.java:35)
    at com.github.megachucky.kafka.streams.machinelearning.Kafka_Streams_Deep_Learning_H2O_MNIST.main(Kafka_Streams_Deep_Learning_H2O_MNIST.java:15)

我找不到任何关于如何设置的文档,所以也许有人可以提供帮助? 或者我是否需要在笔记本电脑上安装TensorFlow,也可以在Java应用程序中显式使用?我认为H2O不需要它,因为它“只生成Java代码”,我可以在应用程序中使用它 - 类似于其他非DeepWater H2O模型?

顺便问一下:如何通过Maven依赖获得deepwater-all.jar?我找不到了。

2 个答案:

答案 0 :(得分:0)

我只能回答你的第二个问题。你永远不应该将.jars复制到Maven项目中。您需要install them to you local repository并将依赖项添加到您的pom.xml。 (您可以选择您想要的工件和组。框架的供应商将是一个不错的选择)

答案 1 :(得分:0)

您无法使用Maven h2o-genmodel.jar。您必须使用来自您正在使用的H2O的h2o-genmodel.jar。深水-all.jar也是如此。它必须来自同一个H2O。 deepwater-all.jar包含您需要的所有代码,包括后端。

由于您使用了参数get_genmodel_jar = True,因此您在mojo的同时下载了该参数。这是你必须使用的。