Inference Engine
推理引擎通过融合层、降低精度和优化内核,在目标硬件上运行训练好的模型。内容涵盖其工作原理和常见推理引擎。
推理引擎是一种用于执行经过训练的神经网络并在新数据上生成预测的软件。它接收从训练框架导出的模型,通常以计算图的形式(例如ONNX文件),针对特定处理器优化该计算图,并以尽可能低的推理延迟和内存占用运行。各种硬件类别都有对应的引擎,从数据中心 GPU到手机和微控制器皆有;在模型部署中,引擎是负责计算每个预测结果的组件。
推理引擎如何加速模型#
部署后的模型不会更新其权重,因此引擎可以舍弃训练所需的一切内容,例如用于反向传播的激活值存储,并自由改写计算图。引擎会预先计算仅依赖常量的部分,将卷积、归一化和激活等连续层融合为单个内核,让中间结果留在快速的片上内存中,并规划内存以便重复使用缓冲区。引擎还可以通过模型量化将数值精度降低到 FP16 或 INT8;对于 INT8,会使用样本数据测量激活值范围。TensorRT 等引擎随后会在实际设备上为每一层测试多个候选内核,并保留最快的内核,因此运行结果会针对该硬件进行优化:
将批归一化折叠到前一层卷积中,是最常见的改写方式之一。在推理时,归一化只会按固定数值缩放和平移各个通道,因此这些数值可以合并到卷积的权重和偏置中。PyTorch 将同样的变换实现为 fuse_conv_bn_eval:
import torch
from torch.nn.utils.fusion import fuse_conv_bn_eval
torch.manual_seed(0)
# A trained convolution followed by batch normalization (random statistics here)
conv = torch.nn.Conv2d(16, 32, kernel_size=3, padding=1).eval()
bn = torch.nn.BatchNorm2d(32).eval()
bn.running_mean.uniform_(-1, 1)
bn.running_var.uniform_(0.5, 2.0)
# Fold the normalization's scale and shift into the convolution's weights and bias
fused = fuse_conv_bn_eval(conv, bn)
# One layer now replaces two and produces the same output
x = torch.randn(1, 16, 64, 64)
with torch.inference_mode():
diff = (bn(conv(x)) - fused(x)).abs().max().item()
print(f"Max difference after fusing: {diff:.1e}")打印结果显示最大差异为 2.1e-06,这是浮点舍入误差:融合后的单层只需遍历一次内存,就能计算出与原来的两层相同的函数。
常见推理引擎#
- TensorRT: NVIDIA 为其数据中心 GPU 和 Jetson 模块打造的引擎。它会为特定 GPU 型号和 TensorRT 版本构建执行计划,因此两者任一发生变化时都需要重新构建引擎。
- OpenVINO: Intel 为其 CPU、集成和独立 GPU 以及 NPU 提供的工具套件。
- ONNX Runtime: Microsoft 为 ONNX 模型打造的跨平台引擎,会将任务交给称为执行提供程序的硬件后端处理,包括 CUDA、TensorRT、OpenVINO 和 Core ML。
- LiteRT: Google 的运行时,前身为 TensorFlow Lite,适用于 Android、嵌入式 Linux 和微控制器,并提供面向移动 GPU 和 NPU 的委托。
- Core ML: Apple 的设备端框架,可在 CPU、GPU 和 Neural Engine 之间分配任务。
- vLLM: 一种用于大型语言模型的开源引擎,提供请求调度和注意力缓存的分页内存,以便同时服务许多用户。
Ultralytics YOLO API会根据加载的文件选择引擎,因此同一个 predict 调用可以在 PyTorch 中运行 .pt 检查点,在 ONNX Runtime 中运行 .onnx 文件,在 TensorRT 中运行 .engine 文件,也可以在 OpenVINO 中运行 OpenVINO 文件夹。将 Ultralytics YOLO26 导出为 OpenVINO 格式并加载结果,即可切换引擎,无需更改其他代码:
from ultralytics import YOLO
# 将 PyTorch 模型导出为 OpenVINO 格式
model = YOLO("yolo26n.pt")
path = model.export(format="openvino") # creates 'yolo26n_openvino_model/'
# 加载导出的文件夹后,即可通过 OpenVINO 引擎运行预测
ov_model = YOLO(path)
results = ov_model("https://ultralytics.com/images/bus.jpg")
results[0].save(filename="bus_openvino.jpg")推理引擎与相关术语对比#
- PyTorch 和其他训练框架: 保持计算图灵活,并记录用于求梯度的操作,以便设计和训练模型。它们也能运行推理,但开销比针对单个设备构建的引擎更大。
- ONNX: 描述模型计算图和权重的文件格式。ONNX Runtime 和 TensorRT 是读取该格式的引擎。
- 模型服务:将一个或多个引擎封装为网络服务,提供 API、请求批处理和版本管理;NVIDIA Dynamo-Triton(原名 Triton Inference Server)便是为 TensorRT、ONNX Runtime 和 PyTorch 模型提供此类服务的系统。
- 专家系统推理引擎: 该术语较早的含义,源自基于规则的 AI。此类推理引擎通过正向或反向链推理,将 if-then 规则应用于知识库。










