模型优化

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

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
量化感知训练 加标签的训练数据 高达 75% 最小的准确率损失 CPU、GPU (Android)、EdgeTPU

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

量化决策树

以下是针对几个模型进行训练后量化和量化感知训练的延迟时间和准确率结果。所有延迟时间数据都是在使用单核大核 CPU 的 Pixel 2 设备上测量的。随着该工具包的不断完善,此处的数据也会随之不断完善:

模型 排名第一的准确率(原始) 最高准确率(训练后量化) 最高准确率(量化感知训练) 延迟时间(原始数据)(毫秒) 延迟时间(训练后量化)(毫秒) 延迟时间(量化感知训练)(毫秒) 大小(原始大小)(MB) 大小(优化)(MB)
Mobilenet-v1-1-2240.7090.6570.70 12411264土耳其里拉4.3
Mobilenet-v2-1-2240.7190.6370.709 899854143.6
Inception_v30.780.7720.775 1130845543土耳其里拉土耳其里拉
Resnet_v2_1010.7700.768N/A 39732868N/A178.3土耳其里拉
表 1 部分 CNN 模型的模型量化优势

包含 int16 激活函数和 int8 权重的全整数量化

使用 int16 激活的量化是一种全整数量化方案,激活函数为 int16,权重为 int8。与完整整数量化方案(其中 int8 中的激活和权重都保持相似的模型大小)相比,此模式可以提高量化模型的准确率。建议在激活对量化敏感的情况下使用。

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

以下是从此模式中受益的部分模型的准确率结果。

模型 准确性指标类型 准确率(float32 激活) 准确率(int8 激活) 准确率(int16 激活)
Wav2letterWER6.7%7.7% 7.2%
DeepSpeech 0.5.1(已展开)证书评级系统 (CER)6.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 模型优化工具套件下的其他优化方法。

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