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

2024-01-08

经过几周的开发,我终于在 Android 应用程序中创建了一个 AI,该应用程序使用 Nd4j 库提供的矩阵操作 API 来工作。这些都是用gradle导入到项目中的,遵循本文档 https://deeplearning4j.konduit.ai/android/setup.

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

Google Play 上 Android App Bundle 的压缩下载大小限制为 150MB https://developer.android.com/guide/app-bundle/#size_restrictions.

如何减少 Dl4j 依赖项的大小的问题在之前的一个 StackOverflow 问题 https://stackoverflow.com/questions/62817155/android-apk-too-big-using-opencv-and-nd4j。然而,无法提供任何解决方案,除了对您支持的平台更有选择性 https://github.com/bytedeco/javacpp-presets/wiki/Reducing-the-Number-of-Dependencies#including-binaries-only-for-mobile-platforms。同样,对于每个 abi 平台,这仍然意味着最小 APK 大小至少约为 200MB。

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

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


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

https://github.com/bytedeco/javacpp-presets/wiki/Reducing-the-Number-of-Dependency 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”,就目前情况来看,人们通常会使用不同的应用程序。 诚然,我们更关注操作覆盖率而不是二进制大小。我们有一个缩小器可以帮助您:https://github.com/eclipse/deeplearning4j/tree/master/libnd4j/minifier https://github.com/eclipse/deeplearning4j/tree/master/libnd4j/minifier如果您能更具体的话,我很乐意为您的用例提供帮助,但这并不是一种“只需阅读文档并自行处理”的体验。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nd4j (Deeplearning4J) 是否太大而无法在 Android 移动应用程序中实际使用? 的相关文章

随机推荐