Nd4j (Deeplearning4J) 是否太大而无法在 android 移动应用程序中实际使用?

Is Nd4j (Deeplearning4J) too large to actually use in an android mobile app?

经过数周的开发,我终于在 Android 应用程序中创建了一个 AI,该应用程序使用 Nd4j 库提供的矩阵操作 API。这些已通过 gradle、following this documentation.

导入到项目中

不幸的是,我发现 Nd4j 依赖于一些非常大的 运行 时间库,尤其是 libnd4jcpu.so,这是关于 150mb 每个 abi 平台,导致 apk 大小超过 0.5 GB!您在 Google Play 商店中找到的平均应用大小约为 11.5MB。

The compressed download size limit of Android App Bundles on Google Play is 150MB.

a previous Whosebug question. No solution could be offered however, except just to be more selective about what platforms you support 中提出了如何减小 Dl4j 依赖项大小的问题。同样,对于每个 abi 平台,这仍然意味着最小 APK 大小至少为 ~200MB。

有人想知道为什么 Deeplearning4J 社区一开始就努力支持 Android 移动开发,为什么 运行time library dependency sizes 这个不可避免的问题没有解决与文档中任何地方提到的一样多。

我肯定遗漏了什么?

“Nd4j”实际上是库 + 自包含的 c++ 库,编译为每个平台的本机二进制文件,捆绑到 jar 中以实现快速性能。您通常希望在构建中去除这些依赖项。您可以在此处查看操作方法:

https://github.com/bytedeco/javacpp-presets/wiki/Reducing-the-Number-of-Dependencies

Nd4j依赖javacpp进行打包。简而言之,如果您使用 nd4j-native-platform,您可以在 maven/gradle 构建中指定 -Dplatform=android-x86_64 或 android-arm64(取决于架构),或者您可以只使用nd4j-native 依赖项(无分类器)+ 适用于您平台的分类器。

编辑我的回复有点抱歉,今天早上我没有时间完整阅读您的问题。让我逐点回答。

首先:“有人想知道为什么 Deeplearning4J 社区一开始就致力于支持 Android 移动开发......”

  1. 首先,公平点,我想在这方面努力。在这里与我们合作时请保持开放的态度。一般来说,人们有特定的要求,并根据他们的具体情况与我们合作。有时我们通过#2 帮助他们最小化二进制大小。

  2. 关于此:“尤其是 libnd4jcpu.so,每个 abi 平台大约 150mb,”因为人们通常会使用不同的应用程序。 诚然,我们更关注操作覆盖率而不是二进制大小。我们有一个 minifier 可以提供帮助:https://github.com/eclipse/deeplearning4j/tree/master/libnd4j/minifier 如果您能更具体一点,我很乐意帮助您处理用例,但这并不是一种“只需阅读文档并自行解决”的体验.

我肯定遗漏了什么?

如果有人偶然读到这篇文章会面临与我相同的情况:我已经切换到新的 org.jetbrains.kotlinx Multik library,它提供了我需要 nd4j 的相同基本 NDArray 操作。使用应用程序对其进行测试后,它几乎没有增加任何大小,但功能有所减少,例如,到目前为止,您还不能使用 Multik 反转矩阵。