在移动设备上运行循环神经网络(推理)的最快方法
Posted
技术标签:
【中文标题】在移动设备上运行循环神经网络(推理)的最快方法【英文标题】:Fastest way to run recurrent neural network (inference) on mobile device 【发布时间】:2018-08-18 00:55:31 【问题描述】:我所拥有的:Tensorflow 中经过训练的循环神经网络。
我想要的:可以尽可能快地运行此网络的移动应用程序(仅限推理模式,无需训练)。
我相信有多种方法可以实现我的目标,但我希望得到您的反馈/更正和补充,因为我以前从未这样做过。
-
张量流精简版。 Pro:直截了当,可在 android 和 ios 上使用。 Contra:可能不是最快的方法,对吧?
张量RT。 Pro:非常快 + 我可以编写自定义 C 代码以使其更快。魂斗罗:用于 Nvidia 设备,因此在 Android 和 iOS 上运行并不容易,对吧?
自定义代码 + openBLAS 等库。 Pro:可能非常快,并且有可能在 iOS 上的 Android 上链接到它(如果我没记错的话)。对比:循环神经网络有多大用处?它在 Android + iOS 上真的很好用吗?
重新实现一切。我还可以用 C/C++ 重写整个计算,这对于循环神经网络来说应该不会太难。 Pro:可能是最快的方法,因为我可以优化所有内容。反对:需要很长时间,如果网络发生变化,我也必须更新我的代码(尽管如果它真的是最快的,我愿意这样做)。另外,在 Android 上调用库 (C/C++) 的速度有多快?我是否受到 Java 接口的限制?
有关移动应用程序的一些详细信息。该应用程序将记录用户的声音,进行一些处理(如 Speech2Text)并输出文本。我不想找到“足够快”的解决方案,而是最快的选择,因为这将发生在非常大的声音文件上。所以几乎每一次速度提升都很重要。你有什么建议,我应该如何解决这个问题?
最后一个问题:如果我想聘请某人来帮助我,我应该寻找 Android/iOS-、Embedded- 或 Tensorflow- 类型的人吗?
【问题讨论】:
【参考方案1】: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。 TensorRT
它使用 TensorRT 使用 cuDNN,它使用 CUDA 库。有CUDA for Android,不确定它是否支持整个功能。
3.自定义代码 + 库
我建议你使用Android NNet library 和CoreML;如果您需要更深入 - 您可以使用 Eigen 库进行线性代数。但是,从长远来看,编写自己的自定义代码并没有好处,您需要支持/测试/改进它——这是一件大事,比性能更重要。
重新实现一切
这个选项和上一个非常相似,实现你自己的RNN(LSTM)应该没问题,只要你知道你在做什么,就使用其中一个线性代数库(例如Eigen)。
总体建议是:**
尝试做服务器端:使用一些有损压缩和服务器端 语音2文本; 尝试使用 Tensorflow Lite;衡量性能,发现瓶颈,尝试优化 如果 TFLite 的某些部分太慢 - 在 custom operations 中重新实现它们; (并对 Tensorflow 进行 PR) 如果瓶颈出现在硬件级别 - 转到第一个建议【讨论】:
以上是关于在移动设备上运行循环神经网络(推理)的最快方法的主要内容,如果未能解决你的问题,请参考以下文章