移动设备和嵌入式设备的计算资源有限,因此请务必确保应用资源高效。我们整理了一份最佳实践和策略清单,您可以利用这些内容来提升 TensorFlow Lite 模型性能。
为任务选择最佳模型
您需要根据任务在模型复杂性和大小之间做出权衡。如果任务要求的准确度较高,您可能需要一个大型且复杂的模型。对于精度要求较低的任务,最好使用较小的模型,因为它们不仅占用较少的磁盘空间和内存,而且通常速度更快、能效更高。例如,下图显示了一些常见图片分类模型的准确率与延迟时间之间的权衡。


针对移动设备优化的模型的一个示例是 MobileNets,它针对移动版视觉应用进行了优化。Kaggle Models 列出了其他一些专门针对移动设备和嵌入式设备优化的模型。
您可以使用迁移学习在自己的数据集上重新训练所列模型。
剖析模型的性能
选择适合您任务的候选模型后,最好对模型进行分析和基准比较。LiteRT 基准比较工具内置了一个性能分析器,可显示每个运算符的性能分析统计信息。这有助于了解性能瓶颈以及哪些运算符占用了大部分计算时间。
您还可以使用 LiteRT 跟踪在 Android 应用中对模型进行分析,使用标准 Android 系统跟踪,并通过基于 GUI 的分析工具按时间直观呈现运算符调用。
分析和优化图中的运算符
如果某个特定运算符在模型中频繁出现,并且根据分析,您发现该运算符消耗的时间最多,则可以考虑优化该运算符。这种情况应该很少见,因为 TensorFlow Lite 已针对大多数运算符进行了优化。不过,如果您知道运算符的执行约束条件,或许可以编写速度更快的自定义操作版本。请参阅自定义运算符指南。
优化您的模型
模型优化旨在创建更小、通常更快且更节能的模型,以便将其部署在移动设备上。LiteRT 支持多种优化技术,例如量化。
如需了解详情,请参阅模型优化文档。
调整线程数
LiteRT 支持许多运算符的多线程内核。您可以增加线程数并加快运算符的执行速度。不过,增加线程数会使模型使用更多资源和电量。
对于某些应用,延迟时间可能比能效更重要。您可以通过设置解释器线程数来增加线程数。 不过,多线程执行会增加性能可变性,具体取决于同时执行的其他任务。对于移动应用来说,这一点尤其重要。例如,隔离测试可能会显示速度比单线程快 2 倍,但如果另一个应用同时执行,则可能会导致性能比单线程更差。
消除冗余副本
如果应用设计不周,在向模型馈送输入和从模型读取输出时,可能会出现冗余副本。请务必消除冗余副本。如果您使用的是更高级别的 API(例如 Java),请务必仔细查看文档,了解性能注意事项。例如,如果将 ByteBuffers 用作输入,Java API 的速度会快很多。
使用特定于平台的工具分析应用
Android 分析器和 Instruments 等特定于平台的工具可提供丰富的分析信息,可用于调试应用。有时,性能 bug 可能不在模型中,而是在与模型交互的应用代码部分中。请务必熟悉特定于平台的分析工具以及适用于您平台的最佳实践。
评估您的模型是否受益于使用设备上可用的硬件加速器
LiteRT 新增了多种方法,可使用 GPU、DSP 和神经加速器等更快的硬件来加速模型。通常,这些加速器通过接管部分解释器执行的 delegate 子模块公开。LiteRT 可以通过以下方式使用委托:
- GPU 委托已在 Android 和 iOS 上推出,分别使用 OpenGL/OpenCL 和 Metal。如需试用这些功能,请参阅 GPU 委托。
- 如果您有权访问非标准硬件,则可以创建自己的委托。如需了解详情,请参阅 LiteRT 委托。
请注意,某些加速器更适合不同类型的模型。某些委托仅支持浮点模型或以特定方式优化的模型。对每个委托进行基准比较非常重要,这样才能确定它是否适合您的应用。例如,如果模型非常小,则可能不值得将模型委托给 GPU。相反,对于具有高算术强度的模型,加速器是不错的选择。