深度学习篇---TensorFlow Lite(TFLite) 和ONNX Runtime
本文介绍了ARM架构设备上运行AI模型的两大工具:TensorFlow Lite(TFLite)和ONNXRuntime。TFLite是Google推出的轻量级推理框架,专为低功耗ARM设备优化,体积小、速度快,适合简单模型;ONNXRuntime是微软的跨平台推理引擎,支持多种框架转换的ONNX模型,兼容性更强,适合复杂模型。两者各有优劣:TFLite在资源受限设备表现更优,但模型转换复杂;ON
简介:
在 ARM 架构设备(比如手机、树莓派、智能手表等)上运行 AI 模型时,需要专门的 “推理引擎” 来适配 ARM 的硬件特性(低功耗、算力有限)。其中,TensorFlow Lite(TFLite) 和ONNX Runtime是最常用的两个工具。下面用 “是什么、为什么、怎样做” 来通俗解释:
一、TensorFlow Lite(TFLite):ARM 设备上的 “轻量小能手”
1. 是什么?
TFLite 是 Google 推出的轻量级推理框架,专门为移动设备、嵌入式设备(几乎都是 ARM 架构)设计。它就像一个 “精简版的 TensorFlow”,体积小(核心库只有几百 KB)、速度快,能在资源有限的 ARM 设备上高效运行 AI 模型。
- 支持的模型格式:自己的
.tflite格式(需要从其他框架转换而来,比如 PyTorch、TensorFlow)。 - 典型应用:手机 APP 里的图像识别(比如拍照识物)、智能手表的心率预测、树莓派的简单 AI 任务。
2. 为什么要用它?
ARM 设备的特点是 “算力弱、内存小、耗电敏感”,而 TFLite 完美适配这些需求:
- 体积小:去掉了训练相关的冗余代码,只保留推理功能,安装包小,适合嵌入式设备。
- 速度快:针对 ARM 芯片做了深度优化(比如用 ARM 的 NEON 指令集加速计算),比通用框架(比如 PyTorch)在 ARM 上快 2-5 倍。
- 低功耗:计算效率高,能减少 ARM 设备的电量消耗(比如手机用 TFLite 跑模型,续航更久)。
3. 怎样用?(以 PyTorch 模型转 TFLite 为例)
TFLite 原生支持 TensorFlow 模型,PyTorch 模型需要先转成 ONNX,再转成 TFLite 格式(两步转换)。
步骤 1:PyTorch 模型转 ONNX(中间格式)
参考之前的 ONNX 转换方法,比如把 ResNet 模型转成resnet.onnx:
import torch
from torchvision import models
model = models.resnet18(pretrained=True)
model.eval()
dummy_input = torch.randn(1, 3, 224, 224) # 假输入
torch.onnx.export(model, dummy_input, "resnet.onnx") # 导出ONNX
步骤 2:ONNX 模型转 TFLite
需要用 TensorFlow 的工具链转换:
import tensorflow as tf
from onnx_tf.backend import prepare
import onnx
# 加载ONNX模型
onnx_model = onnx.load("resnet.onnx")
# 转换为TensorFlow模型
tf_rep = prepare(onnx_model)
# 保存为TensorFlow SavedModel格式
tf_rep.export_graph("tf_model")
# 再把TensorFlow模型转成TFLite
converter = tf.lite.TFLiteConverter.from_saved_model("tf_model")
# 可选:开启量化(把32位浮点数转成8位整数,进一步减小体积、加速)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
# 保存TFLite模型(.tflite格式)
with open("resnet.tflite", "wb") as f:
f.write(tflite_model)
步骤 3:在 ARM 设备上运行 TFLite 模型
以树莓派(ARM 架构)为例:
- 安装 TFLite:
pip install tflite-runtime(轻量版,无需完整 TensorFlow)。 - 运行代码:
import tflite_runtime.interpreter as tflite
import numpy as np
# 加载TFLite模型
interpreter = tflite.Interpreter(model_path="resnet.tflite")
interpreter.allocate_tensors() # 分配内存
# 获取输入/输出节点
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# 准备输入数据(比如一张图片,预处理成和模型匹配的格式)
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32) # 注意数据类型
# 输入数据并推理
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke() # 执行推理
# 获取输出结果
output_data = interpreter.get_tensor(output_details[0]['index'])
print("推理结果:", output_data)
二、ONNX Runtime:ARM 上的 “通用加速引擎”
1. 是什么?
ONNX Runtime 是微软推出的跨平台推理引擎,支持 ONNX 格式的模型,能在 CPU、GPU、ARM 等各种硬件上运行。对于 ARM 设备,它就像一个 “万能解码器”,能把 ONNX 模型翻译成 ARM 芯片能快速执行的指令。
- 支持的模型格式:ONNX(
.onnx),几乎所有主流框架(PyTorch、TensorFlow 等)都能转成 ONNX。 - 典型应用:需要跨框架部署的场景(比如 PyTorch 模型部署到 ARM 手机)、对兼容性要求高的嵌入式设备。
2. 为什么要用它?
相比 TFLite,ONNX Runtime 的核心优势是通用性强,同时对 ARM 优化也很到位:
- 跨框架兼容:不管模型是用 PyTorch、TensorFlow 还是 MXNet 训练的,只要转成 ONNX,就能用它在 ARM 上跑,无需适配不同框架。
- ARM 优化好:内置了 ARM NEON 指令集加速,还支持 ARM 的专用 AI 加速芯片(比如华为的 NPU、高通的 Hexagon),速度不输 TFLite。
- 功能更全:支持动态输入(比如批量大小可变)、复杂控制流(模型里的 if/for 语句),对复杂模型的兼容性比 TFLite 更好。
3. 怎样用?(以 ARM 设备运行 ONNX 模型为例)
步骤 1:准备 ONNX 模型
直接用之前 PyTorch 转好的resnet.onnx(无需二次转换,比 TFLite 少一步)。
步骤 2:在 ARM 设备上安装 ONNX Runtime
根据 ARM 设备的系统选择版本(比如树莓派是 Linux ARM,手机是 Android ARM):
- 树莓派(Linux):
pip install onnxruntime(自动适配 ARM 架构)。 - 安卓手机:在 Android Studio 中添加 ONNX Runtime 的依赖(可参考官网文档)。
步骤 3:在 ARM 设备上运行模型
import onnxruntime as ort
import numpy as np
# 加载ONNX模型(自动使用ARM优化)
session = ort.InferenceSession("resnet.onnx")
# 获取输入/输出名称
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
# 准备输入数据(和模型输入格式一致)
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
# 推理(自动调用ARM NEON加速)
output = session.run([output_name], {input_name: input_data})
print("推理结果:", output)
可选优化:开启 ARM 硬件加速
如果 ARM 设备有专用 AI 芯片(比如手机的 NPU),可以在加载模型时指定加速后端:
# 比如安卓手机启用NNAPI(ARM的神经网络API)加速
session = ort.InferenceSession(
"resnet.onnx",
providers=["NNAPIExecutionProvider"] # 调用ARM的NNAPI加速
)
三、TFLite vs ONNX Runtime:怎么选?
| 场景 | 优先选 TFLite | 优先选 ONNX Runtime |
|---|---|---|
| 模型来源 | 主要用 TensorFlow 训练的模型 | 用 PyTorch、MXNet 等其他框架训练的模型 |
| 设备类型 | 超低端嵌入式设备(内存 < 1GB) | 中高端 ARM 设备(手机、树莓派 4B+) |
| 需求 | 极致轻量化、低功耗 | 跨框架兼容、复杂模型支持 |
总结:TFLite 是 “ARM 轻量专用工具”,适合简单模型和低端设备;ONNX Runtime 是 “ARM 通用加速引擎”,适合跨框架和复杂模型。根据模型来源和设备性能选就行~
TensorFlow Lite(TFLite) 和ONNX Runtime的优缺点:
TensorFlow Lite(TFLite)和 ONNX Runtime 都是 ARM 架构设备(如手机、树莓派)上常用的 AI 模型推理工具,但两者的设计目标和适用场景不同,优缺点也很鲜明。下面用通俗的方式对比:
一、TensorFlow Lite(TFLite)的优缺点
优点:
-
“轻如羽毛”,适合极端资源有限的设备核心库体积只有几百 KB,比 ONNX Runtime 小很多,安装包几乎不占用 ARM 设备的存储空间和内存。比如智能手表、低端传感器这类 “内存只有几百 MB” 的设备,只能跑 TFLite。
-
对 ARM 的 “底层优化” 做到了极致深度适配 ARM 的 NEON 指令集(类似 ARM 芯片的 “加速按钮”),还能直接调用手机里的专用 AI 芯片(如联发科的 APU),在简单模型(比如图像分类、手势识别)上速度极快,而且特别省电。
-
专为移动端设计的 “小功能” 丰富支持 “模型分片加载”(大模型分块读入,避免占满内存)、“动态输入调整”(比如根据图片大小自动适配),这些细节对手机、嵌入式设备很友好。
缺点:
-
“挑食”,只认自家格式和简单模型原生只支持
.tflite格式,其他框架(如 PyTorch)的模型需要先转 ONNX 再转 TFLite,步骤繁琐,而且转换时容易出错(尤其是复杂模型,比如带 if/for 逻辑的)。 -
跨框架兼容性差虽然能通过 ONNX 中转支持 PyTorch 模型,但对 PyTorch 特有的算子(比如某些自定义层)支持不好,经常出现 “转换后模型跑不起来” 的情况。
-
复杂场景 “力不从心”对动态批量输入(比如一次跑 1 张还是 10 张图片)、复杂控制流(模型里的条件判断)支持弱,适合简单的 “输入 - 输出” 模型,不适合语音识别、视频分析等复杂任务。
二、ONNX Runtime 的优缺点
优点:
-
“万能兼容”,啥模型都能吃支持 ONNX 格式,而 ONNX 是几乎所有主流框架(PyTorch、TensorFlow、MXNet 等)的 “通用翻译官”。不管你用什么框架训练的模型,转成 ONNX 后,ONNX Runtime 都能在 ARM 上跑,不用反复适配。
-
“能屈能伸”,复杂模型也能扛完美支持动态输入(比如批量大小随时变)、复杂控制流(模型里的 if/for 循环),对语音识别、自然语言处理等复杂模型的兼容性比 TFLite 好太多。
-
“多面手”,适配更多 ARM 硬件不仅支持普通 ARM CPU,还能调用高端 ARM 设备的专用 AI 芯片(比如华为手机的 NPU、高通的 Hexagon),甚至能在 ARM+GPU 混合架构上加速,适用范围比 TFLite 广。
缺点:
-
“体型偏胖”,占用资源更多安装包比 TFLite 大(通常几 MB 到几十 MB),在内存小于 1GB 的超低端 ARM 设备上可能跑不起来,比如老式树莓派或廉价传感器。
-
简单模型上 “速度略逊”虽然整体优化不错,但在简单模型(如图像分类)上,因为通用架构的 “额外开销”,速度可能比 TFLite 慢一点(比如慢 10%-20%)。
-
配置稍复杂,新手容易懵虽然基本使用不难,但要开启硬件加速(比如调用手机 NPU)需要手动配置参数,对新手来说比 TFLite 的 “傻瓜式操作” 略复杂。
三、总结:怎么选?
- 选TFLite:如果你的设备是 “小可怜”(内存小、算力弱),且模型简单(比如手机拍照识物),或者模型原本就是用 TensorFlow 训练的,选它准没错。
- 选ONNX Runtime:如果你的模型来自 PyTorch 等非 TensorFlow 框架,或者模型复杂(带控制流、动态输入),又或者设备是中高端 ARM(如手机、树莓派 4),它的兼容性和灵活性会更省心。
简单说:TFLite 是 “ARM 低端设备的轻量专家”,ONNX Runtime 是 “ARM 全场景的通用能手”。
更多推荐


所有评论(0)