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 的 GPU 版本对 CUDA 版本有严格要求。我曾经因为 CUDA 11.8 和 12.0 混用,折腾了一下午。建议先查官方文档的兼容性矩阵。

基本使用

使用 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
避坑指南: 我曾经在 Ubuntu 20.04 上装 OpenVINO 2023.0,结果跟系统自带的 OpenCV 冲突了。后来发现用虚拟环境能完美解决这个问题。

基本使用

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 对模型格式有要求。它原生支持 ONNX 和 UFF 格式。我建议先把模型转成 ONNX,再用 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)
经验之谈: TensorRT 的引擎构建很耗时,但构建一次后可以序列化保存。我一般会在部署时先构建引擎,然后保存为 .trt 文件,下次直接加载。

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。你想想看,这样既保证了开发效率,又不会错过性能优化。

嗯,今天就先聊到这儿。下一章咱们会深入讲模型转换和量化,到时候再分享更多实战经验。