https://blog.tensorflowcn.cn/2019/12/accelerating-tensorflow-lite-on-qualcomm.html
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPcfcQxnuwZ7Lm5VaXnkf1SXzq8iKIt6GYrOuy5_PfXLkGm5gRpcArzFcS8eTPRI7Y3gwGoS3s4Pf8ElSQMiJ3SNN8jag3q6mubCfsVOTPyCt6jG_dZasO4hZXGLnztz02GnStecaL8Gs/s1600/image1.png
由软件工程师 Karim Nosseir 和 Sachin Joglekar 发布
数字信号处理器 (DSP),例如
Hexagon DSP,是大多数现代手机中除了 CPU 和 GPU 之外的其他计算单元。这些芯片的主要目标是改进通信和多媒体处理,可以显著加快移动/边缘设备上的模型推理速度。DSP 通常比 GPU 更节能,对于依赖低功耗的用例至关重要。
今天,我们很高兴宣布推出一个新的
TensorFlow Lite 委托,该委托使用 Hexagon NN Direct 在数百万拥有 Hexagon DSP 的移动设备上更快地运行量化模型。通过使用它,我们能够在 MobileNet 和 Inceptionv3 等模型上看到 3-25 倍的性能提升(见下文详细信息)!
|
图 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. 和/或其子公司的产品。