1. YOLO模型部署概述:部署流程全景图、ONNX与TensorRT简介、性能指标
各位同学,欢迎来到《YOLO模型部署中的内存与性能优化实战》的第一章。
说实话,我见过太多人把模型训练得漂漂亮亮,一到部署就翻车。我自己也踩过不少坑。所以这一章,我们先不急着写代码,而是把整个部署的「地图」铺开来看清楚。
1.1 部署流程全景图:从训练到上线
YOLO模型部署,说白了就是让训练好的模型在真实设备上跑起来。你想想看,训练时我们用PyTorch,用GPU,数据随便喂。但到了实际场景——比如一个嵌入式摄像头,或者一台只有CPU的服务器——环境完全不一样了。
我习惯把部署流程分成四个阶段:
- 模型导出:把PyTorch模型转成中间格式。比如ONNX。
- 模型优化:做量化、剪枝、算子融合。这一步最考验经验。
- 模型编译:针对特定硬件生成可执行文件。TensorRT干的就是这个。
- 运行时推理:加载优化后的模型,处理输入输出,跑起来。
嗯,这里要注意:很多人以为导出完就结束了。其实导出只是开始。我在项目中遇到过,一个模型导出后直接跑,速度反而比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导出的细节。到时候我会手把手教你如何避免那些我踩过的坑。
记住:部署不是终点,而是起点。优化永无止境。