文 / Karim Nosseir 和 Sachin Joglekar,软件工程师
与 CPU 和 GPU 等其他计算单元一样,数字信号处理器 (Digital Signal Processors, DSP,如 Hexagon DSP)也是大多数现代手机所采用的微处理器。这些芯片专为改善通信和加快多媒体处理而开发,可以大幅提升移动设备 / 边缘设备上的模型推理速度。此外,DSP 通常也比 GPU 更具能效,而这一点对解锁依赖低功耗使用场景的用例至关重要。
今天,我们很高兴推出新的 TensorFlow Lite Delegate,该方法可以在数百万台搭载 Hexagon DSP 的移动设备上利用 Hexagon NN Direct 加速量化模型的运行。借助该方法,我们看到 MobileNet 和 Inceptionv3 等模型的性能提升了 3 到 25 倍(详情请参阅下文)!
图 1:TensorFlow Lite delegate 在运行时的工作方式概览。图中支持的运算部分在加速器上运行,而其他运算则通过 TensorFlow Lite 内核在 CPU 上运行
TensorFlow Lite delegate 能进一步实现 NNAPI 加速,并且适用于尚不支持 NNAPI 或缺少适配 DSP 的 NNAPI 驱动程序的设备。
TensorFlow Lite delegate 支持大多数 Qualcomm® Snapdragon™ SoC,包括:
- 骁龙 835 (682 DSP)
- 骁龙 660/820/821 (680 DSP)
- 骁龙 710/845 (685 DSP)
- 骁龙 855 (690 DSP)
TFLite delegate 支持哪些模型?
借助这次首发,我们旨在为通过 量化感知训练 完成训练的定点 (uint8) 模型进行推理加速。例如,这类模型包括 Hosted models 页上的量化模型变体。针对通过 Post Training 量化构建的模型,由于需要对张量进行特殊处理,我们目前正在与 Qualcomm Technologies 共同探讨此问题,因此这次暂不发布该模型。
具体而言,TensorFlow Lite delegate 能够执行许多计算量较大的运算(例如卷积层、池化层和全连接层的运算),只是需要在运行时前检查某些约束。如果不符合这类条件,则由 TensorFlow Lite 在 CPU 上执行该运算。有关运算和相应约束(如有)的完整列表,请参阅 TensorFlow Lite delegate 文档。
性能提升
为展示 Delegate 的性能提升情况,我们在三台搭载不同 Qualcomm® Snapdragon™ SoC 的设备上测试了两种常用模型。此外,我们还使用 GPU Delegate 对这些模型的浮点版本进行基准推理,以作比较。
模型
我们已通过量化感知训练完成了 量化模型的训练。
- SSD MobileNet V1 [下载:量化版本 (备用链接)、浮点版本]:对象检测
- 小模型,部分运算在 Hexagon DSP 上运行。后处理运算在 CPU 上运行。
- Inception V3 [下载:量化版本 (备用链接)、浮点版本 (备用链接)]:图像分类
- 大模型,大部分运算在 Hexagon DSP 上运行。
设备(搭载 Qualcomm® Snapdragon™ SoC)
- Oppo K1(骁龙 660、Android 8.1)
- Vivo Z3(骁龙 710、Android 8.1)
- Samsung S9(骁龙 845、Android 9)
图 2:针对 SSD MobileNet V1 观察到的延迟和加速情况(在 Hexagon 上)。GPU 版本使用浮点模型,而 CPU/Hexagon 运行量化版本。CPU 基线表示单线程 TensorFlow Lite 内核
图 3:针对 Inception-V3 观察到的延迟和加速情况(在 Hexagon 上)。GPU 版本使用浮点模型,而 CPU/Hexagon 运行量化版本。CPU 基线表示单线程 TensorFlow Lite 内核
如何使用新 Delegate?
本节简单概述 Hexagon Delegate 的使用方法。请注意,由于不涉及设备特定编码,因此您只需使用新代理实例调用 Tensorflow Lite 的 “Interpreter”。如需了解详情,请 参阅完整文档。
第 1 步:添加 TensorFlow Lite Hexagon AAR 文件
在应用中添加 “tensorflow-lite-hexagon.aar”,这是除标准 tensorflow-lite AAR(Nightly 或 Release 版本)外所添加的另一个文件。
第 2 步:获取 Hexagon 库
运行 “hexagon_nn_skel*.run” (备用链接),然后接受许可协议。系统应当会提供 3 种 需加入应用 的不同共享库。此代理会根据当前设备自动选择性能最佳的共享库。
第 3 步:使用运行时 Delegate API
在推理过程中使用 Java API(如下例所示)或 C 语言 API(如此文档所示)调用 TensorFlow Lite 代理。
Java 示例
// 创建代理实例。.
Interpreter.Options tfliteOptions = new Interpreter.Options ();
try {
HexagonDelegate hexagonDelegate = new HexagonDelegate (activity);
tfliteOptions.addDelegate (hexagonDelegate);
} catch (UnsupportedOperationException e) {
// 此设备不支持 Hexagon 代理。
}
tfliteInterpreter = new Interpreter (tfliteModel, tfliteOptions);
// 执行推理。
while (true) {
writeToInputTensor (inputTensor);
tfliteInterpreter.run (inputTensor, outputTensor);
readFromOutputTensor (outputTensor);
}
// 完成推理后丢弃代理。
tfliteInterpreter.close ();
if (hexagonDelegate != null) {
hexagonDelegate.close ();
}
二进制文件大小
如果处理器采用 arm64-v8a 或 armeabi-v7a 架构,则 Hexagon 代理代码预计会使 Android APK 规模分别增加 380KB 或 202KB。此外,Hexagon DSP 库还需额外占用 3MB 存储空间。如果您明确知道目标处理器所采用的架构 (v65/v66/v60),则该库所需的存储空间就能降至 1MB。我们正在与 Qualcomm® Technologies 合作,共同研究进一步缩减文件大小的方法。
未来工作
未来几个月,我们将进一步改进现有代理,进而支持更多算子并实现更多优化。
此外,我们还计划添加对 8 位对称量化规范的支持。如此一来,我们就可以用 Post Training 量化 工具加速模型量化。
反馈
这是从开发者中收集到的功能需求之一。我们很高兴推出此功能,也期待收到您的反馈与建议。
如果您有使用基于 TensorFlow 的已发布产品功能,您可以在通过这个链接提交您的 使用案例,或在微信公众号 TensorFlow 留言与我们分享。如果遇到错误或问题,请在 GitHub 上与我们联系。
致谢
Karim Nosseir、Sachin Joglekar、Denise Ang、Jared Duke。我们要感谢 Qualcomm® Technologies 的协作者对本项目作出的贡献和提供的帮助。
注:Qualcomm® Hexagon 和 Qualcomm® Snapdragon™ 是 Qualcomm® Technologies, Inc. 和 / 或其子公司的产品。
本文备用下载链接缓存于 4/25/2020。
原文:Accelerating TensorFlow Lite on Qualcomm Hexagon DSPs / 译:TensorFlow 公众号