deepjavalibrary / djl

An Engine-Agnostic Deep Learning Framework in Java
https://djl.ai
Apache License 2.0
4.12k stars 654 forks source link

Reinforcement learning engine for Android #2297

Open horato opened 1 year ago

horato commented 1 year ago

Hi, Is there any engine available that can process Q-Learning algo on android? PyTorch doesn't seem to work. Is MXNet a viable choice?

Thanks

frankfliu commented 1 year ago

DJL doesn't support training on Android. You need build MXNet android binary for latest version. You can following this demo if you want to build MXNet 1.8.0 for android: https://github.com/deepjavalibrary/djl-demo/tree/master/android/mxnet-android

horato commented 1 year ago

Doesn't seem to work even with the sample application. dlopen failed: library "libdl.so.2" not found: needed by /data/data/ai.djl.examples.mxnet_android_template/files/mxnet/1.9.1-mkl-linux-x86_64/libmxnet.so in namespace classloader-namespace I used the precompiled libmxnet.so for x86_64


    Process: ai.djl.examples.mxnet_android_template, PID: 4523
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$4.done(AsyncTask.java:415)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:920)
     Caused by: ai.djl.engine.EngineException: Failed to load MXNet native library
        at ai.djl.mxnet.engine.MxEngine.newInstance(MxEngine.java:78)
        at ai.djl.mxnet.engine.MxEngineProvider.getEngine(MxEngineProvider.java:40)
        at ai.djl.engine.Engine.getEngine(Engine.java:186)
        at ai.djl.Model.newInstance(Model.java:99)
        at ai.djl.repository.zoo.BaseModelLoader.createModel(BaseModelLoader.java:189)
        at ai.djl.repository.zoo.BaseModelLoader.loadModel(BaseModelLoader.java:152)
        at ai.djl.repository.zoo.Criteria.loadModel(Criteria.java:168)
        at ai.djl.repository.zoo.ModelZoo.loadModel(ModelZoo.java:141)
        at ai.djl.examples.MainActivity$LoadModel.doInBackground(MainActivity.java:94)
        at ai.djl.examples.MainActivity$LoadModel.doInBackground(MainActivity.java:76)
        at android.os.AsyncTask$3.call(AsyncTask.java:394)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:920) 
     Caused by: java.lang.NoClassDefFoundError: ai.djl.mxnet.jna.JnaUtils
        at ai.djl.mxnet.jna.JnaUtils.getAllOpNames(JnaUtils.java:90)
        at ai.djl.mxnet.engine.MxEngine.newInstance(MxEngine.java:54)
        at ai.djl.mxnet.engine.MxEngineProvider.getEngine(MxEngineProvider.java:40) 
        at ai.djl.engine.Engine.getEngine(Engine.java:186) 
        at ai.djl.Model.newInstance(Model.java:99) 
        at ai.djl.repository.zoo.BaseModelLoader.createModel(BaseModelLoader.java:189) 
        at ai.djl.repository.zoo.BaseModelLoader.loadModel(BaseModelLoader.java:152) 
        at ai.djl.repository.zoo.Criteria.loadModel(Criteria.java:168) 
        at ai.djl.repository.zoo.ModelZoo.loadModel(ModelZoo.java:141) 
        at ai.djl.examples.MainActivity$LoadModel.doInBackground(MainActivity.java:94) 
        at ai.djl.examples.MainActivity$LoadModel.doInBackground(MainActivity.java:76) 
        at android.os.AsyncTask$3.call(AsyncTask.java:394) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:920) 
     Caused by: java.lang.UnsatisfiedLinkError: Unable to load library '/data/user/0/ai.djl.examples.mxnet_android_template/files/mxnet/1.9.1-mkl-linux-x86_64/libmxnet.so':
    dlopen failed: library "libdl.so.2" not found: needed by /data/data/ai.djl.examples.mxnet_android_template/files/mxnet/1.9.1-mkl-linux-x86_64/libmxnet.so in namespace classloader-namespace
    dlopen failed: library "libdl.so.2" not found: needed by /data/data/ai.djl.examples.mxnet_android_template/files/mxnet/1.9.1-mkl-linux-x86_64/libmxnet.so in namespace classloader-namespace
    Directory separator should not appear in library name: /data/user/0/ai.djl.examples.mxnet_android_template/files/mxnet/1.9.1-mkl-linux-x86_64/libmxnet.so
    Native library (data/user/0/ai.djl.examples.mxnet_android_template/files/mxnet/1.9.1-mkl-linux-x86_64/libmxnet.so) not found in resource path (.)
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:302)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:455)
        at com.sun.jna.Library$Handler.<init>(Library.java:192)
        at com.sun.jna.Native.load(Native.java:596)
        at ai.djl.mxnet.jna.LibUtils.loadLibrary(LibUtils.java:74)
        at ai.djl.mxnet.jna.JnaUtils.<clinit>(JnaUtils.java:71)
        at ai.djl.mxnet.jna.JnaUtils.getAllOpNames(JnaUtils.java:90)
        at ai.djl.mxnet.engine.MxEngine.newInstance(MxEngine.java:54)
        at ai.djl.mxnet.engine.MxEngineProvider.getEngine(MxEngineProvider.java:40)
        at ai.djl.engine.Engine.getEngine(Engine.java:186)
        at ai.djl.Model.newInstance(Model.java:99)
        at ai.djl.repository.zoo.BaseModelLoader.createModel(BaseModelLoader.java:189)
        at ai.djl.repository.zoo.BaseModelLoader.loadModel(BaseModelLoader.java:152)
        at ai.djl.repository.zoo.Criteria.loadModel(Criteria.java:168)
        at ai.djl.repository.zoo.ModelZoo.loadModel(ModelZoo.java:141)
        at ai.djl.examples.MainActivity.onCreate(MainActivity.java:57)
        at android.app.Activity.performCreate(Activity.java:8051)
        at android.app.Activity.performCreate(Activity.java:8031)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)```
lanking520 commented 1 year ago

Currently we don't have a training framework setup on Android device, way too heavy to operate there. Just inference support. If you plan to run training, you could cross compile MXNet on ARM that meets your arch and use DJL to run training job