模型优化

边缘设备通常内存或计算能力有限。可以对模型应用各种优化,以便在这些约束条件下运行。此外,一些优化允许使用专用硬件进行加速推理。

TensorFlow Lite 和 TensorFlow 模型优化工具包 提供工具来最大限度地减少优化推理的复杂性。

建议您在应用程序开发过程中考虑模型优化。本文档概述了一些针对边缘硬件部署优化 TensorFlow 模型的最佳实践。

为什么应该优化模型

模型优化可以帮助应用程序开发的几个主要方面。

减小尺寸

某些优化形式可用于减小模型的尺寸。较小的模型具有以下优点

  • 更小的存储空间:较小的模型在用户设备上占用更少的存储空间。例如,使用较小模型的 Android 应用程序在用户的移动设备上将占用更少的存储空间。
  • 更小的下载尺寸:较小的模型需要更少的时间和带宽才能下载到用户设备上。
  • 更少的内存使用:较小的模型在运行时使用更少的 RAM,这将释放内存供应用程序的其他部分使用,并可以转化为更好的性能和稳定性。

量化可以在所有这些情况下减小模型的尺寸,这可能会以牺牲一些精度为代价。修剪和聚类可以通过使模型更容易压缩来减小模型的下载尺寸。

减少延迟

延迟是指使用给定模型运行一次推理所需的时间。某些优化形式可以减少使用模型运行推理所需的计算量,从而降低延迟。延迟也会影响功耗。

目前,量化可用于通过简化推理过程中发生的计算来降低延迟,这可能会以牺牲一些精度为代价。

加速器兼容性

某些硬件加速器(例如 Edge TPU)可以对经过正确优化的模型进行极快的推理。

通常,这些类型的设备要求模型以特定方式进行量化。请参阅每个硬件加速器的文档以了解有关其要求的更多信息。

权衡

优化可能会导致模型精度的变化,这在应用程序开发过程中必须考虑。

精度变化取决于被优化的单个模型,并且难以提前预测。通常,针对大小或延迟进行优化的模型会损失少量精度。根据您的应用程序,这可能会或可能不会影响用户的体验。在极少数情况下,某些模型可能会由于优化过程而获得一些精度。

优化类型

TensorFlow Lite 目前支持通过量化、剪枝和聚类进行优化。

这些是 TensorFlow 模型优化工具包 的一部分,该工具包提供了与 TensorFlow Lite 兼容的模型优化技术的资源。

量化

量化 通过降低用于表示模型参数的数字的精度来工作,这些数字默认情况下是 32 位浮点数。这会导致模型尺寸更小,计算速度更快。

TensorFlow Lite 中提供了以下类型的量化

技术 数据要求 减小尺寸 精度 支持的硬件
训练后 float16 量化 无数据 高达 50% 精度损失微不足道 CPU、GPU
训练后动态范围量化 无数据 高达 75% 精度损失最小 CPU、GPU(Android)
训练后整数量化 未标记的代表性样本 高达 75% 精度损失小 CPU、GPU(Android)、EdgeTPU、Hexagon DSP
量化感知训练 标记的训练数据 高达 75% 精度损失最小 CPU、GPU(Android)、EdgeTPU、Hexagon DSP

以下决策树可帮助您根据预期的模型大小和精度选择可能要用于模型的量化方案。

quantization-decision-tree

以下是针对一些模型进行的训练后量化和量化感知训练的延迟和精度结果。所有延迟数字均在 Pixel 2 设备上使用单个大核心 CPU 测量。随着工具包的改进,这里的数据也会随之改进。

模型 Top-1 精度(原始) Top-1 精度(训练后量化) Top-1 精度(量化感知训练) 延迟(原始)(毫秒) 延迟(训练后量化)(毫秒) 延迟(量化感知训练)(毫秒) 尺寸(原始)(MB) 尺寸(优化)(MB)
Mobilenet-v1-1-2240.7090.6570.70 1241126416.94.3
Mobilenet-v2-1-2240.7190.6370.709 899854143.6
Inception_v30.780.7720.775 113084554395.723.9
Resnet_v2_1010.7700.768N/A 39732868N/A178.344.9
表 1 模型量化对选定 CNN 模型的好处

使用 int16 激活和 int8 权重的全整数量化

使用 int16 激活的量化 是一种全整数量化方案,其中激活使用 int16,权重使用 int8。与激活和权重均使用 int8 的全整数量化方案相比,此模式可以提高量化模型的精度,同时保持类似的模型大小。建议在激活对量化敏感时使用此模式。

注意:目前,TFLite 中仅提供此量化方案的非优化参考内核实现,因此默认情况下,与 int8 内核相比,性能会很慢。此模式的全部优势目前可以通过专用硬件或自定义软件来实现。

以下是受益于此模式的一些模型的精度结果。

模型 精度指标类型 精度(float32 激活) 精度(int8 激活) 精度(int16 激活)
Wav2letterWER6.7%7.7% 7.2%
DeepSpeech 0.5.1(展开)CER6.13%43.67% 6.52%
YoloV3mAP(IOU=0.5)0.5770.563 0.574
MobileNetV1Top-1 精度0.70620.694 0.6936
MobileNetV2Top-1 精度0.7180.7126 0.7137
MobileBertF1(精确匹配)88.81(81.23)2.08(0) 88.73(81.15)
表 2 使用 int16 激活的模型量化的好处

剪枝

剪枝 通过删除模型中对预测影响很小的参数来工作。剪枝后的模型在磁盘上的大小相同,运行时延迟也相同,但可以更有效地压缩。这使得剪枝成为减少模型下载大小的有用技术。

将来,TensorFlow Lite 将为剪枝后的模型提供延迟降低功能。

聚类

聚类 通过将模型中每一层的权重分组到预定义数量的集群中来工作,然后共享属于每个单独集群的权重的质心值。这减少了模型中唯一权重值的数量,从而降低了模型的复杂性。

因此,聚类后的模型可以更有效地压缩,从而提供类似于剪枝的部署优势。

开发工作流程

作为起点,请检查 托管模型 中的模型是否适用于您的应用程序。如果不是,我们建议用户从 训练后量化工具 开始,因为该工具适用范围广,不需要训练数据。

对于未满足精度和延迟目标或硬件加速器支持很重要的用例,量化感知训练 是更好的选择。请参阅 TensorFlow 模型优化工具包 中的其他优化技术。

如果您想进一步减小模型大小,可以在量化模型之前尝试 剪枝 和/或 聚类