查看原文
其他

在 Qualcomm Hexagon DSP 上加速 TensorFlow Lite

Google TensorFlow 2021-08-05

文 / 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 的已发布产品功能,您可以直接分享给我们 (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-processor

  • TensorFlow Lite Delegate
    https://tensorflow.google.cn/lite/performance/delegates

  • Qualcomm® Snapdragon™ SoC
    https://www.qualcomm.com/snapdragon

  • 量化感知训练
    https://github.com/tensorflow/tensorflow/tree/r1.13/tensorflow/contrib/quantize

  • Hosted models
    https://tensorflow.google.cn/lite/guide/hosted_models#quantized_models

  • TensorFlow Lite delegate 文档
    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/hexagon_delegate.md

  • GPU Delegate
    https://tensorflow.google.cn/lite/performance/gpu

  • SSD MobileNet V1 量化版本
    https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip

  • SSD MobileNet V1 浮点版本
    https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

  • Inception V3 量化版本
    https://storage.googleapis.com/download.tensorflow.org/models/tflite_11_05_08/inception_v3_quant.tgz

  • Inception 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.md

  • hexagon_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-c

  • 8 位对称量化规范
    https://tensorflow.google.cn/lite/performance/quantization_spec

  • 训练后量化感知
    https://tensorflow.google.cn/lite/performance/post_training_quantization

  • 分享用例
    https://services.google.cn/fb/forms/TFCS/



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存