Deeplearning4j broken after upgrade to KNIME 3.5

When I open a workflow with Deeplearning4j nodes in it it first starts loading but then stop with an error displayed in the workflow window:

 

java.lang.ExceptionInInitializerError

 

If I try to open it again before closing KNIME I get this error:

 

java.lang.NoClassDefFoundError: Could not initialize class org.nd4j.linalg.factory.Nd4j

 

See below for the stack trace from knime.log which seems to hint to a memory issue. However I have knime set to 24GB and it stays below 4GB usage before the error even happens. There is also this part of the error:

ND4J is probably missing dependencies. For more information, please refer to: http://nd4j.org/getstarted.html

So how can this be solved?

 

2017-12-11 06:33:37,235 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.15GB/16.00GB)
2017-12-11 06:33:38,017 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:38,517 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:39,079 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:39,517 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:40,079 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:40,485 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:40,907 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:41,501 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:41,938 : DEBUG : Service Thread : MemoryAlertSystem :  :  : Memory usage below threshold (89%) after GC run, currently 1% (0.14GB/16.00GB)
2017-12-11 06:33:42,048 : ERROR : ModalContext : LoadWorkflowRunnable :  :  : Workflow could not be loaded. null
2017-12-11 06:33:42,048 : DEBUG : ModalContext : LoadWorkflowRunnable :  :  : Workflow could not be loaded. null
java.lang.ExceptionInInitializerError
    at org.nd4j.linalg.cpu.nativecpu.ops.NativeOpExecutioner.<init>(NativeOpExecutioner.java:53)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.nd4j.linalg.factory.Nd4j.initWithBackend(Nd4j.java:6185)
    at org.nd4j.linalg.factory.Nd4j.initContext(Nd4j.java:6087)
    at org.nd4j.linalg.factory.Nd4j.<clinit>(Nd4j.java:201)
    at org.deeplearning4j.util.ModelSerializer.restoreMultiLayerNetwork(ModelSerializer.java:188)
    at org.deeplearning4j.util.ModelSerializer.restoreMultiLayerNetwork(ModelSerializer.java:270)
    at org.knime.ext.dl4j.base.util.DLModelPortObjectUtils.loadPortFromZip(DLModelPortObjectUtils.java:256)
    at org.knime.ext.dl4j.base.DLModelPortObject.load(DLModelPortObject.java:120)
    at org.knime.core.node.port.AbstractPortObject$AbstractPortObjectSerializer.loadPortObject(AbstractPortObject.java:164)
    at org.knime.core.node.port.AbstractPortObject$AbstractPortObjectSerializer.loadPortObject(AbstractPortObject.java:1)
    at org.knime.core.node.FileNodePersistor.loadPortObject(FileNodePersistor.java:453)
    at org.knime.core.node.FileNodePersistor.loadPort(FileNodePersistor.java:377)
    at org.knime.core.node.FileNodePersistor.loadPorts(FileNodePersistor.java:333)
    at org.knime.core.node.FileNodePersistor.load(FileNodePersistor.java:1005)
    at org.knime.core.node.workflow.FileNativeNodeContainerPersistor.loadNCAndWashModelSettings(FileNativeNodeContainerPersistor.java:268)
    at org.knime.core.node.workflow.FileSingleNodeContainerPersistor.loadNodeContainer(FileSingleNodeContainerPersistor.java:267)
    at org.knime.core.node.workflow.WorkflowManager.postLoad(WorkflowManager.java:7855)
    at org.knime.core.node.workflow.WorkflowManager.loadContent(WorkflowManager.java:7746)
    at org.knime.core.node.workflow.WorkflowManager.postLoad(WorkflowManager.java:7871)
    at org.knime.core.node.workflow.WorkflowManager.loadContent(WorkflowManager.java:7746)
    at org.knime.core.node.workflow.WorkflowManager.load(WorkflowManager.java:7700)
    at org.knime.core.node.workflow.WorkflowManager.load(WorkflowManager.java:7621)
    at org.knime.core.node.workflow.WorkflowManager.load(WorkflowManager.java:7594)
    at org.knime.core.node.workflow.WorkflowManager.loadProject(WorkflowManager.java:7439)
    at org.knime.workbench.editor2.LoadWorkflowRunnable.run(LoadWorkflowRunnable.java:168)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:119)
Caused by: java.lang.RuntimeException: ND4J is probably missing dependencies. For more information, please refer to: http://nd4j.org/getstarted.html
    at org.nd4j.nativeblas.NativeOpsHolder.<init>(NativeOpsHolder.java:51)
    at org.nd4j.nativeblas.NativeOpsHolder.<clinit>(NativeOpsHolder.java:19)
    ... 31 more
Caused by: java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes = 8G > maxPhysicalBytes = 1G
    at org.bytedeco.javacpp.Pointer.deallocator(Pointer.java:576)
    at org.bytedeco.javacpp.Pointer.init(Pointer.java:121)
    at org.nd4j.nativeblas.Nd4jCpu$NativeOps.allocate(Native Method)
    at org.nd4j.nativeblas.Nd4jCpu$NativeOps.<init>(Nd4jCpu.java:65)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.nd4j.nativeblas.NativeOpsHolder.<init>(NativeOpsHolder.java:30)
    ... 32 more
2017-12-11 06:33:42,282 : DEBUG : main : WorkflowEditor :  :  : Disposing editor...

 

 

Hi beginner,

sorry for the problems. The log indeed indicates a memory issue, however it is not on the java side. DL4J uses off-heap memory to store all training related data. In KNIME 3.5 the size of this memory can be configured in the KNIME DL4J Integeration preference page. Here it is important that the java heap space + the off-heap memory value does not exceed the physical memory amount available. Increasing the off-heap memory limit to something like 5000mb should resolve the issue.

Cheers

David

Thanks Dave that indeed solved the issue.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.