代理通过以下方式启用 LiteRT 模型的硬件加速: 利用设备端加速器,如 GPU 和数字信号处理器 (DSP).
默认情况下,LitRT 会使用针对 ARM 进行了优化的 CPU 内核 霓虹色 指令集。不过,CPU 是一种多用途处理器, 必须针对机器中通常存在的重型算法进行优化 机器学习模型(例如,卷积和密集涉及的矩阵数学) 层)。
另一方面,大多数现代手机都配备了芯片 处理这些繁重的操作。利用它们进行神经网络运算 在延迟和能效方面具有巨大优势例如: GPU 可提供高达 5 倍的 加速器 延迟时间
其中每个加速器都有关联的 API,这些 API 支持自定义计算、 例如 OpenCL 或 OpenGL 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 提供了一些工具,用于评估两项基于图像的任务的正确性:
ILSVRC 2012(图片 分类)使用 top-K 准确率
COCO 对象检测(具有边界框) 平均精确率<ph type="x-smartling-placeholder"></ph> (mAP)
这些工具的预构建二进制文件(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。