1. YOLO模型部署概述:部署流程全景图、ONNX与TensorRT简介、性能指标

各位同学,欢迎来到《YOLO模型部署中的内存与性能优化实战》的第一章。

说实话,我见过太多人把模型训练得漂漂亮亮,一到部署就翻车。我自己也踩过不少坑。所以这一章,我们先不急着写代码,而是把整个部署的「地图」铺开来看清楚。

1.1 部署流程全景图:从训练到上线

YOLO模型部署,说白了就是让训练好的模型在真实设备上跑起来。你想想看,训练时我们用PyTorch,用GPU,数据随便喂。但到了实际场景——比如一个嵌入式摄像头,或者一台只有CPU的服务器——环境完全不一样了。

我习惯把部署流程分成四个阶段:

  1. 模型导出:把PyTorch模型转成中间格式。比如ONNX。
  2. 模型优化:做量化、剪枝、算子融合。这一步最考验经验。
  3. 模型编译:针对特定硬件生成可执行文件。TensorRT干的就是这个。
  4. 运行时推理:加载优化后的模型,处理输入输出,跑起来。

嗯,这里要注意:很多人以为导出完就结束了。其实导出只是开始。我在项目中遇到过,一个模型导出后直接跑,速度反而比PyTorch还慢。为什么?因为没有做优化。

核心观点:部署不是简单的格式转换,而是一整套「模型手术」。每一步都可能影响最终性能。

1.2 ONNX与TensorRT简介

这两个工具,是部署圈子里绕不开的。我分别说说我的理解。

ONNX:模型界的通用语言

ONNX(Open Neural Network Exchange)是一个开放格式。它的作用很简单:让不同框架之间能互相通信。

举个例子。你用PyTorch训练了YOLOv8,但目标设备只支持TensorRT。怎么办?中间需要一座桥。ONNX就是这座桥。

我个人习惯,导出ONNX时一定会检查两件事:

  • 算子兼容性:有些PyTorch算子ONNX不支持,会报错或降级。
  • 动态轴设置:输入尺寸是不是固定的?如果是动态batch,一定要设好。

小技巧:导出后先用onnxruntime跑一遍,验证结果是否正确。我曾经因为一个Resize算子没对齐,排查了整整两天。

TensorRT:NVIDIA的加速引擎

TensorRT是NVIDIA推出的推理优化工具。它只跑在NVIDIA GPU上。

它的核心能力是什么?说白了就是三点:

  • 算子融合:把多个小算子合并成一个,减少Kernel启动开销。
  • 精度校准:支持FP16、INT8量化,显存占用直接砍半。
  • 内存复用:推理过程中复用中间张量的内存,减少分配释放。

我记得第一次用TensorRT优化YOLOv5,FPS从30直接飙到了120。当时我盯着屏幕愣了好几秒——这优化效果,太夸张了。

避坑指南:TensorRT对动态形状支持有限。如果你的输入尺寸变化很大,建议固定尺寸或者用多profile。我曾经在生产环境里因为动态batch没处理好,导致推理结果全乱套了。

1.3 性能指标:FPS、延迟、吞吐量

做部署优化,你得知道怎么衡量效果。不然你优化了半天,到底有没有提升?

三个最常用的指标,我一个个说。

FPS(Frames Per Second)

每秒能处理多少帧。这个指标最直观。你跑视频流,FPS就是命根子。

计算公式很简单:

FPS = 1 / 单帧推理时间

举个例子,如果单帧推理耗时20ms,那FPS就是50。嗯,这里要注意:FPS是平均值,不是瞬时值。我习惯用1000帧取平均,这样更稳。

延迟(Latency)

从输入到输出,花了多少时间。单位通常是毫秒。

延迟和FPS是反比关系,但又不完全一样。为什么?因为延迟关注的是「单次请求」的响应速度。比如自动驾驶场景,延迟必须低,否则车都撞上了你还没检测出来。

我个人习惯看两个延迟指标:

  • P50延迟:一半请求在这个时间内完成。
  • P99延迟:99%的请求在这个时间内完成。这个指标更能反映极端情况。

经验之谈:优化时别只盯着平均延迟。P99延迟才是用户体验的瓶颈。我曾经优化一个模型,平均延迟降了30%,但P99反而升高了——因为内存碎片导致偶尔卡顿。

吞吐量(Throughput)

单位时间内能处理多少数据。比如每秒处理多少张图片,或者每分钟处理多少路视频流。

吞吐量和FPS的区别在于:FPS通常指单路流,吞吐量可以指多路并发。你想想看,一台服务器同时处理10路视频,每路30FPS,那总吞吐量就是300FPS。

三个指标的关系,我整理了一张表:

指标 关注点 典型场景 优化方向
FPS 单路视频流畅度 实时监控、直播 降低单帧推理时间
延迟 单次响应速度 自动驾驶、交互式应用 减少预处理/后处理耗时
吞吐量 系统整体处理能力 云端批量推理、数据中心 提高并发、优化batch策略

建议:做优化前,先明确你的目标指标是什么。不要什么都想优化。我见过有人把延迟优化到极致,结果吞吐量反而下降了——因为用了太多串行操作。

小结

这一章我们走了一遍部署的全景图。从模型导出到运行时推理,从ONNX到TensorRT,再到三个核心性能指标。说白了,部署就是一场「性能与资源的博弈」。

下一章,我们会深入ONNX导出的细节。到时候我会手把手教你如何避免那些我踩过的坑。

记住:部署不是终点,而是起点。优化永无止境。