https://blog.tensorflowcn.cn/2020/04/tensorflow-lite-core-ml-delegate-faster-inference-iphones-ipads.html
作者:Tei Jeong 和 Karim Nosseir,软件工程师
TensorFlow Lite 提供了将模型推理的一部分或整个模型推理委托给加速器的选项,例如 GPU、DSP 和/或 NPU,以实现高效的移动推理。在 Android 上,您可以从多个代理中选择:
NNAPI、
GPU 以及最近添加的
Hexagon 代理。以前,对于苹果的移动设备(iPhone 和 iPad)来说,唯一的选择是 GPU 代理。
当苹果发布其机器学习框架
Core ML 和 Neural Engine(苹果 Bionic SoC 中的神经处理单元 (NPU))时,这使得 TensorFlow Lite 可以利用苹果的硬件。
神经处理单元 (NPU),类似于 Google 的
Edge TPU 和苹果的 Neural Engine,是专门设计的硬件加速器,旨在加速机器学习应用程序。这些芯片旨在加快移动或边缘设备上的模型推理速度,并比在 CPU 或 GPU 上运行推理消耗更少的能量。
今天,我们很高兴宣布一个新的
TensorFlow Lite 代理,它使用苹果的 Core ML API 在带有 Neural Engine 的 iPhone 和 iPad 上更快地运行浮点模型。我们能够看到 MobileNet 和 Inception V3 等模型的性能提升高达 14 倍(见下文详细信息)。
|
图 1:运行时代理工作原理的高级概述。图形的支持部分在加速器上运行,而其他操作通过 TensorFlow Lite 内核在 CPU 上运行。 |
哪些设备受支持?
此代理在运行 iOS 12 或更高版本的 iOS 设备(包括 iPadOS)上运行。但是,要获得真正的性能优势,它应该在带有
Apple A12 SoC 或更高版本的设备上运行(例如,iPhone XS)。对于较旧的 iPhone,您应该使用
TensorFlow Lite GPU 代理 来获得更快的性能。
哪些模型受支持?
在此初始发布中,支持 32 位浮点模型。一些受支持模型的示例包括但不限于图像分类、目标检测、目标分割和姿态估计模型。代理支持许多计算密集型操作,例如卷积,尽管某些操作存在某些限制。这些限制在运行时进行委托之前进行检查,因此不受支持的操作会自动回退到 CPU。操作的完整列表以及相应的限制(如果有)在
代理的文档 中。
对性能的影响
我们使用两个常见的浮点模型 MobileNet V2 和 Inception V3 测试了代理。基准测试是在 iPhone 8+(A11 SoC)、iPhone XS(A12 SoC)和 iPhone 11 Pro(A13 SoC)上进行的,并针对三个代理选项进行了测试:仅 CPU(无代理)、GPU 和 Core ML 代理。如前所述,您可以在具有 A12 SoC 或更高版本的模型上看到加速性能,但在 iPhone 8+ 上(第三方无法使用 Neural Engine)——使用 Core ML 代理时,小型模型没有观察到性能提升。对于大型模型,性能类似于 GPU 代理。
除了模型推理延迟之外,我们还测量了启动延迟。请注意,加速速度是以延迟启动为代价的。对于 Core ML 代理,启动延迟会随着模型大小的增加而增加。例如,在 MobileNet 等小型模型上,我们观察到 200-400 毫秒的启动延迟。另一方面,对于 Inception V3 等大型模型,启动延迟可能为 2-4 秒。我们正在努力减少启动延迟。代理也会影响二进制大小。使用 Core ML 代理可能会使二进制大小增加多达 1 MB。
模型
MobileNet V2 (1.0, 224, float) [下载] : 图像分类
设备
- iPhone 8+(Apple A11,iOS 13.2.3)
- iPhone XS(Apple A12,iOS 13.2.3)
- iPhone 11 Pro(Apple A13,iOS 13.2.3)
MobileNet V2 观察到的延迟和加速
|
图 2:MobileNet V2 观察到的延迟和加速。所有版本都使用浮点模型。CPU 基线表示双线程 TensorFlow Lite 内核。 * GPU:Core ML 使用 CPU 和 GPU 进行推理。NPU:Core ML 使用 CPU 和 GPU,以及 NPU(神经引擎)进行推理。 |
Inception V3 观察到的延迟和加速
|
图 3:Inception V3 观察到的延迟和加速。所有版本都使用浮点模型。CPU 基线表示双线程 TensorFlow Lite 内核。 * GPU:Core ML 使用 CPU 和 GPU 进行推理。NPU:Core ML 使用 CPU 和 GPU,以及 NPU(神经引擎)进行推理。 |
如何使用它?
您只需使用新代理实例在 TensorFlow Lite
Interpreter
上进行调用即可。有关详细说明,请阅读
完整文档。您可以使用 Swift API(以下示例)或 C++ API(如文档所示)在推理过程中调用 TensorFlow Lite 代理。
Swift 示例
这是从典型的 Swift 应用程序调用此代理的样子。您只需创建一个新的 Core ML 代理并将其传递给原始解释器初始化代码。
let coreMLDelegate = CoreMLDelegate()
let interpreter = try Interpreter(modelPath: modelPath,
delegates: [coreMLDelegate])
未来的工作
在接下来的几个月中,我们将通过更多操作覆盖和额外的优化来改进现有的代理。支持使用
训练后浮点 16 量化 训练的模型正在路线图中。这将允许加速模型,模型大小减半,精度损失很小。
支持
训练后权重量化(也称为动态量化)也在路线图中。
反馈
这是我们开发人员的常见功能请求。我们很高兴发布它,并期待听到您的想法。
分享您的用例,可以直接分享或在 Twitter 上使用标签 #TFLite 和 #PoweredByTF。对于错误或问题,请在
GitHub 上联系我们。
致谢
感谢 Tei Jeong、Karim Nosseir、Sachin Joglekar、Jared Duke、Wei Wei、Khanh LeViet。
注意:Core ML、Neural Engine 和 Bionic SoC(A12、A13)是 Apple Inc. 的产品。