3、推理引擎介绍:TensorFlow Lite、ONNX Runtime、OpenVINO、TensorRT 的安装与基本使用
说到边缘设备上的推理,说白了就是让模型在资源受限的硬件上跑起来。我这些年折腾下来,发现选对推理引擎,比调模型参数还关键。你想想看,同样的模型,用不同的引擎跑,速度能差好几倍。
今天咱们就聊聊四个主流的推理引擎:TensorFlow Lite、ONNX Runtime、OpenVINO 和 TensorRT。每个我都会讲讲安装要点和基本用法,顺便分享一些我踩过的坑。
3.1 TensorFlow Lite:移动端的老大哥
TensorFlow Lite(简称 TFLite)是 Google 专门为移动和嵌入式设备打造的。我个人习惯在树莓派和手机上用它,部署起来特别方便。
安装
安装其实很简单。在 Python 环境下,一行命令搞定:
pip install tensorflow
嗯,这里要注意,TFLite 是包含在 TensorFlow 包里的。如果你只想用轻量级的解释器,可以单独装:
pip install tflite-runtime
我在项目中遇到过一个问题:tflite-runtime 的版本号跟 TensorFlow 不完全对应。比如 TensorFlow 2.10 对应的是 tflite-runtime 2.10.0,但有时候会滞后。建议装之前先查一下对应关系。
基本使用
使用 TFLite 分三步:加载模型、创建解释器、运行推理。
import tensorflow as tf
# 1. 加载模型
interpreter = tf.lite.Interpreter(model_path="model.tflite")
interpreter.allocate_tensors()
# 2. 获取输入输出信息
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# 3. 设置输入数据
input_data = np.array([[1.0, 2.0, 3.0]], dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
# 4. 运行推理
interpreter.invoke()
# 5. 获取输出
output_data = interpreter.get_tensor(output_details[0]['index'])
print(output_data)
edgetpu 版本的 TFLite。我曾经在 Coral 加速棒上跑过,速度直接提升了 10 倍。
3.2 ONNX Runtime:跨框架的瑞士军刀
ONNX Runtime 是我最喜欢的引擎之一。为什么?因为它能跑各种框架导出的模型。说白了,你从 PyTorch 训练好的模型,转成 ONNX 格式,就能用 ONNX Runtime 在边缘设备上跑。
安装
安装也很直接:
pip install onnxruntime
如果你有 GPU,可以装 GPU 版本:
pip install onnxruntime-gpu
基本使用
使用 ONNX Runtime 的流程跟 TFLite 类似:
import onnxruntime as ort
import numpy as np
# 1. 创建推理会话
sess = ort.InferenceSession("model.onnx")
# 2. 获取输入输出名称
input_name = sess.get_inputs()[0].name
output_name = sess.get_outputs()[0].name
# 3. 准备输入数据
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
# 4. 运行推理
output = sess.run([output_name], {input_name: input_data})
print(output[0])
我个人习惯用 sess.run() 的时候,把输出名称写成列表。这样即使有多个输出,也能一次性拿到。
3.3 OpenVINO:Intel 硬件的加速器
OpenVINO 是 Intel 推出的,专门优化自家硬件(CPU、集成显卡、VPU)的推理性能。如果你用的是 Intel 的芯片,这个引擎能榨干硬件的每一分性能。
安装
安装 OpenVINO 稍微复杂一点。我建议用 pip 安装:
pip install openvino
但要注意,OpenVINO 的 Python 包只包含运行时。如果你需要模型优化工具,还得装 openvino-dev:
pip install openvino-dev
基本使用
OpenVINO 的使用分两步:先加载模型,再创建推理请求。
from openvino import Core
# 1. 初始化 Core
core = Core()
# 2. 加载模型
model = core.read_model("model.xml")
# 3. 编译模型到指定设备
compiled_model = core.compile_model(model, "CPU")
# 4. 创建推理请求
infer_request = compiled_model.create_infer_request()
# 5. 准备输入数据
input_tensor = np.random.randn(1, 3, 224, 224).astype(np.float32)
# 6. 运行推理
output_tensor = infer_request.infer({0: input_tensor})
print(output_tensor[0])
你想想看,OpenVINO 支持多种设备:CPU、GPU、VPU。我一般用 "AUTO" 参数,让它自动选择最优设备。
3.4 TensorRT:NVIDIA GPU 的性能王者
TensorRT 是 NVIDIA 的看家本领。如果你手上有 Jetson 系列或者带 NVIDIA GPU 的设备,这个引擎能让你体验到飞一般的推理速度。
安装
安装 TensorRT 比较麻烦。我建议用 NVIDIA 的官方容器或者 deb 包:
# 使用 pip 安装(仅限 Python 绑定)
pip install tensorrt
但说实话,pip 安装的版本可能不是最新的。我在 Jetson 上都是直接刷 NVIDIA 的 SDK Manager,里面自带 TensorRT。
基本使用
TensorRT 的使用稍微复杂一些,因为需要先构建引擎:
import tensorrt as trt
import numpy as np
# 1. 创建 logger 和 builder
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
# 2. 创建网络定义
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
# 3. 解析 ONNX 模型
parser = trt.OnnxParser(network, logger)
with open("model.onnx", "rb") as f:
parser.parse(f.read())
# 4. 构建引擎
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 20) # 1MB
engine = builder.build_serialized_network(network, config)
# 5. 创建执行上下文
runtime = trt.Runtime(logger)
engine = runtime.deserialize_cuda_engine(engine)
context = engine.create_execution_context()
# 6. 准备输入输出
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
output_data = np.empty((1, 1000), dtype=np.float32)
# 7. 运行推理
context.execute_v2([input_data, output_data])
print(output_data)
3.5 如何选择?一张表说清楚
说了这么多,到底该用哪个?我根据自己的经验,整理了一张对比表:
| 引擎 | 适用硬件 | 安装难度 | 推理速度 | 模型格式 | 我的推荐场景 |
|---|---|---|---|---|---|
| TensorFlow Lite | ARM、x86、移动端 | 简单 | 中等 | .tflite | 树莓派、手机、微控制器 |
| ONNX Runtime | 通用(CPU/GPU) | 简单 | 中等偏快 | .onnx | 跨框架部署、快速原型 |
| OpenVINO | Intel CPU/GPU/VPU | 中等 | 快 | .xml + .bin | Intel 平台、边缘服务器 |
| TensorRT | NVIDIA GPU | 较难 | 极快 | .onnx / .uff | Jetson、带 GPU 的边缘设备 |
我个人习惯是:如果项目时间紧,先用 ONNX Runtime 快速验证。等确定硬件平台后,再针对性地优化到 TFLite 或 TensorRT。你想想看,这样既保证了开发效率,又不会错过性能优化。
嗯,今天就先聊到这儿。下一章咱们会深入讲模型转换和量化,到时候再分享更多实战经验。