选择部署目标
根据设备、延迟预算和设备集群确定运行时及导出格式,然后在设备上进行验证。

在 YOLO26 benchmarks 中,同一个 YOLO26n 在 CPU 上通过 ONNX Runtime 处理每张图像需要 38.9 ms,而在 T4 GPU 上通过 TensorRT 只需 1.7 ms。选错运行时,要么为远超需求的硬件买单,要么部署无法跟上处理速度的摄像头。本课将整个选择过程浓缩成一个十分钟的决策,并用设备本身测得的数据为决策提供依据。
实践操作
从设备出发#
运行时应由推理实际运行的位置决定,而不是由使用习惯决定。从顶部开始沿着流程逐步判断,找到第一个匹配项后停止:
每种运行时都对应 导出模式 中的一个 format= 值:
| 目标 | 运行时 | format= | 注意 |
|---|---|---|---|
| NVIDIA GPU、Jetson | TensorRT | engine | 引擎只能在构建它所用的 GPU 系列和 TensorRT 版本上运行 |
| Intel CPU、iGPU、NPU | OpenVINO | openvino | 针对 Intel 进行了优化;在其他平台上使用前请先测量性能 |
| 任意 CPU 或 GPU | ONNX Runtime | onnx | 明确选择执行提供程序 |
| iPhone、iPad、Mac | CoreML | coreml | 导出可在 macOS 或 Linux 上运行,不能在 Windows 上运行 |
| Android、嵌入式设备 | LiteRT | litert | INT8 需要校准 data |
| Snapdragon NPU | Qualcomm QNN | qnn | 仅支持量化导出;将 Hexagon 目标作为 name 传入 |
| Raspberry Pi、ARM CPU | NCNN | ncnn | Raspberry Pi 指南中速度最快的格式 |
| 浏览器 | ONNX Runtime Web | onnx | 仅使用 n 或 s 模型 |
在较新的 Apple 平台上,你还可以导出 Apple 新推出的 Core AI 格式(format=coreai,在 macOS 26+ Apple silicon 或 x86-64 Linux 上导出)。刚开始接触导出?面向部署的导出课程会介绍基础知识。
如果你不想运行推理服务器,Ultralytics Platform 可以将模型部署为专用端点,覆盖 42 个区域;你的个人资料中的 Deployments 标签页会显示每个端点的运行位置:

部署并调用端点会介绍这种方式。本课程其余部分适用于你自行运行模型的情况。
将 FPS 目标换算成毫秒预算#
“实时”不是具体要求,数字才是。在进行任何基准测试前,先算出这个数字:
| 升级 | 示例:每台摄像头 20 FPS |
|---|---|
| 帧预算 = 1000 ÷ FPS | 50 ms |
| 减去解码(RTSP、1080p) | 约 10 ms |
| 减去跟踪、计数和输出 | 约 5 ms |
| 减去 20% 的峰值余量 | 10 ms |
| 留给模型的时间 | 约 25–30 ms |
然后根据以下规则做决定:
- 如果 YOLO26n 在设备 CPU 上的耗时超过模型预算,就改用加速器(GPU、iGPU、NPU),或者优先缩小
imgsz;YOLO26 基准测试显示,YOLO26n 在 CPU ONNX 上耗时 38.9 ms,在搭载 TensorRT 的 T4 上耗时 1.7 ms。 - 如果一台设备要服务多台摄像头,就用模型预算除以摄像头数量。
- 如果设备群包含多种设备类型,且数量超过少数几种,优先选择不需要针对每台设备单独构建的运行时,或者规划按设备类别分别构建。
- 如果调用代码使用 Swift、Kotlin 或 C++,在确定方案前,先确认运行时是否提供该语言的 SDK。
在目标设备上对候选方案进行基准测试#
规格表和他人的基准测试结果只能作为起点。你需要在实际部署的硬件上做出决定,并关注耗时较长的帧,而不是平均值:某个运行时的中位数很快,但每二十帧就有一帧卡顿,它仍然会丢帧。这个脚本会导出每个候选模型,在真实帧上计时 100 次推理,并根据第 95 百分位数(p95)评估每个模型:
from ultralytics import YOLO
from ultralytics.utils.downloads import safe_download
BUDGET_MS = 30 # the model's share of a 20 FPS frame budget
CANDIDATES = ("onnx", "openvino") # runtimes the decision tree allows on this machine
if __name__ == "__main__": # exports and inference can start worker processes on macOS and Windows
frame = str(safe_download("https://ultralytics.com/images/bus.jpg")) # use a real frame from your camera
for fmt in CANDIDATES:
model = YOLO(YOLO("yolo26n.pt").export(format=fmt))
for _ in range(5): # warm up: the first calls include one-time setup
model(frame, verbose=False)
runs = sorted(model(frame, verbose=False)[0].speed["inference"] for _ in range(100))
p50, p95 = runs[49], runs[94]
verdict = "meets" if p95 <= BUDGET_MS else "misses"
print(f"{fmt:9s} p50 {p50:5.1f} ms p95 {p95:5.1f} ms {verdict} the {BUDGET_MS} ms budget")在用于测试本课程的 Apple silicon 笔记本电脑上,CPU 同时运行其他任务时:
onnx p50 30.0 ms p95 46.4 ms misses the 30 ms budget
openvino p50 22.8 ms p95 113.5 ms misses the 30 ms budget逐行来看:
speed["inference"]是模型处理该帧本身所需的时间,不包含解码或绘图,因此可以公平地比较不同运行时。- OpenVINO 的中位数表现最好,但 p95 慢了两倍多。如果只看平均值,你会部署那个在繁忙时段会卡顿的运行时;如果看 p95,在这台机器上,ONNX Runtime 是更稳定的选择。
- 两者都达不到预算要求,因此这里的下一步应该是缩小
imgsz、改用加速器,或减少每台设备连接的摄像头数量,而不是再试另一个 CPU 运行时。
若要快速比较不同格式的准确率和速度,基准测试模式会逐一导出、验证并计时:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnx删除 format=,即可测试机器支持的所有格式。COCO8 只有四张验证图像,因此应将其 mAP 列视为冒烟测试;要做准确率方面的决策,请使用你自己的数据集 YAML。
常见问题#
症状:模型在工作站上达到 60 FPS,在设备上却开始掉帧。解决方法:在部署硬件或尽可能接近的设备上进行基准测试,并在生产环境实际负载下运行(其他进程、其他摄像头)。
症状:在数据中心 GPU 上构建的 .engine 无法在 Jetson Orin 上加载。解决方法:在安装时于目标设备上构建(根据 Platform 导出文档,YOLO26n FP16 构建在 Jetson Orin 上约需 5 分钟);或者为每种设备类别和 TensorRT 版本保留一个构建版本,并交付 .pt 或 .onnx,以便任何设备都能重新构建。
yolo benchmark 会在你传入的 imgsz 下测量。如果生产环境以 imgsz=1280 运行,就应在 1280 下进行基准测试:计算量随像素数量增长,因此 640 下的数值会低估 1280 部署的计算量,约相差 4 倍。
边缘设备还要考虑四个问题#
Raspberry Pi、NVIDIA Jetson 和 Jetson 上的 DeepStream 指南详细介绍了常见目标设备。在确定边缘计算设备之前,请先回答:
- 冷启动:TensorRT 引擎在哪里构建?谁需要等待?
- 功耗与散热:机箱能否让模型以满载 FPS 全天运行?
- 内存:模型旁边是否有足够空间容纳帧缓冲区和跟踪器状态?INT8 会让模型占用的内存减半。
- 更新:如何将新的
best.pt部署到 1,000 台设备?使用 Docker 镜像可以让设备保持一致。
显示解答
零售分析部署项目的简报示例:
| 问题 | 答案 |
|---|---|
| 设备 | 40 台店内迷你 PC,配备 Intel Core Ultra CPU,不带独立 GPU |
| FPS 和摄像头 | 每台摄像头 10 FPS,每台设备连接 2 台摄像头 |
| 调用方 | 运行在 Linux 上的 Python 服务 |
| 设备群 | 40 台设备,通过 Docker 镜像更新 |
预算:1000 ÷ 10 = 每帧 100 ms;减去解码和跟踪约 15 ms,再留出 20% 的余量后,剩下约 65 ms,由两台摄像头共享,因此每次推理约 30 ms。决策树建议使用 OpenVINO(Intel CPU),并将 ONNX Runtime 作为备用方案。先在一台门店设备上测试:
python pick_runtime.py # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30OpenVINO 文档中 Core Ultra 7 155H CPU 的基准测试显示,YOLO26n 使用 OpenVINO FP32 时耗时 13.4 ms,因此 yolo26n 应该能轻松满足要求;如果两条摄像头流水线同时运行时,真实设备上的 p95 低于 30 ms,就部署 OpenVINO。如果达不到要求,先尝试使用设备的集成 GPU 和 device="intel:gpu",再考虑购买硬件。