Android 版 LiteRT

借助 LiteRT,您可以在 Android 应用中运行 TensorFlow、PyTorch 和 JAX 模型。LiteRT 系统提供预构建且可自定义的执行环境,以便在 Android 上快速高效地运行模型,包括硬件加速选项。

如需查看使用 LiteRT 的 Android 应用示例,请参阅 LiteRT 示例代码库。

机器学习模型

LiteRT 使用 TensorFlow、PyTorch 和 JAX 模型,这些模型会转换为更小、更便携、更高效的机器学习模型格式。您可以在 Android 上使用预构建模型搭配 LiteRT,也可以构建自己的模型并将其转换为 LiteRT 格式。

本页面讨论了如何使用已构建的机器学习模型,但未涵盖模型的构建、训练、测试或转换。如需详细了解如何为 LiteRT 选择、修改、构建和转换机器学习模型,请参阅模型页面。

在 Android 上运行模型

在 Android 应用内运行的 LiteRT 模型会接收数据、处理数据,并根据模型的逻辑生成预测结果。LiteRT 模型需要特殊的运行时环境才能执行,并且传递给模型的数据必须采用特定的数据格式,称为张量。当模型处理数据(称为运行推理)时,它会生成预测结果作为新的张量,并将其传递给 Android 应用,以便该应用采取行动,例如向用户显示结果或执行其他业务逻辑。

Android 应用中 LiteRT 模型的功能执行流程

图 1. Android 应用中 LiteRT 模型的功能执行流程。

在功能设计层面,您的 Android 应用需要以下元素才能运行 LiteRT 模型:

  • 用于执行模型的 LiteRT 运行时环境
  • 用于将数据转换为张量的模型输入处理程序
  • 模型输出处理程序,用于接收输出结果张量并将其解读为预测结果

以下部分介绍了 LiteRT 库和工具如何提供这些功能元素。

使用 LiteRT 构建应用

本部分介绍了在 Android 应用中实现 LiteRT 的推荐最常见途径。您应重点关注运行时环境开发库部分。如果您已开发自定义模型,请务必查看高级开发途径部分。

运行时环境选项

您可以通过多种方式为 Android 应用中的模型执行启用运行时环境。以下是首选选项:

一般来说,您应使用 Google Play 服务提供的运行时环境,因为与标准环境相比,它更节省空间,并且会动态加载,从而使应用大小更小。Google Play 服务还会自动使用 LiteRT 运行时的最新稳定版本,让您随着时间的推移获得更多功能并提升性能。如果您在不包含 Google Play 服务的设备上提供应用,或者需要密切管理 ML 运行时环境,则应使用标准 LiteRT 运行时。此选项会将额外的代码捆绑到您的应用中,让您可以更好地控制应用中的机器学习运行时,但代价是应用下载大小会增加。

您可以通过向应用开发环境添加 LiteRT 开发库,在 Android 应用中访问这些运行时环境。如需了解如何在应用中使用标准运行时环境,请参阅下一部分。

您可以使用 Google Play 服务访问 Interpreter API。您可以在 Android 应用中使用 LiteRT 核心支持库。如需详细了解如何使用 LiteRT 库和运行时环境进行编程,请参阅 Android 开发工具

获取模型

在 Android 应用中运行模型需要使用 LiteRT 格式的模型。您可以使用预构建的模型,也可以构建模型并将其转换为 Lite 格式。如需详细了解如何为 Android 应用获取模型,请参阅 LiteRT 模型页面。

处理输入数据

您传递到机器学习模型中的任何数据都必须是具有特定数据结构的张量,通常称为张量的“形状”。如需使用模型处理数据,您的应用代码必须将数据从其原生格式(例如图片、文本或音频数据)转换为模型所需的形状的张量。

运行推理

通过模型处理数据以生成预测结果的过程称为运行推理。在 Android 应用中运行推理需要 LiteRT 运行时环境模型输入数据

模型在特定设备上生成推理的速度取决于处理的数据量、模型的复杂程度以及可用的计算资源(例如内存和 CPU)或称为加速器的专用处理器。机器学习模型可以在图形处理单元 (GPU) 和张量处理单元 (TPU) 等专用处理器上更快地运行,方法是使用名为委托的 LiteRT 硬件驱动程序。如需详细了解委托和模型处理的硬件加速,请参阅硬件加速概览

处理输出结果

模型会以张量的形式生成预测结果,您的 Android 应用必须通过采取行动或向用户显示结果来处理这些张量。模型输出结果可以很简单,例如图片分类的单个结果对应的数字(0 = 狗,1 = 猫,2 = 鸟);也可以非常复杂,例如图片中多个分类对象的多个边界框,以及介于 0 和 1 之间的预测置信度评级。

高级开发途径

使用更复杂和自定义的 LiteRT 模型时,您可能需要使用比上述方法更高级的开发方法。以下各部分将介绍在 Android 应用中执行模型并针对 LiteRT 开发模型的高级技巧。

高级运行时环境

除了 LiteRT 的标准运行时和 Google Play 服务运行时环境之外,您还可以将其他运行时环境用于 Android 应用。如果您有一个机器学习模型使用 LiteRT 的标准运行时环境不支持的机器学习操作,则最有可能使用这些环境。

借助 LiteRT Flex 运行时,您可以添加模型所需的特定运算符。作为运行模型的高级选项,您可以为 Android 构建 LiteRT,以包含运行 TensorFlow 机器学习模型所需的操作符和其他功能。如需了解详情,请参阅为 Android 构建 LiteRT

C 和 C++ API

LiteRT 还提供了一个 API,用于使用 C 和 C++ 运行模型。如果您的应用使用 Android NDK,则应考虑使用此 API。如果您希望能够在多个平台之间共享代码,也可以考虑使用此 API。如需详细了解此开发选项,请参阅开发工具页面。

基于服务器的模型执行

一般来说,您应该在 Android 设备上运行应用中的模型,以便为用户提供更低的延迟时间和更出色的数据隐私保护。不过,在某些情况下,在云服务器上运行模型(而非在设备上运行)是更好的解决方案。例如,如果您有一个大型模型,但该模型无法轻松压缩到适合用户 Android 设备的大小,或者无法在这些设备上以合理的性能执行。如果您最看重的是模型在各种设备上的一致性能,那么此方法也可能是您的首选解决方案。

Google Cloud 提供了一整套用于运行 AI 模型的服务。如需了解详情,请参阅 Google Cloud 的 AI 和机器学习产品页面。

自定义模型开发和优化

更高级的开发途径可能包括开发自定义机器学习模型,以及优化这些模型以在 Android 设备上使用。如果您计划构建自定义模型,请务必考虑对模型应用量化技术,以降低内存和处理成本。如需详细了解如何构建高性能模型以搭配 LiteRT 使用,请参阅“模型”部分中的性能最佳实践

支持的 Android 版本

LiteRT 版本 状态 最低 SDK 级别 最低 NDK 版本(如果使用) 发行日期
v1.2.0 ⚠️ 已弃用 21 (Android 5 Lollipop) r26a 2025-03-13
v1.3.0 ⚠️ 已弃用 21 (Android 5 Lollipop) r26a 2025-05-19
v1.4.0 ⚠️ 已弃用 26 (Android 8 Oreo) r26a 2025-06-25
v1.4.1 ✅ 有效 21 (Android 5 Lollipop) r26a 2025-11-07
v2.0.3 ✅ 有效 26 (Android 8 Oreo) r26a 2025-11-08
v2.1.0 即将推出 23(Android 6 Marshmallow) r26a 尚未发布

重要提示请及时更新依赖项,以确保与最新功能和安全更新保持兼容。

编译模型 API 与解释器 API

  • 已编译模型 API - 优先使用加速器,通过统一的缓冲区互操作和异步流水线进行 AOT/JIT 编译执行。
  • Interpreter API - 向后兼容现有的 TensorFlow Lite 样式代码。

您可以在运行时选择任一 API;大多数新的性能和加速器功能都位于 Compiled Model API 中。

如需查看实现示例,请参阅:

通用和 CPU

运行时功能 Interpreter API 已编译模型 API
性能分析
错误报告程序
I/O 缓冲区互操作(TensorBuffer/环境) --
选择开箱即用的加速器 --
同步执行
自定义操作
XNNPACK 配置
动态形状

GPU

运行时功能 Interpreter API 已编译模型 API
同步执行
内存缓存
CPU 回退
异步执行 --
零复制缓冲区 (AHWB/GLBuffer/纹理) --
MLD OpenCL 后端
MLD WebGPU 后端(新) --
MLD Metal 支持(新) --

NPU

运行时功能 Interpreter API 已编译模型 API
同步执行
异步执行 (Pixel) --
CPU 回退
GPU 回退 --
零缓冲区复制 (AHWB) --
QC/MTK AOT --
Pixel AOT --
QC/MTK/Pixel JIT --

快速入门(已编译模型 API)

使用已编译的模型 API 运行推理涉及以下关键步骤:

  1. 加载兼容的模型。
  2. 分配输入和输出张量缓冲区。
  3. 调用已编译的模型。
  4. 将推理结果读入输出缓冲区。

以下代码段展示了整个流程在 Kotlin 和 C++ 中的基本实现。

C++

// Load model and initialize runtime
LITERT_ASSIGN_OR_RETURN(auto model, Model::CreateFromFile("mymodel.tflite"));
LITERT_ASSIGN_OR_RETURN(auto env, Environment::Create({}));
LITERT_ASSIGN_OR_RETURN(auto compiled_model,
    CompiledModel::Create(env, model, kLiteRtHwAcceleratorCpu));

// Preallocate input/output buffers
LITERT_ASSIGN_OR_RETURN(auto input_buffers, compiled_model.CreateInputBuffers());
LITERT_ASSIGN_OR_RETURN(auto output_buffers, compiled_model.CreateOutputBuffers());

// Fill the first input
float input_values[] = { /* your data */ };
input_buffers[0].Write<float>(absl::MakeConstSpan(input_values, /*size*/));

// Invoke
compiled_model.Run(input_buffers, output_buffers);

// Read the output
std::vector<float> data(output_data_size);
output_buffers[0].Read<float>(absl::MakeSpan(data));

Kotlin

// Load model and initialize runtime
val  model =
    CompiledModel.create(
        context.assets,
        "mymodel.tflite",
        CompiledModel.Options(Accelerator.CPU)
    )

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

// Invoke
model.run(inputBuffers, outputBuffers)

// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

如需了解详情,请参阅 Kotlin 使用入门C++ 使用入门指南。

主要功能(已编译模型 API)

  • 开箱即用的加速器选择和异步 - 在创建时选择 CPU/GPU/NPU,并以异步方式运行,无需委托管道。
  • 统一的零复制缓冲区 - 在预处理/后处理和推理之间共享 AHWB/GL/OpenCL/WebGPU/Metal 缓冲区。
  • 生成就绪吞吐量 - 针对具有内存缓存和 GPU/NPU 回退的大型模型进行了优化。

对于现有的 TensorFlow Lite 代码库,Interpreter API 仍然是兼容性路径;当您需要稳定的委托行为或期望使用经典解释器的第三方封装容器时,请使用此 API。

加速器

  • CPU(默认):经过 XNNPACK 优化,支持动态形状。
  • GPU:目前为 OpenCL 后端;WebGPU 和 Metal 后端可通过 Compiled Model API 使用。
  • NPU:支持 Qualcomm AI Engine Direct 和 MediaTek NeuroPilot 的 AOT/JIT;Pixel AOT 可用;计划支持 Apple/Intel NPU。

何时选择 API

  • 如果您希望以最快的方式访问 GPU/NPU、零复制缓冲区或异步执行,请使用编译模型 API
  • 如果您需要最大限度地兼容现有的 TensorFlow Lite 代码、工具或委托,请使用解释器 API