性能最佳实践

移动设备和嵌入式设备的计算资源有限,因此必须确保应用资源高效。我们编制了一系列最佳做法和策略,可帮助您提升 TensorFlow Lite 模型的性能。

为任务选择最佳模型

根据具体任务,您需要在模型复杂度和大小之间进行权衡。如果您的任务需要高准确率,那么您可能需要一个大型而复杂的模型。对于精度要求较低的任务,最好使用较小的模型,因为它们不仅使用更少的磁盘空间和内存,而且通常速度和能源效率也更高。例如,下图显示了一些常见图片分类模型在准确率和延迟时间方面的权衡取舍。

模型大小与准确率的图表

准确率与延迟时间的图表

针对移动设备优化的模型之一是 MobileNets,它针对移动视觉应用进行了优化。TensorFlow Hub 列出了另外几种专门针对移动和嵌入式设备进行了优化的模型。

您可以使用迁移学习基于自己的数据集重新训练列出的模型。

剖析模型的性能

选择适合您的任务的候选模型后,最好对模型进行性能分析和基准测试。TensorFlow Lite 基准测试工具具有一个内置性能分析器,可以按运算符显示性能分析统计信息。这有助于了解性能瓶颈以及哪些运算符占用了计算时间。

此外,您还可以使用 TensorFlow Lite 跟踪,通过标准的 Android 系统跟踪来分析 Android 应用中的模型,并使用基于 GUI 的分析工具按时间直观呈现运算符调用。

分析并优化图中的运算符

如果某个运算符频繁出现在模型中,并且根据分析,您发现该运算符耗费的时间最多,则可以考虑优化该运算符。由于 TensorFlow Lite 为大多数运算符提供了优化版本,因此这种情况应该很少见。但是,如果您知道运算符执行时的限制,就有可能编写更快版本的自定义操作。请查看自定义运算符指南

优化您的模型

模型优化旨在创建较小的模型,这些模型通常速度更快且能源效率更高,因此它们可以部署到移动设备上。TensorFlow Lite 支持多种优化技术,例如量化。

如需了解详情,请参阅模型优化文档

调整线程数量

TensorFlow Lite 支持许多运算符的多线程内核。您可以增加线程数并加速运算符的执行。但是,增加线程数会使模型使用更多的资源和功耗。

对于某些应用,延迟时间可能比能效更为重要。您可以通过设置解释器线程数量来增加线程数。但是,多线程执行会以增加性能差异(取决于并发执行的其他任务)为代价。对于移动应用来说尤其如此。例如,隔离测试可能显示速度是单线程测试的 2 倍,但是,如果另一个应用同时执行,可能会导致性能低于单线程。

消除冗余副本

如果您的应用未经精心设计,那么在将输入馈送到模型并从中读取输出时,可能会存在冗余副本。请务必消除冗余副本。如果您使用的是更高级别的 API(例如 Java),请务必仔细查看文档,了解性能注意事项。例如,如果将 ByteBuffers 用作输入,则 Java API 的速度会快得多。

使用平台专用工具分析您的应用

特定于平台的工具(如 Android 性能分析器插桩工具)提供了大量性能分析信息,可用于调试应用。有时,性能 bug 可能并不存在于模型中,而是出现在与模型交互的应用代码中。请务必熟悉平台专用分析工具以及适用于您平台的最佳实践。

评估使用设备上提供的硬件加速器是否受益于模型

TensorFlow Lite 增加了使用更快的硬件(如 GPU、DSP 和神经加速器)加速模型的新方式。通常,这些加速器通过接管解释器执行部分部分的委托子模块公开。TensorFlow Lite 可以通过以下方式使用委托:

  • GPU 委托适用于 Android 和 iOS,分别使用 OpenGL/OpenCL 和 Metal。如需试用这些模块,请参阅 GPU 委托
  • 如果您有权访问非标准硬件,则可以创建自己的委托。如需了解详情,请参阅 TensorFlow Lite 代理

请注意,有些加速器更适合不同类型的模型。一些代理仅支持浮动模型或以特定方式优化的模型。请务必对每个委托进行基准测试,以确定其是否适合您的应用。例如,如果您的模型非常小,则将该模型委托给 GPU 可能不值得。相反,加速器则非常适合具有高算术强度的大型模型。