TensorFlow Lite 委托

代理利用设备端加速器(如 GPU 和数字信号处理器 (DSP))来对 TensorFlow Lite 模型进行硬件加速。

默认情况下,TensorFlow Lite 利用已针对 ARM Neon 指令集优化的 CPU 内核。但是,CPU 是一个多用途处理器,不需要针对机器学习模型中常见的繁重算术(例如卷积层和密集层中涉及的矩阵数学)进行优化。

另一方面,大多数现代手机都装有能够更好地处理此类繁重操作的芯片。将其用于神经网络操作在延迟和能效方面可以带来巨大优势。例如,GPU 最多可提供高达 5 倍的延迟

其中每个加速器都有可用于自定义计算的关联 API,例如适用于移动 GPU 的 OpenCLOpenGL ES。通常,您必须编写大量自定义代码才能通过这些接口运行神经网络。考虑到每个加速器都有自己的优缺点,并且无法执行神经网络中的所有运算,情况就会变得更加复杂。TensorFlow Lite 的 Delegate API 通过充当 TFLite 运行时和这些较低级别 API 之间的桥梁来解决此问题。

有代理的运行时

选择受托人

TensorFlow Lite 支持多个委托,每个委托都针对特定平台和特定类型的模型进行了优化。通常,您的用例会有多个代理,具体取决于两个主要条件:您的目标平台(Android 还是 iOS?)和您尝试加速的模型类型(浮点还是量化)。

委托人(按平台)

跨平台(Android 和 iOS)

  • GPU 委托 - GPU 委托可在 Android 和 iOS 上使用。它经过优化,可在 GPU 可用的情况下运行 32 位和 16 位浮点型模型。它还支持 8 位量化模型,并提供与其浮点版本相当的 GPU 性能。如需详细了解 GPU 代理,请参阅 GPU 上的 TensorFlow Lite

iOS

  • 适用于新款 iPhone 和 iPad 的 Core ML delegate - 对于提供 Neural Engine 的新版 iPhone 和 iPad,您可以使用 Core ML delegate 来加速 32 位或 16 位浮点模型的推理。Neural Engine 适用于采用 A12 SoC 或更高版本的 Apple 移动设备。如需简要了解 Core ML 委托和分步说明,请参阅 TensorFlow Lite Core ML 委托

代理(按模型类型)

每个加速器的设计都围绕特定位宽的数据进行设计。如果您向仅支持 8 位量化运算的委托提供浮点模型,则该模型将拒绝其所有运算,并且模型将完全在 CPU 上运行。为避免出现此类意外情况,下表根据模型类型简要介绍了委托支持情况:

模型类型 GPU CoreML
浮点(32 位)
训练后 float16 量化
训练后动态范围量化 不支持
训练后整数量化 不支持
量化感知训练 不支持

验证效果

本部分中的信息可作为大致的指导,供您列出可改进应用的受托人候选名单。但请务必注意,每个代理都有一组支持的预定义操作,并且其执行方式可能会因型号和设备而异。因此,我们通常建议您执行一些基准化分析,以评估委托对您的需求有多大帮助。这也有助于说明与将代理附加到 TensorFlow Lite 运行时相关的二进制文件大小增加的合理性。

TensorFlow Lite 具有广泛的性能和准确性评估工具,使开发者能够放心地在其应用中使用代理。下一部分将讨论这些工具。

评估工具

延迟时间和内存占用量

TensorFlow Lite 的基准测试工具可以与合适的参数配合使用,以估算模型性能,包括平均推理延迟时间、初始化开销、内存占用量等。此工具支持多个标志,以便为模型确定最佳委托配置。例如,可以使用 --use_gpu 指定 --gpu_backend=gl,以测量使用 OpenGL 的 GPU 执行情况。详细的文档中定义了支持的委托参数的完整列表。

以下示例展示了如何通过 adb 使用 GPU 运行量化模型:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

您可以在此处下载此工具的适用于 Android 64 位 ARM 架构的预构建版本(了解详情)。

准确性和准确性

代理通常以与其对应的 CPU 副本不同的精度执行计算。因此,在利用代理进行硬件加速时需要权衡准确性(通常很小)。请注意,上述情况并非始终如此;例如,由于 GPU 使用浮点精度来运行量化模型,因此精度可能会略有提高(例如,ILSVRC 图像分类方面的 Top-5 改进不到 1%)。

TensorFlow Lite 有两种类型的工具可用于衡量代理在给定模型中的行为精准度:“基于任务”和“任务无关”。本部分介绍的所有工具都支持上一部分中的基准化分析工具使用的高级委托参数。请注意,以下各小节重点介绍代理评估(代理的执行是否与 CPU 相同?)而不是模型评估(模型本身是否适合任务?)。

基于任务的评估

TensorFlow Lite 提供的工具可用于评估两项基于图像的任务的正确性:

您可以在以下位置找到这些工具的预构建二进制文件(Android、64 位 ARM 架构)和相关文档:

下面的示例演示了在 Pixel 4 上使用 GPU 进行图片分类评估

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_gpu=true

预期输出是一个从 1 到 10 的 Top-K 指标列表:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

与任务无关的评估

对于没有现成的设备端评估工具的任务,或者您要使用自定义模型进行实验,TensorFlow Lite 提供了推断差异工具。(点击此处查看 Android 64 位 ARM 二进制架构二进制文件)

推断差异会在两种设置中比较 TensorFlow Lite 的执行情况(在延迟时间和输出值偏差方面):

  • 单线程 CPU 推断
  • 用户定义的推断 - 由这些参数定义

为此,该工具会生成随机高斯数据,并将其通过两个 TFLite 解释器传递:一个运行单线程 CPU 内核,另一个由用户的参数参数化。

它会按元素测量两者的延迟时间,以及来自每个解释器的输出张量之间的绝对差。

对于具有单个输出张量的模型,输出可能如下所示:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

这意味着,对于索引为 0 的输出张量,CPU 输出中的元素与委托输出中的元素平均 1.96e-05 相差。

请注意,解读这些数字需要更深入地了解模型以及每个输出张量的含义。如果是通过简单回归确定某种得分或嵌入,则差值应该很小(否则就是委托有误)。但是,诸如 SSD 模型的“检测类”之类的输出就不太容易解读。例如,使用此工具时,它可能会显示差异,但这可能并不意味着代理存在真正的问题:请考虑两个(虚构)类:“TV (ID: 10)”和“Monitor (ID:20)”- 如果某个代理略微偏离黄金答案,并显示监控而非 TV,则此张量 2 的输出 diff 为 0 - 0。