用途
该技能用于在 Android 应用中通过 LiteRT 的 CompiledModel API(com.google.ai.edge.litert:litert 2.x)运行 .tflite 模型,支持 CPU 与 GPU 加速器。它明确要求不要使用已弃用的 org.tensorflow.lite.Interpreter API;对于使用 .litertlm 文件的开放文本语言模型,建议改用 litert-lm 技能。
主要能力
- 配置 Gradle:在 app/build.gradle.kts 中设置 minSdk = 24,并添加 implementation("com.google.ai.edge.litert:litert:2.3.0") 与 implementation("com.google.ai.edge.litert:litert-gpu:2.3.0")。2.3.0 起 GPU 加速器为独立产物;仅引入 litert 时应用可构建,但 CompiledModel.create 使用 Accelerator.GPU 会抛 LiteRtException(Logcat 显示 GPU accelerator could not be loaded and registered)。无需在 manifest 中额外声明,litert-api 的 manifest 已声明 OpenCL 驱动库(uses-native-library)。
- 模型投放:将模型放在 app/src/main/assets/model.tflite(AGP 默认不压缩 .tflite)。超过基础 APK 大小限制的模型可通过 Play for On-Device AI 以 AI pack 交付,或下载到 context.filesDir。快速跟进或按需 AI pack、下载文件可用 CompiledModel.create(filePath, CompiledModel.Options(accelerator), environment) 加载。AI pack 目录通过 AI Delivery 库(com.google.android.play:ai-delivery)的 AiPackManagerFactory.getInstance(context).getPackLocation(name)?.assetsPath() 获取,包未下载完成前返回 null。
- 推理辅助类:将 CompiledModel 与 TensorBuffer 封装在不含 Android UI 类型的 AutoCloseable 辅助类中,用 createInputBuffers 和 createOutputBuffers 一次性分配缓冲区并跨次推理复用,关闭时先关所有输入输出缓冲区再关模型。一个进程共用一个 Environment,使 GPU 加速库只加载一次。构造函数末尾执行一次预热推理,init 任一步骤抛异常时先调用 close 再重新抛出。INPUT_SIZE 为模型输入元素个数;int8/uint8 张量应使用 writeInt8 与 readInt8 而非 writeFloat 与 readFloat。
- ViewModel 与 Compose 接入:在 AndroidViewModel 中用单线程执行器驱动辅助类,GPU 编译失败时回退到 Accelerator.CPU,向 Compose UI 暴露不可变状态。ViewModel 使用自有 CoroutineScope,因为 viewModelScope 在 onCleared 前已取消,在其中启动的 close 不会执行。
- 输入预处理:preprocess 需匹配模型的输入尺寸、归一化均值与标准差、通道顺序和内存布局(示例为 NHWC、RGB、缩放到 -1.0..1.0)。缩放后的位图需复制为 Bitmap.Config.ARGB_8888,因为 Android 9 及以上 ImageDecoder 默认返回 HARDWARE 位图且 getPixels 无法读取。缩放不保持宽高比,若模型需中心裁剪应先裁剪。音频或嵌入模型替换 preprocess 的输入编码,推理类保持不变。
- 真机验证:先在 Accelerator.CPU 上、再在 Accelerator.GPU 上,将应用对固定输入的输出与模型参考输出比对,并遵循设备验证要求。
- 迁移指引:从 org.tensorflow.lite.Interpreter 迁移时替换依赖(移除 org.tensorflow:tensorflow-lite*,改用 com.google.ai.edge.litert:*;如需 Support 或 Metadata 工具用 litert-support:2.3.0 与 litert-metadata:2.3.0 并重命名导入包)、用 CompiledModel.create 替换 FileUtil.loadMappedFile 与 Interpreter、用 CompiledModel.Options(Accelerator.GPU) 替换 GpuDelegate、用 writeFloat/run/readFloat 替换 interpreter.run、用 bufferedReader 与 readLines 替代 FileUtil.loadLabels。
关键约束
- 单线程约束:创建、推理与关闭必须在同一后台线程执行,绝不在主线程。
- 缓冲区生命周期:每次推理不得新建 TensorBuffer,否则泄漏 C++ 堆内存。
- 同步计时:model.run 在 GPU 上入队后即返回,计时必须包含输出缓冲区读回(outputs[0].readFloat)。
- 不得混用 org.tensorflow:tensorflow-lite* 与 com.google.ai.edge.litert:* 产物,二者都包含 org.tensorflow.lite.* 类,会导致重复类构建失败。
- 使用 GPU 时必须在 litert:2.3.0 之外添加 litert-gpu:2.3.0。
适用场景
需要在 Android 设备上以 Kotlin 运行 .tflite 图像分类等模型、使用 CPU 或 GPU 加速的场景,以及从旧版 TFLite Interpreter 迁移到 LiteRT CompiledModel 的改造工作。
限制
资料未给出具体模型的精度、性能或兼容设备清单;GPU 对不支持的算子会在 create 抛 LiteRtException,模拟器可能在 create 或缓冲区分配时抛异常;模型缺失或文件无效同样在 create 抛 LiteRtException;minSdk 须为 24 或更高。