移动设备和嵌入式设备的计算资源有限,因此保持应用程序资源效率非常重要。我们整理了一份最佳实践和策略列表,您可以使用这些列表来提高 TensorFlow Lite 模型的性能。
选择最适合任务的模型
根据任务,您需要在模型的复杂性和大小之间进行权衡。如果您的任务需要高精度,那么您可能需要一个大型且复杂的模型。对于需要较低精度的任务,最好使用较小的模型,因为它们不仅使用更少的磁盘空间和内存,而且通常更快、更节能。例如,下面的图表显示了一些常见图像分类模型的精度和延迟权衡。
针对移动设备优化的模型的一个示例是 MobileNets,它针对移动视觉应用程序进行了优化。 TensorFlow Hub 列出了几个专门针对移动设备和嵌入式设备优化的其他模型。
您可以使用迁移学习在自己的数据集上重新训练列出的模型。查看使用 TensorFlow Lite 模型制作器 的迁移学习教程。
分析您的模型
选择适合您任务的候选模型后,最好分析和基准测试您的模型。TensorFlow Lite 基准测试工具 具有内置的分析器,可以显示每个运算符的分析统计信息。这有助于了解性能瓶颈以及哪些运算符占用了大部分计算时间。
您还可以使用 TensorFlow Lite 跟踪 在您的 Android 应用程序中分析模型,使用标准 Android 系统跟踪,并使用基于 GUI 的分析工具按时间可视化运算符调用。
分析和优化图中的运算符
如果某个特定运算符在模型中频繁出现,并且根据分析,您发现该运算符消耗了最多的时间,那么您可以考虑优化该运算符。这种情况应该很少见,因为 TensorFlow Lite 针对大多数运算符都提供了优化版本。但是,如果您了解运算符执行的约束条件,则可以编写自定义运算符的更快版本。查看 自定义运算符指南。
优化您的模型
模型优化旨在创建更小的模型,这些模型通常更快、更节能,以便可以将它们部署到移动设备上。TensorFlow Lite 支持多种优化技术,例如量化。
查看 模型优化文档 以获取详细信息。
调整线程数
TensorFlow Lite 支持许多操作符的多线程内核。您可以增加线程数量,从而加快操作符的执行速度。但是,增加线程数量会使您的模型使用更多资源和电力。
对于某些应用程序,延迟可能比能效更重要。您可以通过设置解释器 线程 数量来增加线程数量。但是,多线程执行的代价是会增加性能的可变性,具体取决于同时执行的其他内容。对于移动应用程序来说尤其如此。例如,隔离测试可能显示出比单线程快 2 倍,但是,如果另一个应用程序在同一时间执行,则可能导致比单线程更差的性能。
消除冗余复制
如果您的应用程序设计不当,在将输入馈送到模型并从模型读取输出时,可能会出现冗余复制。确保消除冗余复制。如果您使用的是更高级别的 API(如 Java),请务必仔细检查文档以了解性能注意事项。例如,如果使用 ByteBuffers
作为 输入,则 Java API 的速度要快得多。
使用平台特定工具分析您的应用程序
平台特定工具(如 Android 分析器 和 Instruments)提供了丰富的分析信息,可用于调试您的应用程序。有时,性能错误可能不在模型中,而在与模型交互的应用程序代码部分中。请务必熟悉平台特定的分析工具以及平台的最佳实践。
评估您的模型是否受益于使用设备上可用的硬件加速器
TensorFlow Lite 添加了新的方法,可以使用更快的硬件(如 GPU、DSP 和神经加速器)加速模型。通常,这些加速器通过 委托 子模块公开,这些子模块接管解释器执行的部分内容。TensorFlow Lite 可以通过以下方式使用委托:
- 使用 Android 的 神经网络 API。您可以利用这些硬件加速器后端来提高模型的速度和效率。要启用神经网络 API,请查看 NNAPI 委托 指南。
- GPU 委托在 Android 和 iOS 上可用,分别使用 OpenGL/OpenCL 和 Metal。要试用它们,请查看 GPU 委托教程 和 文档。
- Hexagon 委托在 Android 上可用。如果设备上可用,它将利用高通 Hexagon DSP。有关更多信息,请查看 Hexagon 委托教程。
- 如果您有权访问非标准硬件,则可以创建自己的委托。有关更多信息,请查看 TensorFlow Lite 委托。
请注意,某些加速器对不同类型的模型效果更好。某些委托仅支持浮点模型或以特定方式优化的模型。重要的是要 对每个委托进行基准测试,以查看它是否适合您的应用程序。例如,如果您有一个非常小的模型,则可能不值得将模型委托给 NN API 或 GPU。相反,加速器非常适合具有高算术强度的大型模型。
需要更多帮助
TensorFlow 团队很乐意帮助您诊断和解决您可能遇到的特定性能问题。请在 GitHub 上提交一个问题,其中包含问题的详细信息。