1. YOLO与部署概览:从模型到落地的第一公里
各位同学,欢迎来到这门实战课。我是你们这趟部署之旅的向导。
说实话,每次带新人做模型部署,我都会先问一个问题:你手里的模型,到底要在哪儿跑? 是在实验室的 3090 上飙帧率,还是塞进边缘盒子、工控机,甚至是手机芯片里?
这个问题想明白了,你才会理解为什么我们要折腾 ONNX、TensorRT 这些东西。说白了,部署就是把模型从「能跑」变成「跑得快」。而 YOLO 系列,恰好是练手的最佳对象——结构经典、版本多、社区活跃,踩坑经验一搜一大把。
1.1 YOLO系列发展史:一个「快」字引发的进化
YOLO 的故事,得从 2016 年说起。
那时候做目标检测,主流还是 Faster R-CNN 这种两阶段方法。精度不错,但速度嘛……我当年在项目里试过,一张图跑 200 毫秒,根本没法做实时视频分析。直到 YOLOv1 出现,Joseph Redmon 直接把检测当成回归问题来做——一次前向,框和类别全出来。这在当时是颠覆性的。
我简单梳理一下关键节点,你感受下这个进化速度:
| 版本 | 年份 | 核心变化 | 我的印象 |
|---|---|---|---|
| YOLOv1 | 2016 | 开创性端到端检测,45 FPS | 精度一般,但速度惊艳 |
| YOLOv2 | 2017 | 引入Anchor、Batch Norm | 召回率提升明显 |
| YOLOv3 | 2018 | 多尺度预测、Darknet-53 | 真正可用的工业级模型 |
| YOLOv4 | 2020 | Bag of Freebies,CSP结构 | 精度速度双杀,部署友好 |
| YOLOv5 | 2020 | PyTorch原生,超轻量 | 社区最活跃,教程最多 |
| YOLOv8 | 2023 | Anchor-Free,任务统一框架 | 官方支持导出,省心很多 |
看到没?从 v3 开始,YOLO 就进入了「又快又准」的实用阶段。我个人习惯把 v5 和 v8 作为部署首选——v5 生态成熟,v8 官方导出链路更顺。至于 v6、v7、v9、v10……嗯,有些版本我建议你等社区沉淀半年再用,别当小白鼠。
核心认知: 部署不是追新。选一个你熟悉、社区活跃、导出工具链完善的版本,比选最新版本重要得多。我在产线上见过太多因为追新版本导致算子不兼容,最后回退 v5 的案例。
1.2 ONNX与TensorRT简介:部署界的「通用语言」和「加速引擎」
好,模型选好了。现在问题来了:你拿 PyTorch 训出来的 .pt 文件,怎么塞进边缘设备的芯片里?
答案就是 ONNX。
ONNX(Open Neural Network Exchange),说白了就是模型界的「普通话」。不管你用 PyTorch、TensorFlow 还是 PaddlePaddle 训的模型,都能转成 ONNX 格式。这样下游的推理引擎(比如 TensorRT、OpenVINO、ONNX Runtime)就能统一读取。
我举个例子你就明白了:
# PyTorch模型 -> ONNX
import torch
model = torch.load('yolov5s.pt')
dummy_input = torch.randn(1, 3, 640, 640)
torch.onnx.export(
model,
dummy_input,
'yolov5s.onnx',
opset_version=11,
input_names=['images'],
output_names=['output']
)
print("ONNX导出完成!")
这段代码,就是整个部署流程的起点。你想想看,没有 ONNX,每个框架都得写一套推理代码,那得多痛苦?
而 TensorRT,是 NVIDIA 推出的推理优化引擎。它干的事很简单:把你的模型「编译」成当前 GPU 上跑得最快的版本。怎么做?
- 层融合:把 Conv + BN + ReLU 合并成一个算子,减少显存读写
- 精度校准:FP32 转 FP16 甚至 INT8,速度翻倍,精度损失可控
- 内核自动调优:针对你的 GPU 型号,选最优的 CUDA 内核
我曾经在一个项目中,把 YOLOv5s 从 PyTorch 的 30ms 优化到 TensorRT FP16 的 8ms。客户当场就愣住了。说白了,TensorRT 就是让 GPU 干 GPU 该干的事,而不是让 PyTorch 的 Python 层拖后腿。
一个小建议: 刚开始接触 TensorRT,别一上来就搞 INT8 量化。先跑通 FP32,再试 FP16,最后再碰 INT8。INT8 的校准集选择和精度回退策略,够你折腾一周的。
1.3 部署流程总览:一张图看懂全链路
下面这张图,是我每次培训必画的。它把整个部署流程拆成了 5 个阶段,你跟着走一遍,心里就有底了。
这张图里,我最想强调的就是底部那句话:端到端对齐。我在项目中遇到过太多次了——训练时用 BGR 归一化,导出时忘了设,推理时又用 RGB,结果 mAP 直接掉了一半。你想想看,这种低级错误,查起来多浪费时间?
1.4 环境准备:工欲善其事,必先利其器
好了,理论讲完,咱们得动手了。部署环境说白了就三样东西:CUDA、cuDNN、Python。但就是这三样,版本搭配不对,能让你卡一整天。
我直接给你一个经过验证的版本组合:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| CUDA | 11.8 或 12.1 | 11.8 兼容性最好,12.x 支持新卡 |
| cuDNN | 8.9.x(对应 CUDA 版本) | 必须与 CUDA 版本匹配 |
| Python | 3.8 - 3.11 | 3.10 是目前最稳妥的选择 |
| PyTorch | 2.0.x 或 2.1.x | 对应 CUDA 版本安装 |
| TensorRT | 8.6.x 或 10.x | 注意 Python 绑定版本 |
避坑指南: 我曾经在 Ubuntu 20.04 上装了 CUDA 12.0 + cuDNN 9.0,结果 TensorRT 8.5 死活不认。查了两天才发现,TensorRT 8.5 最高只支持 cuDNN 8.9。所以我的建议是:先确定 TensorRT 版本,再倒推 CUDA 和 cuDNN 的版本。别装反了。
安装步骤其实很简单,我习惯用 conda 管理环境:
# 1. 创建 conda 环境
conda create -n yolo_deploy python=3.10
conda activate yolo_deploy
# 2. 安装 PyTorch(以 CUDA 11.8 为例)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
# 3. 安装 TensorRT(建议用 pip 或 tar 包)
# 方法一:pip 安装(TensorRT 10.x 开始支持)
pip install tensorrt==10.0.1
# 方法二:tar 包安装(更可控)
# 下载 TensorRT-10.0.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
# 解压后设置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/TensorRT/lib
# 4. 验证安装
python -c "import torch; print(torch.cuda.is_available())"
python -c "import tensorrt as trt; print(trt.__version__)"
跑完上面这几行,如果都打印出版本号,恭喜你,环境就绪了。
一个小技巧: 如果你在 Windows 上折腾,建议直接用 WSL2 + Ubuntu。我试过在 Windows 原生环境下配 TensorRT,C++ 编译链的坑比 Linux 多一倍。省下时间多睡会儿觉,不香吗?
本章小结
这一章,我们走完了部署的「第一公里」。你知道了 YOLO 从 v1 到 v8 的进化脉络,理解了 ONNX 是「通用语言」、TensorRT 是「加速引擎」,也看到了从训练到部署的完整链路。最后,我们把环境搭好了。
嗯,说实话,部署这件事,80% 的坑都在环境和版本兼容上。你把这一章的基础打牢,后面导出 ONNX、构建 TensorRT engine、写推理代码,都会顺很多。
准备好了吗?下一站,我们开始动手导出第一个 ONNX 模型。