android - 在移动设备上运行递归神经网络(推理)的最快方法

标签 android ios performance tensorflow-lite tensorrt

我所拥有的:在 Tensorflow 中经过训练的递归神经网络。

我想要的:一个可以尽可能快地运行这个网络的移动应用程序(只有推理模式,没有训练)。

我相信有多种方法可以实现我的目标,但我希望您能提供反馈/更正和补充,因为我以前从未这样做过。

  1. Tensorflow 精简版。专业版:简单明了,适用于 Android 和 iOS。 Contra:可能不是最快的方法,对吧?
  2. TensorRT。优点:非常快 + 我可以编写自定义 C 代码以使其更快。 Contra:用于 Nvidia 设备,因此在 Android 和 iOS 上运行起来并不容易,对吧?
  3. 自定义代码 + openBLAS 等库。优点:可能非常快,并且有可能在 iOS 上的 Android 上链接到它(如果我没记错的话)。 Contra:递归神经网络有很多用处吗?它真的适用于 Android + iOS 吗?
  4. 重新实现一切。我还可以用 C/C++ 重写整个计算,这对于循环神经网络来说应该不会太难。优点:可能是最快的方法,因为我可以优化所有内容。相反:将花费很长时间,如果网络发生变化,我也必须更新我的代码(尽管如果它真的是最快的,我愿意这样做)。另外,在 Android 上调用库 (C/C++) 的速度有多快?我是否受到 Java 接口(interface)的限制?

有关移动应用程序的一些详细信息。该应用程序将记录用户的声音,进行一些处理(如 Speech2Text)并输出文本。我不想找到一个“足够快”的解决方案,而是最快的选择,因为这会在非常大的声音文件上发生。所以几乎每一次速度改进都很重要。您有什么建议,我应该如何解决这个问题?

最后一个问题:如果我想雇人帮我,我应该找 Android/iOS、嵌入式还是 Tensorflow 类型的人?

最佳答案

<强>1。 TensorflowLite

Pro:它在 Android 上使用 GPU 优化;很容易融入 Swift/Objective-C app , 和 very easy into Java/Android (只需在 gradle.build 中添加一行);您可以将 TF 模型转换为 CoreML

缺点:如果您使用 C++ 库 - 将 TFLite 作为库添加到您的 Android/Java-JNI 时会遇到一些问题(没有 JNI 就无法构建此类库); iOS 上不支持 GPU(社区致力于 MPS 集成)

此处还引用了 TFLite 语音转文本 demo app ,它可能会有用。

<强>2。张量RT

它使用 TensorRT 使用 cuDNN,后者使用 CUDA 库。有 CUDA for Android ,不确定它是否支持全部功能。

<强>3。自定义代码 + 库

我建议您使用 Android NNet libraryCoreML ;如果你需要更深入 - 你可以使用 Eigen线性代数库。但是,从长远来看,编写您自己的自定义代码并无益处,您需要支持/测试/改进它 - 这是一件大事,比性能更重要。

重新实现一切

此选项与前一个选项非常相似,实现您自己的 RNN(LSTM) 应该没问题,一旦您知道自己在做什么,只需使用一个线性代数库(例如 Eigen)即可。

总体建议是:**

  • 尝试在服务器端做:使用一些有损压缩和服务器端 语音文本;
  • 尝试使用 Tensorflow Lite;衡量性能,发现瓶颈,尝试优化
  • 如果 TFLite 的某些部分太慢 - 在 custom operations 中重新实现它们; (并向 Tensorflow 进行 PR)
  • 如果瓶颈在硬件层面 - 转到第一个建议

关于android - 在移动设备上运行递归神经网络(推理)的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49193985/

相关文章:

android - 在 HTC 设备上的 Android 2.1 浏览器中禁用捏合/缩放

objective-c - GameKit/互联网上的点对点

html - 元素发生变化时是否也需要应用 will-change CSS 属性?

android - 查看 SetAlpha 在 android 版本 5 中不工作 - lollipop

Android: ping 没有/system/bin/ping

ios - iOS7上的UIToolbar样式

android - 如何在 React Native 中将焦点或光标设置在 TextInput 上

java - java应用程序和远程数据库的问题

node.js - 与主机相比,docker 容器中的 npm install 速度慢 4 倍

Android - 如何动态设置 AdMob 广告客户 ID 或广告尺寸?