在 Qualcomm Hexagon DSP 上加速 TensorFlow Lite
2019 年 12 月 16 日
由软件工程师 Karim Nosseir 和 Sachin Joglekar 发布

数字信号处理器 (DSP),例如 Hexagon DSP,是大多数现代手机中除了 CPU 和 GPU 之外的其他计算单元。这些芯片的主要目标是改进通信和多媒体处理,可以显著加快移动/边缘设备上的模型推理速度。DSP 通常比 GPU 更节能,对于依赖低功耗的用例至关重要。

TensorFlow Lite with Qualcomm
今天,我们很高兴宣布推出一个新的 TensorFlow Lite 委托,该委托使用 Hexagon NN Direct 在数百万拥有 Hexagon DSP 的移动设备上更快地运行量化模型。通过使用它,我们能够在 MobileNet 和 Inceptionv3 等模型上看到 3-25 倍的性能提升(见下文详细信息)!
High-level overview of how a delegate works at runtime.
图 1:运行时委托工作原理的高级概述。图的受支持部分在加速器上运行,而其他操作通过 TensorFlow Lite 内核在 CPU 上运行
此委托补充了 NNAPI 加速,适用于尚不支持 NNAPI 或没有 DSP 的 NNAPI 驱动程序的设备。

该委托支持大多数 Qualcomm® Snapdragon™ SoC,包括
  • Snapdragon 835 (682 DSP)
  • Snapdragon 660/820/821 (680 DSP)
  • Snapdragon 710/845 (685 DSP)
  • Snapdragon 855 (690 DSP)

支持哪些模型?

通过此次初始发布,我们的目标是加快使用 量化感知训练 训练的定点(uint8)模型的推理速度。此类模型的示例包括我们 托管模型 页面上的量化变体。使用训练后量化构建的模型需要对它们的张量进行特殊处理,我们目前正在与 Qualcomm Technologies 共同探索,此次发布中未包含。

具体来说,该委托能够运行许多计算量大的操作,例如卷积、池化和全连接层,尽管在运行时委托之前会进行一些检查约束。不满足条件的操作由 TensorFlow Lite 在 CPU 上运行。操作的完整列表以及相应的限制(如果有)在 委托文档 中给出。

性能提升

为了展示新委托的性能提升,我们在三台具有不同 Qualcomm® Snapdragon™ SoC 的设备上对两个常见模型进行了测试。我们还对这些模型的浮点版本使用我们的 GPU 委托 进行了基准测试,以进行比较。

模型

量化模型已使用 量化感知训练 训练。
  • SSD MobileNet V1 [下载:量化浮点]:目标检测
    • 小型模型,部分在 Hexagon DSP 上运行。后处理在 CPU 上运行。
  • Inception V3 [下载:量化浮点]:图像分类
    • 大型模型,主要在 Hexagon DSP 上运行。

设备(以及 Qualcomm® Snapdragon™ SoC)

  • Oppo K1 (Snapdragon 660,Android 8.1)
  • Vivo Z3 (Snapdragon 710,Android 8.1)
  • Samsung S9 (Snapdragon 845,Android 9)

图 2:SSD MobileNet V1 的延迟和加速(在 Hexagon 上)观察结果。GPU 版本使用浮点模型,而 CPU/Hexagon 运行量化版本。CPU 基线表示单线程 TensorFlow Lite 内核。
图 3:Inception-V3 的延迟和加速(在 Hexagon 上)观察结果。GPU 版本使用浮点模型,而 CPU/Hexagon 运行量化版本。CPU 基线表示单线程 TensorFlow Lite 内核。

如何使用它?

本节简要介绍了 Hexagon 委托的使用情况。请注意,这里没有涉及设备特定的编码 - 您只需在 Tensorflow Lite `Interpreter` 上调用一个新的委托实例即可。有关详细说明,请参阅 完整文档

步骤 1:添加 TensorFlow Lite Hexagon AAR
将“tensorflow-lite-hexagon.aar”添加到您的应用程序中 - 除了标准 tensorflow-lite AAR(夜间版或发布版)之外。

步骤 2:获取 Hexagon 库
运行“hexagon_nn_skel*.run”并接受许可协议。它应该提供 3 个不同的共享库,需要 包含在您的应用程序中。委托会根据设备自动选择性能最佳的库。

步骤 3:在运行时使用委托 API
使用 Java API(以下示例)或 C API(如文档所示)在推理期间调用 TensorFlow Lite 委托。

Java 示例

// Create the Delegate instance.
Interpreter.Options tfliteOptions = new Interpreter.Options();
try {
  HexagonDelegate hexagonDelegate = new HexagonDelegate(activity);
  tfliteOptions.addDelegate(hexagonDelegate);
} catch (UnsupportedOperationException e) {
  // Hexagon delegate is not supported on this device.
}

tfliteInterpreter = new Interpreter(tfliteModel, tfliteOptions);

// Run inference.
while (true) {
  writeToInputTensor(inputTensor);
  tfliteInterpreter.run(inputTensor, outputTensor);
  readFromOutputTensor(outputTensor);
}

// Dispose of the delegate after being done.
tfliteInterpreter.close();
if (hexagonDelegate != null) {
  hexagonDelegate.close();
}

二进制大小

预计 Hexagon 委托代码将为 arm64-v8a 添加大约 380KB,或为 armeabi-v7a 添加 202KB,以添加到您的 Android APK 中。Hexagon DSP 库需要另外 3MB。如果您知道要定位的确切架构 (v65/v66/v60),则可以减少到 1MB。我们正在与 Qualcomm® Technologies 合作,寻求进一步减少这种大小的方法。

未来工作

在接下来的几个月里,我们将通过更多操作覆盖和额外的优化来改进现有委托。

添加对我们 8 位对称量化规范 的支持也列入了路线图。这将允许加速使用新的 训练后量化 工具量化的模型。

反馈

这是我们从开发人员那里收到的一个常见功能请求。我们很高兴发布它,并期待听到您的想法。分享您的用例,直接或在 Twitter 上使用 #TFLite 和 #PoweredByTF。对于错误或问题,请在 Github 上联系我们。

鸣谢

Karim Nosseir、Sachin Joglekar、Denise Ang、Jared Duke。我们要感谢我们与 Qualcomm® Technologies 的合作者为实现这一目标所做出的贡献和帮助。

注意:Qualcomm® Hexagon 和 Qualcomm® Snapdragon™ 是 Qualcomm® Technologies, Inc. 和/或其子公司的产品。


下一篇文章
Accelerating TensorFlow Lite on Qualcomm Hexagon DSPs

由软件工程师 Karim Nosseir 和 Sachin Joglekar 发布

数字信号处理器 (DSP),例如 Hexagon DSP,是大多数现代手机中除了 CPU 和 GPU 之外的其他计算单元。这些芯片的主要目标是改进通信和多媒体处理,可以显著加快移动/边缘设备上的模型推理速度。DSP 通常比 GPU 更节能,对于依赖低功耗的用例至关重要。…