前言
TensorFlow Lite 是一个轻量级的深度学习框架,专为资源受限环境设计。TensorFlow Lite 的设计重点在于优化速度和效率,以及减少模型的大小,能在边缘设备上进行实时或几乎实时的数据处理和决策。
在软件开发中,委托通常被定义为封装了一个方法的引用的一种类型,委托允许程序将方法作为参数传递给其他方法,或者定义预期某个事件发生时应调用的方法。
在 TensorFlow Lite 中,"委托"指的是一种机制,允许 TensorFlow Lite 利用特定类型的硬件加速器来执行模型的推理,将模型或模型的一部分委托给特定的硬件,显著提高执行效率和速度,同时降低能耗。
正文
是什么 为什么
TensorFlow Lite 在默认情况下使用针对 ARM Neon 指令集优化的 CPU 内核进行推理计算。虽然保证了广泛的兼容性,但CPU作为一种通用处理器,在处理机器学习模型中常见的重型计算任务时(如卷积和全连接层的矩阵运算),效率并非最优。
多数现代手机中的专用芯片( GPU 、 Qualcomm® Hexagon DSP)在处理机器学习的重型运算方面具有更高的效率。使用这些硬件加速器可以显著降低推理延迟和功耗。
Google实验表明:
GPU 可以提供高达 5 倍的加速,而 Qualcomm® Hexagon DSP 在实验中显示可以减少高达 75% 的功耗。
但直接利用这些加速器进行神经网络计算需要通过相应的低级API编写大量自定义代码。这不仅增加了开发复杂性,而且每种硬件加速器的特性和局限性都不同,它们可能无法支持神经网络中的所有操作。
TensorFlow Lite 的 Delegate API 通过作为 TFLite 运行时和这些较低级别 API 之间的桥梁,解决了这个问题。
怎么选
GPU 委托在 Android 和 iOS 上均可使用。
NNAPI 委托可用于在具有 GPU、DSP 和/或 NPU 的设备上加速模型, Android 8.1 (API 27+) 或更高版本中使用。
Hexagon 委托可用于在具有 Qualcomm Hexagon DSP 的 Android 设备上加速模型,可以在运行较旧版本 Android(不支持 NNAPI)的设备上使用。
Core ML 委托可以在提供了 Neural Engine 的较新的 iPhone 和 iPad使用,加快 32 位或 16 位 浮点模型的推断。Neural Engine 适用于具有 A12 SoC 或更高版本的 Apple 移动设备。
TFlite会自动回退到可用委托,如果选择委托不可用的话。
从模型类型上看
- 浮点数 (32 位): 32位的单精度浮点数模型。
- float16 量化: 使用16位浮点数表示的模型,量化减小了模型大小,可能会降低精度,但可以加快运算速度。
- 动态范围量化: 使用固定点数而不是浮点数的模型,通常是8位整数。
- 动态整数量化: 也是使用整数的量化模型,但与固定范围量化不同,整数量化可能涉及到不同位宽的整数。
- 量化感知训练: 这是在训练过程中就考虑到量化的模型,可以使得模型在量化后的表现更好。
不同的硬件加速器可能在计算精度方面有所不同。例如,使用标准32位浮点数的CPU可能与使用16位浮点数或者8位整数进行量化的GPU或DSP的计算精度不同。
为了在速度和模型大小上进行优化,硬件加速器常常使用比标准CPU浮点运算更低的数值精度。这种优化可能会导致计算结果与使用高精度浮点数运算的结果有所差异。
一些硬件加速器,比如GPU,在某些情况下,即使是运行量化模型,也可能会使用更高的浮点精度(如float16或float32)。在这些情况下,模型的精度可能不会下降,甚至可能有所提升。
使用不同硬件加速器时,需要在运行时间、功耗、模型大小和计算精度之间权衡。
本文参考为Tensorflow官方提供数据。