使用 LiteRT 在 Qualcomm NPU 上解锁峰值性能

发布: (2025年12月1日 GMT+8 07:25)
8 min read

Source: Google Developers Blog

2025年11月24日作者 Lu Wang,高级职员软件工程师

现代智能手机配备了复杂的 SoC(系统级芯片),包括 CPU、GPU 和 NPU,能够实现引人入胜的本地 GenAI 体验,这些体验在交互性和实时性方面远超仅依赖服务器的方案。GPU 是最常见的 AI 加速器,约有 90 % 的 Android 设备支持 GPU 计算。然而,仅依赖 GPU 会导致性能瓶颈,尤其是在构建复杂、交互式 GenAI 体验时。

设想以下场景:在设备上运行计算密集型的文本到图像生成模型,同时使用基于机器学习的分割模型处理实时相机画面。即使是最强大的移动 GPU 也会在这种组合负载下捉襟见肘,导致画面卡顿,用户体验受损。

左图为完整使用 GPU 推理时的性能瓶颈,右图为 NPU/GPU 并行处理实现的流畅用户体验。拍摄于搭载 QC Snapdragon 8 Elite 的 Samsung Galaxy S25 Ultra。

这正是 NPU(神经处理单元)发挥作用的地方。它是一种高度专用的处理器,提供 数十 TOPS(每秒万亿次运算)的专用 AI 计算能力,远超现代移动 GPU。更重要的是,NPU 在每 TOP 的功耗上显著优于 CPU 和 GPU,这对手机等电池供电的设备至关重要。NPU 已不再是小众特性;它已成为标准组件,超过 80 % 的最新 Qualcomm SoC 均内置 NPU。NPU 与 GPU、CPU 并行运行,使得重 AI 计算可以在不占用 GPU 渲染资源和 CPU 主线程逻辑的情况下完成,从而实现现代 AI 应用所需的流畅、响应迅速的性能。

GPU + NPU 流程图

引入 LiteRT Qualcomm AI Engine Direct 加速器

为了将 NPU 的强大算力带入 LiteRT(Google 的高性能本地 ML 框架),我们欣喜地宣布一次重要突破:LiteRT Qualcomm AI Engine Direct(QNN)加速器,该加速器由 Google 与 Qualcomm 紧密合作开发,取代了之前的 TFLite QNN delegate。

对开发者的关键优势

  1. 统一、简化的移动部署工作流

    • 无需直接使用低层、厂商特定的 SDK;LiteRT 已与 SoC 编译器和运行时集成,并提供简洁的 API。
    • 无需针对单个 SoC 版本进行适配;LiteRT 抽象了 SoC 之间的碎片化,使单一工作流即可在多款设备上扩展。

    现在,你可以在所有受支持的设备上无缝部署模型,支持提前编译(AOT)或本地编译。这让从 Qualcomm AI Hub 等来源获取的预训练 .tflite 模型的集成变得前所未有的简单。

  2. 业界领先的本地性能

    • 支持广泛的 LiteRT 运算符,最大化 NPU 利用率,实现 完整模型委托
    • 包含针对大型语言模型(LLM)和 GenAI 模型的专用内核和优化,使得 Gemma、FastVLM 等模型达到 SOTA 性能。

卓越性能,真实世界的结果

我们在 72 个典型的 ML 模型(视觉、音频、NLP)上对新 LiteRT QNN 加速器进行了基准测试。亮点如下:

  • 相比 CPU 提速最高 100 倍,相比 GPU 提速最高 10 倍
  • 支持 90 种 LiteRT 运算符,使 72 个模型中有 64 个 能够完整委托至 NPU。
  • 在 Qualcomm Snapdragon 8 Elite Gen 5 上,超过 56 个模型的推理时间低于 5 ms(NPU),而 CPU 仅有 13 个模型 能达到此水平。

代表性基准

LiteRT NPU 与 GPU 相对 CPU 的延迟对比
图:在搭载 Snapdragon 8 Elite Gen 5 的 Xiaomi 17 Pro Max 上测得的 LiteRT 推理延迟。数值已归一化为 CPU 基准(100 %)。GPU 将延迟降低至约 5–70 %,NPU 降至约 1–20 %。

解锁 NPU 在 LLM 推理中的全部潜能

LiteRT QNN 加速器在复杂 LLM 上提供前沿性能。我们使用 LiteRT 对 FastVLM‑0.5B 研究模型(最先进的视觉模型)进行了 AOT 编译和本地 NPU 推理的基准测试。

FastVLM 性能表格

  • 模型已量化为 int8 权重int16 激活,从而激活 NPU 的高速 int16 内核。
  • 为 Transformer 注意力层添加了 专用 NPU 内核 到 LiteRT QNN 加速器。

在 Snapdragon 8 Elite Gen 5 NPU 上的结果:

  • 首 token 时间(TTFT): 0.12 秒(针对 1024×1024 图像)。
  • 预填充速度 > 11 000 token/s解码速度 > 100 token/s

这些数据支持流畅、实时的交互体验,已在现场理解演示中得到验证——该演示能够实时处理并描述周围环境。

(视频占位符 – 原始视频未显示)

三步快速入门

步骤 1(可选):针对目标 SoC 的 AOT 编译

from ai_edge_litert.aot import aot_compile as aot_lib
from ai_edge_litert.aot.vendors.qualcomm import target as qnn_target

# 编译所有可用的 SoC
compiled_models = aot_lib.aot_compile("model.tflite")

# 或者仅为特定 Qualcomm SoC 编译(例如 Snapdragon 8 Elite Gen5)
sm8850_target = qnn_target.Target(qnn_target.SocModel.SM8850)
compiled_models = aot_lib.aot_compile(
    "model.tflite",
    target=[sm8850_target]
)

将编译好的模型导出为 Google Play AI Pack

from ai_edge_litert.aot.ai_pack import export_lib as ai_pack_export

ai_pack_export.export(
    compiled_models,
    ai_pack_dir="path/to/pack",
    ai_pack_name="my_ai_pack",
    litert_model_name="my_model"
)

完整示例请参见 LiteRT AOT 编译 notebook

步骤 2:通过 Google Play 部署本地 AI

将模型(或 AI Pack)加入 Android 项目。

本地编译 – 将原始 .tflite 文件放入 assets/
AOT 编译 – 将 AI Pack 复制到项目根目录,并在 Gradle 中引用:

// settings.gradle.kts
include(":ai_pack:my_model")

// app/build.gradle.kts
android {
    assetPacks.add(":ai_pack:my_model")
}

获取 QNN 库:

./litert_npu_runtime_libraries/fetch_qualcomm_library.sh

将运行时库作为动态特性模块添加:

// settings.gradle.kts
include(":litert_npu_runtime_libraries:runtime_strings")
include(":litert_npu_runtime_libraries:qualcomm_runtime_v79")

// app/build.gradle.kts
android {
    dynamicFeatures.add(":litert_npu_runtime_libraries:qualcomm_runtime_v79")
}
dependencies {
    implementation(project(":litert_npu_runtime_libraries:runtime_strings"))
}

完整指南请参阅 Play for On‑device AI 教程

步骤 3:使用 LiteRT Runtime API 在 NPU 上推理

// 加载模型并初始化运行时(若 NPU 不可用则回退到 GPU)
val model = CompiledModel.create(
    context.assets,
    "model/mymodel.tflite",
    CompiledModel.Options(Accelerator.NPU, Accelerator.GPU)
)

// 预分配缓冲区
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// 填充输入
inputBuffers[0].writeFloat(...)

// 执行推理
model.run(inputBuffers, outputBuffers)

// 读取输出
val result = outputBuffers[0].readFloat()

完整示例请查看 图像分割示例应用

展望未来

LiteRT Qualcomm AI Engine Direct(QNN)加速器弥合了硬件潜能与实际应用性能之间的鸿沟。我们期待看到你们利用这股力量构建的创新作品。

探索 LiteRT 开发者站点LiteRT GitHub 仓库。祝开发愉快!

致谢

特别感谢 Google ODML 团队和 Qualcomm 团队的卓越贡献:

Google ODML 团队:Alice Zheng、Advait Jain、Andrew Zhang、Arian Arfaian、Chintan Parikh、Chunlei Niu、Cormac Brick、Gerardo Carranza、Gregory Karpiak、Jingjiang Li、Jing Jin、Julius Kammerl、Lu Wang、Luke Boyer、Marissa Ikonomidis、Maria Lyubimtseva、Matt Kreileder、Matthias Grundmann、Na Li、Ping Yu、Quentin Khan、Rishika Sinha、Sachin Kotwani、Sebastian Schmidt、Steven Toribio、Teng‑Hui Zhu、Terry (Woncheol) Heoi、Vitalii Dziuba、Weiyi Wang、Yu‑Hui Chen、Zichuan We

Qualcomm LiteRT 团队:Alen Huang、Bastiaan Aarts、Brett Taylor、Chun‑Hsueh Lee (Jack)、Chun‑Po Chang (Jerry)、Chun‑Ting Lin (Graham)、Felix Baum、Jiun‑Kai Yang (Kelvin)、Krishna Sridhar、Ming‑Che Lin (Vincent)、William Lin

Back to Blog

相关文章

阅读更多 »

宣布 Data Commons Gemini CLI 扩展

自从我们在十月初推出 Gemini CLI 扩展框架以来,我们已经看到 Google 自有和第三方贡献的扩展在 op... 中呈爆炸式增长。