无法在 docker 容器中初始化 class org.nd4j.linalg.factory.Nd4j

Could not initialize class org.nd4j.linalg.factory.Nd4j in docker container

我正在尝试使用具有以下 java 代码示例的程序在 docker 容器中导入 KERAS 文件:

String weights = getFile(_modelFile).getAbsolutePath();
String modelConfiguration = getFile(_configFile).getAbsolutePath();
_model = KerasModelImport.importKerasSequentialModelAndWeights(modelConfiguration, weights);

我将 Docker 与 WSL2 一起使用,docker 容器具有以下 OS:

如果我 运行 WSL2 中的程序它工作正常,但是如果我 运行 它在 docker 容器中我得到以下错误:

2022-01-11 09:34:36,124 [ListenerHTTP-46 ] WARN xpto.jaf.protocols.json.JSONServlet JAF_G1000 [] - xpto.jaf.JafError: Failed to invoke operation method - java.lang.NoClassDefFoundError - java.lang.NoClassDefFoundError: Could not initialize class org.nd4j.linalg.factory.Nd4j at xpto.jaf.services.operations.MethodOperationManager$JavaMethodOperation.execute(MethodOperationManager.java:851) at xpto.jaf.services.operations.WrappedOperation.execute(WrappedOperation.java:141) at xpto.jaf.services.sessions.SessionBase.execute(SessionBase.java:263) at xpto.jaf.protocols.json.JSONServlet.processOperation(JSONServlet.java:217) at xpto.jaf.protocols.json.JSONServlet.doPost(JSONServlet.java:161) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:713) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1435) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1350) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:516) at org.eclipse.jetty.server.HttpChannel.lambda$handle(HttpChannel.java:388) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) at org.eclipse.jetty.io.ChannelEndPoint.run(ChannelEndPoint.java:104) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:383) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:882) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1036) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.nd4j.linalg.factory.Nd4j at org.deeplearning4j.nn.modelimport.keras.Hdf5Archive.readDataSet(Hdf5Archive.java:295) at org.deeplearning4j.nn.modelimport.keras.Hdf5Archive.readDataSet(Hdf5Archive.java:109) at org.deeplearning4j.nn.modelimport.keras.utils.KerasModelUtils.importWeights(KerasModelUtils.java:284) at org.deeplearning4j.nn.modelimport.keras.KerasSequentialModel.(KerasSequentialModel.java:151) at org.deeplearning4j.nn.modelimport.keras.KerasSequentialModel.(KerasSequentialModel.java:57) at org.deeplearning4j.nn.modelimport.keras.utils.KerasModelBuilder.buildSequential(KerasModelBuilder.java:326) at org.deeplearning4j.nn.modelimport.keras.KerasModelImport.importKerasSequentialModelAndWeights(KerasModelImport.java:296) at xpto.ml.model.ModelH5.getModel(ModelH5.java:327) at xpto.ml.model.ModelH5.validateH5Files(ModelH5.java:238) at xpto.ml.operations.H5Operations.validateH5Model(H5Operations.java:53) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at xpto.jaf.services.operations.MethodOperationManager$JavaMethodOperation.execute(MethodOperationManager.java:841) ... 36 common frames omitted

Nd4j 是一个 Dl4j 依赖项,它存在于两次执行中,这让我认为问题可能出在 Docker 本身或 OS 上的 docker 容器。

希望已经很好地解释了我的问题。提前致谢。

编辑:Dl4j 和 Nd4j 的两个版本都是 1.0.0-M1.1

这仍然没有显示原因。 NoClassDeffFoundErrors 通常与冲突的依赖关系有关。 您的类路径上可能有不同版本的 dl4j/nd4j 但我对此表示怀疑。大多数情况下,这是本机依赖项崩溃的副作用。

这里要注意:

我不会推荐 运行 keras 转换器(或任何模型导入过程)。我建议单独转换模型。 这主要是出于性能原因

无论你的问题是什么,通常有几个:

  1. 带有 hdf5 的 glibc 版本。 Keras import 在底层使用 hdf5,这意味着 c 代码。

  2. Nd4j 原生依赖崩溃:这通常也与 glibc 相关。我们将 nd4j 加载到内存中以创建和设置本机数组(这意味着更多 java 调用 c++)然后可以根据 OS 你 运行 在

  3. 另一个 hdf5 错误:这可能是无效模型或某些 hdf5 版本错误。

无论如何,我们需要更多信息才能帮助您。无论您在此处报告什么都不够。您能否提及您的 docker 容器 OS 以及此处捆绑的 dl4j/nd4j 版本?

编辑:我看到它是 oracle linux 7,实际上是 RHEL/Centos。如果您使用的是 docker,我可能会推荐更新的图片。

除此之外,如果它是 nd4j 相关的崩溃(仍然无法从您的堆栈跟踪中验证),如果您使用的是最新版本,您可能会看到由于 glibc 版本而导致的崩溃。

如果是的话,您可以在此处找到 nd4j 分类器的最新更新:https://repo1.maven.org/maven2/org/nd4j/nd4j-native/1.0.0-M1.1/

较旧的 glibcs​​ 需要使用 linux-x86_64-compat 作为迁移路径