模型优化

边缘设备的内存或计算能力通常有限。各种 优化可应用于模型,以便在这些模型中 限制条件。此外,一些优化允许使用专门的 用于加速推理的硬件。

LiteRT 和 TensorFlow 模型优化 工具包提供了相关工具, 可以最大限度地降低优化推理的复杂性。

建议您在应用期间考虑模型优化 开发过程。本文档简要介绍了一些 用于部署到边缘硬件的 TensorFlow 模型。

为什么应优化模型

模型优化主要可以通过几种方式来帮助完成应用 开发。

大小缩减

可以使用某些优化形式来减小模型的大小。较小 模型具有以下优势:

  • 存储空间较小:模型较小,占用的存储空间较小 用户的设备。例如,使用较小模型的 Android 应用将 减少用户移动设备上的存储空间。
  • 更小的下载文件大小:较小的模型需要的时间和带宽较少 下载到用户的设备。
  • 内存使用量更少:较小的模型在运行时使用的内存较少, 从而释放内存以供应用的其他部分使用, 进而提升性能和稳定性。

在所有这些情况下,量化都可以减小模型的大小, 但会牺牲部分准确性。剪枝和聚类可以减小 使其更易于压缩,以便用户能够下载。

缩短延迟时间

延迟时间是指在给定条件下运行单次推理所用的时间 模型。某些优化形式可以减少所需的计算量 使用模型进行推理,从而缩短延迟时间。延迟时间 会影响功耗。

目前,量化可用于通过简化 可能要在推理过程中进行一些计算, 准确率。

加速器兼容性

某些硬件加速器,如 Edge 使用 TPU 已正确优化的模型。

通常,这些类型的设备需要以特定的 。请参阅每个硬件加速器的文档,详细了解其 要求。

权衡因素

优化有可能导致模型准确率发生变化, 在应用开发过程中考虑的因素。

准确率的变化取决于要优化的各个模型, 难以预先预测。一般来说,针对 都会在一定程度上降低准确性。具体取决于您的 这不一定会影响您用户的体验。在极少数情况下, 优化过程后,某些模型的准确性可能会提高。

优化类型

LiteRT 目前支持通过量化、剪枝和 集群模型。

这些是 TensorFlow Model Optimization 工具包,它提供了 有关与 TensorFlow 兼容的模型优化技术的资源 精简版。

量化

量化 其工作原理是降低用于表示模型预测值的数值的精度, 参数,默认为 32 位浮点数。这会导致 缩减模型大小并加快计算速度。

LiteRT 提供以下类型的量化:

分析法 数据要求 大小缩减 准确率 支持的硬件
训练后 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 1241126416.94.3
Mobilenet-v2-1-2240.7190.6370.709 899854143.6
Inception_v30.780.7720.775 113084554395.723.9
Resnet_v2_1010.7700.768不适用 39732868不适用178.344.9
<ph type="x-smartling-placeholder">
</ph> 表 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
MobileNetV1准确性最高0.70620.694 0.6936
MobileNetV2准确性最高0.7180.7126 0.7137
MobileBertF1(完全匹配)88.81(81.23)2.08(0) 88.73(81.15)
<ph type="x-smartling-placeholder">
</ph> 表 2 使用 int16 激活函数进行模型量化的好处

修剪

剪枝的工作原理 移除对模型模型中对模型数据影响很小的参数 预测。剪除后的模型在磁盘上具有相同的大小和运行时 但可以更有效地进行压缩。这样,剪枝 来缩减模型下载大小

将来,LiteRT 将为剪枝的模型提供延迟。

聚簇

聚类 其工作原理是将模型中每一层的权重分组为一个预定义的数字, 然后共享每个聚类的权重的形心值。 单个集群这会减少模型中唯一权重值的数量, 从而降低其复杂性。

因此,可以更有效地压缩聚类模型, 类似于删减。

开发工作流

首先,检查托管的 模型是否适用于您的应用。否则,我们 建议用户先使用训练后量化 工具,因为这非常适用, 不需要训练数据。

适用于未达到准确度和延迟时间目标,或硬件 加速器支持非常重要,量化感知能力 训练 是更好的选择查看其他优化技巧, TensorFlow 模型优化 工具包

如果要进一步缩减模型大小,可以尝试剪枝 然后再进行聚类