在移动设备上 运行 递归神经网络(推理)的最快方法
Fastest way to run recurrent neural network (inference) on mobile device
我有什么:Tensorflow 中经过训练的递归神经网络。
我想要的:一个可以运行 这个网络尽可能快的移动应用程序(仅推理模式,没有训练)。
我相信有多种方法可以实现我的目标,但我希望你 feedback/corrections 和补充,因为我以前从未这样做过。
- Tensorflow Lite。专业版:直截了当,可在 Android 和 iOS 上使用。 Contra:可能不是最快的方法,对吧?
- TensorRT。优点:非常快 + 我可以编写自定义 C 代码以使其更快。 Contra:用于 Nvidia 设备,所以没有简单的方法在 Android 和 iOS 上 运行,对吧?
- 自定义代码 + 类似 openBLAS 的库。 Pro:可能非常快,并且有可能在 Android 上 iOS 上 link (如果我没记错的话)。 Contra:递归神经网络有很多用处吗?它真的适用于 Android + iOS 吗?
- 重新实现一切。我还可以在 C/C++ 中重写整个计算,这对于循环神经网络来说应该不会太难。优点:可能是最快的方法,因为我可以优化所有内容。相反:将花费很长时间,如果网络发生变化,我也必须更新我的代码(尽管如果它真的是最快的,我愿意这样做)。另外,在 Android 上调用库 (C/C++) 的速度有多快?我是否受到 Java 接口的限制?
有关移动应用程序的一些详细信息。该应用程序将记录用户的声音,进行一些处理(如 Speech2Text)并输出文本。我不想找到 "fast enough" 的解决方案,而是最快的选择,因为这会在非常大的声音文件上发生。所以几乎每一次速度改进都很重要。你有什么建议,我应该如何解决这个问题?
最后一个问题:如果我想雇人帮我,我应该找 Android/iOS-、Embedded- 还是 Tensorflow- 类型的人?
1. TensorflowLite
专业版:它在 Android 上使用 GPU 优化;很容易融入 Swift/Objective-C app, and very easy into Java/Android (just adding one line in gradle.build); You can transform TF model to CoreML
缺点:如果您使用 C++ 库 - 将 TFLite 作为库添加到您的 Android/Java-JNI 时会遇到一些问题(没有 JNI 就无法构建此类库); iOS 不支持 GPU(社区致力于 MPS 集成)
这里还有对 TFLite 的参考 speech-to-text demo app,它可能会有用。
2。 TensorRT
它使用 TensorRT 使用 cuDNN,后者使用 CUDA 库。有CUDA for Android,不确定是否支持全部功能。
3。自定义代码 + 库
我建议您使用 Android NNet library and CoreML; in case you need to go deeper - you can use Eigen 线性代数库。但是,从长远来看,编写自己的自定义代码并无益处,您需要 support/test/improve 它 - 这是一笔大买卖,比性能更重要。
Re-implement一切
这个选项与前一个选项非常相似,实现你自己的 RNN(LSTM) 应该没问题,一旦你知道你在做什么,只需使用一个线性代数库(例如 Eigen)。
总体建议是:**
- 尝试在服务器端进行:使用一些有损压缩和服务器端
语音文本;
- 尝试使用 Tensorflow Lite;衡量性能,找到瓶颈,尝试优化
- 如果 TFLite 的某些部分太慢 - 在 custom operations 中重新实现它们; (并向 Tensorflow 发布 PR)
- 如果瓶颈在硬件层面 - 转到第一个建议
我有什么:Tensorflow 中经过训练的递归神经网络。
我想要的:一个可以运行 这个网络尽可能快的移动应用程序(仅推理模式,没有训练)。
我相信有多种方法可以实现我的目标,但我希望你 feedback/corrections 和补充,因为我以前从未这样做过。
- Tensorflow Lite。专业版:直截了当,可在 Android 和 iOS 上使用。 Contra:可能不是最快的方法,对吧?
- TensorRT。优点:非常快 + 我可以编写自定义 C 代码以使其更快。 Contra:用于 Nvidia 设备,所以没有简单的方法在 Android 和 iOS 上 运行,对吧?
- 自定义代码 + 类似 openBLAS 的库。 Pro:可能非常快,并且有可能在 Android 上 iOS 上 link (如果我没记错的话)。 Contra:递归神经网络有很多用处吗?它真的适用于 Android + iOS 吗?
- 重新实现一切。我还可以在 C/C++ 中重写整个计算,这对于循环神经网络来说应该不会太难。优点:可能是最快的方法,因为我可以优化所有内容。相反:将花费很长时间,如果网络发生变化,我也必须更新我的代码(尽管如果它真的是最快的,我愿意这样做)。另外,在 Android 上调用库 (C/C++) 的速度有多快?我是否受到 Java 接口的限制?
有关移动应用程序的一些详细信息。该应用程序将记录用户的声音,进行一些处理(如 Speech2Text)并输出文本。我不想找到 "fast enough" 的解决方案,而是最快的选择,因为这会在非常大的声音文件上发生。所以几乎每一次速度改进都很重要。你有什么建议,我应该如何解决这个问题?
最后一个问题:如果我想雇人帮我,我应该找 Android/iOS-、Embedded- 还是 Tensorflow- 类型的人?
1. TensorflowLite
专业版:它在 Android 上使用 GPU 优化;很容易融入 Swift/Objective-C app, and very easy into Java/Android (just adding one line in gradle.build); You can transform TF model to CoreML
缺点:如果您使用 C++ 库 - 将 TFLite 作为库添加到您的 Android/Java-JNI 时会遇到一些问题(没有 JNI 就无法构建此类库); iOS 不支持 GPU(社区致力于 MPS 集成)
这里还有对 TFLite 的参考 speech-to-text demo app,它可能会有用。
2。 TensorRT
它使用 TensorRT 使用 cuDNN,后者使用 CUDA 库。有CUDA for Android,不确定是否支持全部功能。
3。自定义代码 + 库
我建议您使用 Android NNet library and CoreML; in case you need to go deeper - you can use Eigen 线性代数库。但是,从长远来看,编写自己的自定义代码并无益处,您需要 support/test/improve 它 - 这是一笔大买卖,比性能更重要。
Re-implement一切
这个选项与前一个选项非常相似,实现你自己的 RNN(LSTM) 应该没问题,一旦你知道你在做什么,只需使用一个线性代数库(例如 Eigen)。
总体建议是:**
- 尝试在服务器端进行:使用一些有损压缩和服务器端 语音文本;
- 尝试使用 Tensorflow Lite;衡量性能,找到瓶颈,尝试优化
- 如果 TFLite 的某些部分太慢 - 在 custom operations 中重新实现它们; (并向 Tensorflow 发布 PR)
- 如果瓶颈在硬件层面 - 转到第一个建议