1

经过几周的开发,我终于在一个使用 Nd4j 库提供的矩阵操作 API 的 Android 应用程序中创建了一个 AI。这些是按照本文档使用 gradle 导入到项目中的。

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

Google Play 上 Android App Bundle 的压缩下载大小限制为 150MB

如何减少 Dl4j 依赖项的大小的问题在之前的 StackOverflow 问题中提出。但是,无法提供任何解决方案,只是对您支持的平台更具选择性。同样,对于每个 abi 平台,这仍然意味着最小 APK 大小至少为 ~200MB。

人们不得不想知道,为什么 Deeplearning4J 社区首先致力于支持 Android 移动开发,以及为什么运行时库依赖大小的不可避免的问题没有像文档中提到的那样多。

我肯定在这里遗漏了一些东西吗?

4

2 回答 2

1

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

于 2021-03-02T12:15:57.933 回答
1

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

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

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

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

首先:“人们不得不想知道,为什么 Deeplearning4J 社区首先会努力支持 Android 移动开发……”

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

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

我肯定在这里遗漏了一些东西吗?

于 2021-03-01T22:25:52.387 回答