我所拥有的:在 Tensorflow 中经过训练的递归神经网络。
我想要的:一个可以尽可能快地运行这个网络的移动应用程序(只有推理模式,没有训练)。
我相信有多种方法可以实现我的目标,但我希望您能提供反馈/更正和补充,因为我以前从未这样做过。
- Tensorflow 精简版。专业版:简单明了,适用于 Android 和 iOS。 Contra:可能不是最快的方法,对吧?
- TensorRT。优点:非常快 + 我可以编写自定义 C 代码以使其更快。 Contra:用于 Nvidia 设备,因此在 Android 和 iOS 上运行起来并不容易,对吧?
- 自定义代码 + openBLAS 等库。优点:可能非常快,并且有可能在 iOS 上的 Android 上链接到它(如果我没记错的话)。 Contra:递归神经网络有很多用处吗?它真的适用于 Android + iOS 吗?
- 重新实现一切。我还可以用 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 library和 CoreML ;如果你需要更深入 - 你可以使用 Eigen线性代数库。但是,从长远来看,编写您自己的自定义代码并无益处,您需要支持/测试/改进它 - 这是一件大事,比性能更重要。
重新实现一切
此选项与前一个选项非常相似,实现您自己的 RNN(LSTM) 应该没问题,一旦您知道自己在做什么,只需使用一个线性代数库(例如 Eigen)即可。
总体建议是:**
- 尝试在服务器端做:使用一些有损压缩和服务器端 语音文本;
- 尝试使用 Tensorflow Lite;衡量性能,发现瓶颈,尝试优化
- 如果 TFLite 的某些部分太慢 - 在 custom operations 中重新实现它们; (并向 Tensorflow 进行 PR)
- 如果瓶颈在硬件层面 - 转到第一个建议
关于android - 在移动设备上运行递归神经网络(推理)的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49193985/