LiteRT:提升性能,化繁为简

2025年5月20日

在过去十年中,手机集成了功能日益强大的专用加速器,包括 GPU 以及近期推出的更强大的 NPU(Neural Processing Unit,神经处理单元)。通过在移动 GPU 和 NPU 上加速您的 AI 模型,您可以将模型速度提升至 CPU 的 25 倍,同时将功耗降低至 1/5。然而,对于大多数开发者来说,要充分发挥这些卓越的性能优势并非易事,因为这需要在使用 GPU 推理时处理特定于硬件的 API,或者在使用 NPU 推理时处理特定于供应商的 SDK、格式和运行时。

听取大家的反馈后,Google AI Edge 团队欣然宣布对 LiteRT 进行多项改进,以应对上述挑战,并提升性能,从而更轻松地加速移动端 AI 的运行。新版本包含全新的 LiteRT API,使设备端 ML 推理比以往任何时候都更加轻松;此外,我们还引入了我们最新的尖端 GPU 加速技术;与 MediaTek 和 Qualcomm 联合开发的全新 NPU 支持(开放抢先体验);以及旨在充分提升设备端应用性能的高级推理功能。让我们一起深入了解吧!


MLDrift:迄今为止最佳的 GPU 加速

GPU 一直是 LiteRT 加速的核心,提供最广泛的支持和最稳定的性能提升。MLDrift 是我们最新版本的 GPU 加速方案,通过以下方式,以更快的性能和改进进一步提升了性能,支持更大规模的模型:

  • 更智能的数据组织:MLDrift 通过使用针对 GPU 处理数据方式专门定制的优化张量布局和存储类型,以更高效的方式排列数据,从而减少内存访问时间并加快 AI 计算速度。

  • 工作组优化:基于上下文(阶段)和资源限制的智能计算

  • 改进的数据处理:简化加速器收发张量数据的方式,以减少数据传输和转换的开销,从而优化数据局部性。


这使得其性能比 CPU 快得多,也比我们之前的 TFLite GPU 代理版本以及包括 CNN 和 Transformer 模型在内的其他支持 GPU 的框架都要快。

model of LiteRT GPU compared to TFLite GPU
图:LiteRT GPU 与 TFLite GPU 针对各个模型的推理延迟对比情况(测试设备:Samsung 24)。

在我们的文档中查找示例并立即尝试 GPU 加速。


MediaTek 和 Qualcomm NPU 支持

NPU 以及专用的 AI 加速器在旗舰手机中的应用正日益普及。它们能让您更高效地运行 AI 模型,在很多情况下甚至能实现更快的运行速度。在我们的内部测试中,与 CPU 相比,NPU 的加速速度最高可提高 25 倍,能效最高可提高 5 倍。(2025 年 5 月,基于内部测试)

通常情况下,每个供应商都会提供自己的 SDK,其中包括编译器、运行时和其他依赖项,以便在他们的 SoC 上编译和执行模型。SDK 必须与特定的 SoC 版本完全匹配,并且需要正确下载和安装。LiteRT 现在提供了一种在 NPU 上开发和部署模型的统一方法,从而消除了所有这些复杂性。

  • 供应商编译器分发:在安装 LiteRT PyPI 包时,我们将自动下载用于编译模型的供应商 SDK。

  • 模型和供应商运行时分发:编译后的模型和 SoC 运行时需要随应用一同分发。开发者可以自行处理分发,也可以让 Google Play 为您分发。在我们的示例代码中,您可以了解如何使用 AI PacksFeature Delivery 将正确的模型和运行时分发到正确的设备。


我们很高兴与 MediaTek 和 Qualcomm 合作,让开发者能够使用 MediaTek 和 Qualcomm 的 NPU 加速各种经典机器学习模型,例如视觉、音频和 NLP 模型。未来一年,我们将继续加强对模型和网域的支持。

此功能目前处于不公开预览版。如需抢先体验,请点击此处申请。

classic ML models

简化的 GPU 和 NPU 硬件加速

我们简化了最新版本的 LiteRT API 的流程,从而大幅简化了 GPU 和 NPU 的使用。通过最新的改进,我们显著简化了设置流程,并新增了指定目标后端的功能。例如,开发者可以按如下方式指定 GPU 加速:

// 1. 加载模型。
    auto model = *Model::Load("mymodel.tflite");
 
// 2. 创建面向 GPU 的编译模型。
    auto compiled_model = *CompiledModel::Create(model, kLiteRtHwAcceleratorGpu);
C++

如您所见,新的 CompiledModel API 大大简化了指定模型和目标后端以进行加速的流程。


有助于实现性能优化的先进推理

虽然使用高性能后端很有帮助,但应用程序的最优性能可能会因内存或处理器瓶颈而受到阻碍。借助全新的 LiteRT API,您可以利用内置的缓冲区互操作性来消除成本高昂的内存复制操作,并通过异步执行来并行利用空闲处理器,从而应对这些挑战。


流畅的缓冲区互操作

全新的 TensorBuffer API 提供了一种使用 LiteRT 高效处理输入/输出数据的方法。您可借此直接将储存在硬件内存中的数据(例如 OpenGL 缓冲区)用作 CompiledModel 的输入或输出,从而完全消除对昂贵的 CPU 复制操作的需求。

auto tensor_buffer = *litert::TensorBuffer::CreateFromGlBuffer(tensor_type, opengl_buffer);
C++

这显著减少了不必要的 CPU 开销,并提升了性能。

此外,TensorBuffer API 在系统支持的情况下,无需复制即可在不同硬件内存类型之间实现无缝转换。试想一下,您可以轻松地将数据从 OpenGL 缓冲区转换到 OpenCL 缓冲区,甚至转换为 Android HardwareBuffer,全程无需经过任何中间 CPU 传输。

这项技术对于处理日益复杂的 AI 模型所要求的不断增长的数据量和性能至关重要。您可以在我们的文档中找到有关如何使用 TensorBuffer 的示例。


异步执行

异步执行使得 AI 模型的不同部分或独立任务能够在 CPU、GPU 和 NPU 上并行运行,从而让您能够灵活地利用来自不同处理器的可用计算周期,以提高效率和响应速度。例如:

  • CPU 可以处理数据预处理工作

  • GPU 可以加速神经网络层中的矩阵乘法,同时

  • NPU 可以有效地管理特定的推理任务——所有任务都并行进行。


在需要实时 AI 交互的应用中,可以在一个处理器上启动任务,然后在另一个处理器上继续执行其他操作。并行处理可充分减少延迟,并提供更流畅、交互性更强的用户体验。通过有效地管理和同时执行多个处理器上的计算,异步执行可充分提高系统吞吐量,并确保 AI 应用即使在繁重的计算负载下也能保持流畅和快速响应。

异步执行是通过使用操作系统层面的机制(例如在 Android/Linux 中使用的同步栅栏)来实现的,这种方式使得一个硬件加速器能够直接在另一个硬件加速器完成任务后触发操作,而无需 CPU 介入。这不仅降低了延迟(在我们的 GPU 异步演示版中最高可降低 2 倍)和功耗,同时使流水线更具确定性。

以下是使用 OpenGL 缓冲区输入进行异步推理的代码片段:

// 基于指定的 tensor_type 创建一个输入 TensorBuffer,用于封装给定的 OpenGL 缓冲区 
// env 是 LiteRT 环境对象,用于使用现有的 EGL 显示和上下文。
    auto tensor_buffer_from_opengl = *litert::TensorBuffer::CreateFromGlBuffer(env, 
    tensor_type, opengl_buffer);
 
// 创建一个输入事件并将其附加到输入缓冲区。在内部, 
// 此操作会在当前 EGL 命令队列中创建并插入一个同步栅栏对象。                                                                                                                                                                                                                                                                   
    auto input_event = *Event::CreateManaged(env, LiteRtEventTypeEglSyncFence);
    tensor_buffer_from_opengl.SetEvent(std::move(input_event));
 
// 创建输入和输出的 TensorBuffer…
 
// 异步执行推理                                                                                                                                                
    compiled_model1.RunAsync(input_buffers, output_buffers);
C++

如要了解有关如何利用异步执行的更多代码示例,请参阅我们的文档。

我们鼓励您试用最新的加速功能和性能改进技术,以便在利用最新 AI 模型的同时为您的用户带来最佳体验。为了帮助您入门,请查看我们的示例应用,其中包含完整集成的示例,演示了如何使用所有功能。

对于本博客中提到的所有新的 LiteRT 功能,均可前往 https://github.com/google-ai-edge/LiteRT 查看

要了解更多 Google AI Edge 新闻,请阅读设备端 GenAI 中的更新以及我们的新 AI Edge Portal 服务,以获得覆盖范围广泛的设备端基准测试和评估。

自 5 月 22 日起,您可以前往 io.google 上探索此公告并浏览所有 2025 年 Google I/O 大会更新。



致谢

感谢团队成员和协作者为本次版本的完善做出的贡献:Advait Jain、Alan Kelly、Alexander Shaposhnikov、Andrei Kulik、Andrew Zhang、Akshat Sharma、Byungchul Kim、Chunlei Niu、Chuo-Ling Chang、Claudio Basile、Cormac Brick、David Massoud、Dillon Sharlet、Eamon Hugh、Ekaterina Ignasheva、Fengwu Yao、Frank Ban、Frank Barchard、Gerardo Carranza、Grant Jensen、Henry Wang、Ho Ko、Jae Yoo、Jiuqiang Tang、Juhyun Lee、Julius Kammerl、Khanh LeViet、Kris Tonthat、Lin Chen、Lu Wang、Luke Boyer、Marissa Ikonomidis、Mark Sherwood、Matt Kreileder、Matthias Grundmann、Misha Gutman、Pedro Gonnet、Ping Yu、Quentin Khan、Raman Sarokin、Sachin Kotwani、Steven Toribio、Suleman Shahid、Teng-Hui Zhu、Volodymyr Kysenko、Wai Hon Law、Weiyi Wang、Youchuan Hu、Yu-Hui Chen