TensorFlow Lite 安装与部署:转换环境与三端运行时接入
TensorFlow Lite 安装与部署:转换环境与三端运行时接入
先把一件事分清楚:转换器与运行时是两套东西。桌面上装 TensorFlow 只为了产出 .tflite 文件;端上跑推理用的是另一套库。搞混这两件事,是新手最容易走的弯路。
第一步:桌面侧转换环境
- 建独立虚拟环境,避免污染系统 Python;
- 安装 TensorFlow,转换器随包提供,不需要单独安装;
- 确认导入成功后,再进入模型转换环节。
python -m venv venv-tflite
# Linux / macOS
source venv-tflite/bin/activate
# Windows 用:source venv-tflite/Scripts/activate
python -m pip install --upgrade pip
python -m pip install tensorflow
python -c 'import tensorflow as tf; print(tf.__version__)'
版本号本身不照抄,转换器与运行时版本差距过大时,最容易撞上 Didn't find op for builtin opcode 一类错误,具体版本对应关系以官方文档为准。
第二步:Android 接入
把 .tflite 放进 app/src/main/assets/,在模块级 Gradle 文件里加依赖。注意 TensorFlow Lite 近两年已更名为 LiteRT,新老项目的 Maven 坐标不一样,坐标与版本请以官方文档当前给出的为准,下面用占位符表示:
dependencies {
// 版本号以官方文档为准,不要照抄
implementation("org.tensorflow:tensorflow-lite:VERSION")
implementation("org.tensorflow:tensorflow-lite-gpu:VERSION")
implementation("org.tensorflow:tensorflow-lite-support:VERSION")
}
还要防止构建工具把模型文件二次压缩,否则运行时得先解压,凭空多占一份内存:
android {
androidResources {
noCompress += "tflite"
}
}
// 老版本 AGP 写法:
// android { aaptOptions { noCompress "tflite" } }
第三步:iOS 接入
iOS 侧通过 CocoaPods 引入 TensorFlowLiteSwift,或用 SwiftPM 引入对应包。启用 Metal delegate 需要带 Metal 支持的子规格(subspec)或独立 pod,具体 pod 名与最低系统版本以官方文档为准。工程里同样要把 .tflite 作为资源打进 bundle,并确认它没有被构建脚本误删。
第四步:ARM Linux / 树莓派
这类设备内存通常只有 1–4 GB,装完整 TensorFlow 既慢又占空间,应改用只含解释器的 tflite-runtime。Coral 提供了预编译 wheel 源:
python3 -m pip install --index-url https://google-coral.github.io/py-repo/ tflite-runtime
python3 -c 'from tflite_runtime.interpreter import Interpreter; print("tflite-runtime ok")'
有两点要注意:预编译 wheel 未必覆盖所有 Python 版本与 CPU 架构(aarch64 与 armv7 的可用情况并不相同),装不上时要么调整 Python 版本,要么自行编译,要么退回完整 tensorflow。若目标是 Coral Edge TPU,还需要官方提供的 edgetpu 运行时与 libedgetpu 驱动,并且模型必须是全整数量化,详见下一节。
常见报错与排查
| 报错 / 现象 | 原因 | 处理 |
|---|---|---|
| Didn't find op for builtin opcode 'X' version 'N' | 运行时版本低于转换器,或模型含未降级的 TF 算子 | 对齐转换器与运行时版本;必要时用 SELECT_TF_OPS 并附带 Flex delegate |
| Encountered unresolved custom op | 模型含自定义算子 | 在端侧注册对应的自定义算子实现 |
| Cannot set tensor: Got value of type NOTYPE but expected type FLOAT32 | 量化模型的输入张量是 uint8 / int8,却按 float 喂数据 | 读 get_input_details 的 dtype,按类型转换后再喂 |
| ConverterError: tf.function without input signature | 使用了未固定签名的 tf.function | 补 input_signature,或改从 SavedModel 转换 |
| GpuDelegate 初始化失败或首帧闪退 | 设备 GPU 不支持,或驱动异常 | 用 CompatibilityList 先探测,不支持就回退 CPU |
| 量化后精度掉得离谱 | 校准集不具代表性,或首个算子不支持 int8 导致整图回退浮点 | 换用覆盖真实分布的校准集;用分析器确认算子分配 |

