LiteRT 代理

代理通过以下方式启用 LiteRT 模型的硬件加速: 利用设备端加速器,如 GPU 和数字信号处理器 (DSP).

默认情况下,LitRT 会使用针对 ARM 进行了优化的 CPU 内核 霓虹色 指令集。不过,CPU 是一种多用途处理器, 必须针对机器中通常存在的重型算法进行优化 机器学习模型(例如,卷积和密集涉及的矩阵数学) 层)。

另一方面,大多数现代手机都配备了芯片 处理这些繁重的操作。利用它们进行神经网络运算 在延迟和能效方面具有巨大优势例如: GPU 可提供高达 5 倍的 加速器 延迟时间

其中每个加速器都有关联的 API,这些 API 支持自定义计算、 例如 OpenCLOpenGL ES 表示移动 GPU。通常,您需要 编写大量自定义代码来通过这些接口运行神经网络。 考虑到每个加速器都有自己的标准, 优点和缺点,无法执行神经网络中的每个运算。TensorFlow Lite 的 Delegate API 通过充当 TFLite 之间的桥梁来解决此问题。 以及这些较低级别的 API。

有代理的运行时

选择受托人

LiteRT 支持多个委托,每个委托都针对 特定平台和特定类型的模型。通常情况下 多个代理适用于您的用例,具体取决于两个主要条件: 您定位的平台(Android 还是 iOS?)以及模型类型 (浮点还是量化?)。

委托人(按平台)

跨平台(Android 和 iOS)

  • GPU 委托 - GPU 委托可在 Android 和 iOS 上使用。它 经过优化,可以运行 32 位和 16 位浮点型模型,其中 GPU 可用。它还支持 8 位量化模型,并提供 GPU 与浮动版本相当的性能有关 GPU 的详细信息 请参阅 GPU 上的 LiteRT

iOS

  • 适用于新款 iPhone 和 iPad 的 Core ML delegate - 适用于新款 iPhone 和 iPad 在支持 Neural Engine 的 iPad 上,您可以使用 Core ML delegate 来 加快 32 位或 16 位浮点模型的推断速度。Neural Engine 适用于采用 A12 SoC 或更高版本的 Apple 移动设备。对于 Core ML 委托和分步说明,请参阅 LiteRT Core ML 委托

代理(按模型类型)

每个加速器的设计都围绕特定位宽的数据进行设计。如果您 为委托 (delegate) 提供仅支持 8 位量化的浮点模型 它会拒绝所有指令,模型将完全运行 CPU为避免出现这种意外,下表简要介绍了 根据模型类型进行委托支持:

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

验证效果

本部分中的信息可作为粗略的指导, 可改进您的应用的代理。不过,请务必注意 每个委托都有其支持的预定义操作集, 因型号和设备而异。因此, 建议您执行一些基准化分析,以评估受托人 以满足您的需求这也有助于说明 将代理附加到 LiteRT 运行时。

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

评估工具

延迟时间和内存占用量

LiteRT 的基准工具可与 合适的参数来估算模型性能,包括平均推理 例如,延迟时间、初始化开销、内存占用等 多个标志来为您的模型确定最佳委托配置。对于 实例,可以使用 --use_gpu 指定 --gpu_backend=gl 以测量 GPU 使用 OpenGL 执行。支持的委托参数的完整列表请参阅 详细说明的 文档

以下示例展示了如何通过 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 不同的精度执行计算 副本。因此,您需要牺牲准确性(通常很小) 以及利用代理实现硬件加速请注意, 并非始终为 true;例如,由于 GPU 使用浮点精度 运行量化模型时,精确率可能会略有提高(例如, ILSVRC 图像分类方面的 Top-5 改进不到 1%)。

LiteRT 有两种类型的工具, 对于给定模型,则行为:“基于任务”和“任务无关”。所有工具 支持高级委托 参数 基准化分析工具所用的指标。请注意, 以下各小节侧重于委托评估(委托是否执行 而不是模型评估(模型本身是否有利于 任务?)。

基于任务的评估

LiteRT 提供了一些工具,用于评估两项基于图像的任务的正确性:

这些工具的预构建二进制文件(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

与任务无关的评估

对于没有现成的设备端评估工具的任务,或 正尝试自定义模型,LiteRT 具有推断 差异 工具。(Android,64 位 ARM 二进制架构二进制文件 此处

推断差异比较 LiteRT 执行(在延迟时间和 输出值偏差)。

  • 单线程 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

请注意,解读这些数字需要对模型有更深入的了解, 每个输出张量所代表的含义。如果是简单的回归, 差值应该很小(否则, 错误)。不过,“检测类”等输出CANNOT TRANSLATE SSD 模型的解读起来有点难。例如,它可能会显示 但这并不意味着 委托:考虑两个(虚构)类:“TV (ID: 10)”和“Monitor (ID:20)”- 如果 一个受托人对黄金真相有点偏离 该张量的输出 diff 可能高达 20-10 = 10。