deepjavalibrary / djl-demo

Demo applications showcasing DJL
https://demo.djl.ai
Apache License 2.0
298 stars 121 forks source link

Build on Apple Silicon is downloading the wrong library #439

Closed sharathcshekhar closed 1 month ago

sharathcshekhar commented 3 months ago

I am trying to runt he demos on Mac M2 and the build script is downloading the wrong libraries.

file $JAVA_HOME/bin/java
~/Library/Java/JavaVirtualMachines/corretto-17.0.10-1/Contents/Home/bin/java: Mach-O 64-bit executable arm64

JAVA_HOME is correctly to set to a ARM64 JDK as it is seen from the file description above. But when I run gradle, it is downloading tensorflow libraries build for x86-64.

(base) 2033000768:pneumonia-detection$ ./gradlew run

> Task :run
[main] INFO com.examples.PneumoniaDetection - Input image not specified, using image:
        https://djl-ai.s3.amazonaws.com/resources/images/chest_xray.jpg
Exception in thread "main" ai.djl.engine.EngineException: Failed to load TensorFlow native library
        at ai.djl.tensorflow.engine.TfEngine.newInstance(TfEngine.java:75)
        at ai.djl.tensorflow.engine.TfEngineProvider.getEngine(TfEngineProvider.java:41)
        at ai.djl.engine.Engine.getEngine(Engine.java:190)
        at ai.djl.Model.newInstance(Model.java:99)
        at ai.djl.repository.zoo.BaseModelLoader.createModel(BaseModelLoader.java:196)
        at ai.djl.repository.zoo.BaseModelLoader.loadModel(BaseModelLoader.java:159)
        at ai.djl.repository.zoo.Criteria.loadModel(Criteria.java:172)
        at com.examples.PneumoniaDetection.main(PneumoniaDetection.java:81)
Caused by: java.lang.UnsatisfiedLinkError: no jnitensorflow in java.library.path: /Users/xxx/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2434)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818)
        at java.base/java.lang.System.loadLibrary(System.java:1993)
        at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1832)
        at org.bytedeco.javacpp.Loader.load(Loader.java:1423)
        at org.bytedeco.javacpp.Loader.load(Loader.java:1234)
        at org.bytedeco.javacpp.Loader.load(Loader.java:1210)
        at org.tensorflow.internal.c_api.global.tensorflow.<clinit>(tensorflow.java:12)
        at org.tensorflow.internal.c_api.AbstractTFE_ContextOptions.newContextOptions(AbstractTFE_ContextOptions.java:51)
        at ai.djl.tensorflow.engine.javacpp.JavacppUtils.createEagerSession(JavacppUtils.java:210)
        at ai.djl.tensorflow.engine.TfEngine.newInstance(TfEngine.java:56)
        ... 7 more
Caused by: java.lang.UnsatisfiedLinkError: ~/.djl.ai/tensorflow/2.10.1-cpu-osx-aarch64/libjnitensorflow.dylib: dlopen(~.djl.ai/tensorflow/2.10.1-cpu-osx-aarch64/libjnitensorflow.dylib, 0x0001): tried: '~/.djl.ai/tensorflow/2.10.1-cpu-osx-aarch64/libjnitensorflow.dylib' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/xxx/.djl.ai/tensorflow/2.10.1-cpu-osx-aarch64/libjnitensorflow.dylib' (no such file), '/Users/xxx.djl.ai/tensorflow/2.10.1-cpu-osx-aarch64/libjnitensorflow.dylib' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64'))
        at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
        at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:388)
        at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:232)
        at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:174)
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2394)
        at java.base/java.lang.Runtime.load0(Runtime.java:755)
        at java.base/java.lang.System.load(System.java:1957)
        at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1779)

Although the path into which the library is downloading to indicated it is aarch64, the dylib itself is x86-64.

file ~/.djl.ai/tensorflow/2.10.1-cpu-osx-aarch64/libjnitensorflow.dylib
/Users/xxx/.djl.ai/tensorflow/2.10.1-cpu-osx-aarch64/libjnitensorflow.dylib: Mach-O 64-bit dynamically linked shared library x86_64

Appreciate any suggestions for fixing this. Thanks.

frankfliu commented 1 month ago

tensorflow doesn't support mac M1 machine. I created a PR to avoid running this demo on mac M1 machine: https://github.com/deepjavalibrary/djl-demo/pull/457