Ultralytics YOLO27: 加入候补名单。
Get Started
用于生产环境的 Ultralytics YOLO·选择运行时·课程 1/9
课程中级

选择部署目标

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

日落时分俯瞰城市高速公路的交通摄像头画面,Ultralytics YOLO 正在跟踪汽车、面包车和卡车,每个目标都标有类别和 ID

在 YOLO26 benchmarks 中,同一个 YOLO26n 在 CPU 上通过 ONNX Runtime 处理每张图像需要 38.9 ms,而在 T4 GPU 上通过 TensorRT 只需 1.7 ms。选错运行时,要么为远超需求的硬件买单,要么部署无法跟上处理速度的摄像头。本课将整个选择过程浓缩成一个十分钟的决策,并用设备本身测得的数据为决策提供依据。

学习成果

为设备选择运行时和 format= 值,将 FPS 目标换算为毫秒预算,并通过多次基准测试确认选择。

快速通道
如果你已经熟悉相关内容,以下是简要版。
  1. NVIDIA GPU 或 Jetson → TensorRT(engine),在目标设备上构建。Intel CPU、iGPU 或 NPU → OpenVINO(openvino)。

  2. Apple → CoreML(coreml)。Android → LiteRT(litert)。Snapdragon NPU → QNN(qnn)。Raspberry Pi → NCNN(ncnn)。

  3. 其他设备 → ONNX Runtime(onnx)。不想管理服务器 → 使用托管的 Ultralytics Platform 端点。

  4. 预算 = 1000 ÷ FPS,再减去解码和后处理时间。在设备上对候选方案计时,并依据 p95 而非平均值进行评估。

实践操作

从设备出发#

运行时应由推理实际运行的位置决定,而不是由使用习惯决定。从顶部开始沿着流程逐步判断,找到第一个匹配项后停止:

每种运行时都对应 导出模式 中的一个 format= 值:

目标运行时format=注意
NVIDIA GPU、JetsonTensorRTengine引擎只能在构建它所用的 GPU 系列和 TensorRT 版本上运行
Intel CPU、iGPU、NPUOpenVINOopenvino针对 Intel 进行了优化;在其他平台上使用前请先测量性能
任意 CPU 或 GPUONNX Runtimeonnx明确选择执行提供程序
iPhone、iPad、MacCoreMLcoreml导出可在 macOS 或 Linux 上运行,不能在 Windows 上运行
Android、嵌入式设备LiteRTlitertINT8 需要校准 data
Snapdragon NPUQualcomm QNNqnn仅支持量化导出;将 Hexagon 目标作为 name 传入
Raspberry Pi、ARM CPUNCNNncnnRaspberry Pi 指南中速度最快的格式
浏览器ONNX Runtime Webonnx仅使用 n 或 s 模型

在较新的 Apple 平台上,你还可以导出 Apple 新推出的 Core AI 格式(format=coreai,在 macOS 26+ Apple silicon 或 x86-64 Linux 上导出)。刚开始接触导出?面向部署的导出课程会介绍基础知识。

如果你不想运行推理服务器,Ultralytics Platform 可以将模型部署为专用端点,覆盖 42 个区域;你的个人资料中的 Deployments 标签页会显示每个端点的运行位置:

Ultralytics Platform 个人资料中的 Deployments 标签页,展示部署区域世界地图,以及活跃部署、HTTP 请求、错误率和 P95 延迟的概览卡片

部署并调用端点会介绍这种方式。本课程其余部分适用于你自行运行模型的情况。

将 FPS 目标换算成毫秒预算#

“实时”不是具体要求,数字才是。在进行任何基准测试前,先算出这个数字:

升级示例:每台摄像头 20 FPS
帧预算 = 1000 ÷ FPS50 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,在设备上却开始掉帧。解决方法:在部署硬件或尽可能接近的设备上进行基准测试,并在生产环境实际负载下运行(其他进程、其他摄像头)。

TensorRT 引擎与设备绑定

症状:在数据中心 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 镜像可以让设备保持一致。
试试看

为一个实际或计划中的项目写一份五行部署简报:目标设备、每台摄像头的 FPS、每台设备连接的摄像头数量、调用语言和设备群规模。将这些信息换算成以毫秒为单位的模型预算,根据决策树选择候选方案,然后在目标设备或你能找到的最接近的机器上运行 pick_runtime.py(使用你的模型和这些候选方案)。

完成条件
满足以下所有条件,即表示你已完成本课程。
  • 你的简报列出了设备、运行时和具体的 format= 值。

  • 你根据 FPS 目标推算出了模型的毫秒预算,并说明了扣除的耗时。

  • 你在设备上测量了每个候选方案的 p50 和 p95 推理耗时,并根据预算给出了结论。

显示解答

零售分析部署项目的简报示例:

问题答案
设备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 = 30

OpenVINO 文档中 Core Ultra 7 155H CPU 的基准测试显示,YOLO26n 使用 OpenVINO FP32 时耗时 13.4 ms,因此 yolo26n 应该能轻松满足要求;如果两条摄像头流水线同时运行时,真实设备上的 p95 低于 30 ms,就部署 OpenVINO。如果达不到要求,先尝试使用设备的集成 GPU 和 device="intel:gpu",再考虑购买硬件。

接下来做什么

确定目标后,下一课将模型导出为 ONNX,并验证导出的结果与 PyTorch 一致。

登录以保存学习进度