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

时间:2018-03-09 12:37:07

标签: android ios performance tensorflow-lite tensorrt

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

我想要的:一个可以尽快运行此网络的移动应用程序(仅限推理模式,无需培训)。

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

  1. Tensorflow Lite 。 Pro:直接向前,可在Android和iOS上使用。 Contra:可能不是最快的方法,对吗?
  2. TensorRT 即可。亲:非常快+我可以编写自定义C代码以加快速度。 Contra:用于Nvidia设备,因此没有简单的方法在Android和iOS上运行,对吧?
  3. 自定义代码+像openBLAS这样的库。亲:可能非常快,并且可以在iOS上的Android上链接到它(如果我没有记错的话)。 Contra:反复神经网络有多大用处?它在Android + iOS上是否真的有效?
  4. 重新实施一切。我还可以用C / C ++重写整个计算,这对于循环神经网络来说应该不会太难。亲:可能是最快的方法,因为我可以优化一切。 Contra:需要很长时间,如果网络发生变化,我也必须更新我的代码(虽然我愿意这样做,如果真的是最快的话)。另外,我在Android上调用库(C / C ++)的速度有多快?我受限于Java接口吗?
  5. 有关移动应用程序的一些详细信息。应用程序将对用户进行录音,进行一些处理(如Speech2Text)并输出文本。我不想找到一个“足够快”的解决方案,但是最快的选择,因为这将发生在非常大的声音文件上。因此几乎所有的速度提升都很重你有什么建议,我该如何处理这个问题?

    最后一个问题:如果我试图聘请某人帮助我,我应该寻找Android / iOS,Embedded或Tensorflow类型的人吗?

1 个答案:

答案 0 :(得分:1)

<强> 1。 TensorflowLite

Pro:它在Android上使用GPU优化;很容易合并到Swift/Objective-C appvery 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 libraryCoreML;如果您需要更深入 - 您可以使用Eigen库进行线性代数。但是,编写自己的自定义代码从长远来看并不是有益的,你需要支持/测试/改进它 - 这是一个巨大的交易,比性能更重要。

重新实施一切

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

总体建议是:**

  • 尝试在服务器端执行:使用一些有损压缩和服务器端 speech2text;
  • 尝试使用Tensorflow Lite;衡量绩效,找到瓶颈,尝试优化
  • 如果TFLite的某些部分太慢 - 在custom operations重新实现它们; (并为Tensorflow制作PR)
  • 如果瓶颈在硬件级别上 - 转到第一个建议