在 Qualcomm Hexagon DSP 上加速 TensorFlow Lite
文 / 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 支持大多数 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 上运行。
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 的已发布产品功能,您可以直接分享给我们 (https://services.google.cn/fb/forms/TFCS/),也可在 Twitter 上通过 #TFLite 和 #PoweredByTF 话题与我们分享。如果遇到错误或问题,请在 GitHub 上与我们联系。
致谢
Karim Nosseir、Sachin Joglekar、Denise Ang、Jared Duke。我们要感谢 Qualcomm® Technologies 的协作者对本项目作出的贡献和提供的帮助。
注:Qualcomm® Hexagon 和 Qualcomm® Snapdragon™ 是 Qualcomm® Technologies, Inc. 和/或其子公司的产品。
如果您想详细了解 本文提及 的相关内容,请参阅以下文档。这些文档深入探讨了这篇文章中提及的许多主题:
Hexagon DSP
https://developer.qualcomm.com/software/hexagon-dsp-sdk/dsp-processorTensorFlow Lite Delegate
https://tensorflow.google.cn/lite/performance/delegatesQualcomm® Snapdragon™ SoC
https://www.qualcomm.com/snapdragon量化感知训练
https://github.com/tensorflow/tensorflow/tree/r1.13/tensorflow/contrib/quantizeHosted models
https://tensorflow.google.cn/lite/guide/hosted_models#quantized_modelsTensorFlow Lite delegate 文档
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/hexagon_delegate.mdGPU Delegate
https://tensorflow.google.cn/lite/performance/gpuSSD MobileNet V1 量化版本
https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zipSSD MobileNet V1 浮点版本
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.mdInception V3 量化版本
https://storage.googleapis.com/download.tensorflow.org/models/tflite_11_05_08/inception_v3_quant.tgzInception V3 浮点版本
https://storage.googleapis.com/download.tensorflow.org/models/tflite/model_zoo/upload_20180427/inception_v3_2018_04_27.tgz完整文档
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/hexagon_delegate.mdhexagon_nn_skel*.run
https://storage.cloud.google.com/download.tensorflow.org/tflite/hexagon_nn_skel_1_10_3_1.run加入应用
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/hexagon_delegate.md#how-to-add-shared-library-to-your-app-how-to-add-shared-library-to-your-app如此文档所示
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/hexagon_delegate.md#example-usage-from-c-example-usage-from-c8 位对称量化规范
https://tensorflow.google.cn/lite/performance/quantization_spec训练后量化感知
https://tensorflow.google.cn/lite/performance/post_training_quantization分享用例
https://services.google.cn/fb/forms/TFCS/