本文基于之前博客中的 YOLOv8 Docker 环境,详细讲解:
PyTorch模型
↓
导出ONNX
↓
ONNX Runtime推理
↓
TensorRT部署
适合人群:
- YOLOv8 初学者
- 想学习 AI 模型部署
- 想学习 ONNX
- 想做 TensorRT 加速
- 想部署到边缘设备
本文环境:
| 项目 | 版本 |
|---|---|
| Ubuntu | 22.04 |
| GPU | GTX1660S |
| Docker | 最新版 |
| CUDA | 容器内置 |
| PyTorch | nvcr官方镜像 |
| YOLOv8 | ultralytics |
一、什么是 ONNX?
ONNX(Open Neural Network Exchange):
一种通用模型交换格式
作用:
- 让不同框架互通
- 方便部署
- 方便 TensorRT 加速
例如:
PyTorch
↓
ONNX
↓
TensorRT / OpenVINO / ONNXRuntime
ONNX 已成为深度学习部署领域的重要标准。(onnx.ai)
二、为什么需要 ONNX?
因为:
PyTorch 更适合训练
但:
部署并不是最快
实际生产部署:
| 部署方式 | 速度 |
|---|---|
| PyTorch | 普通 |
| ONNX Runtime | 更快 |
| TensorRT | 非常快 |
因此通常:
训练:
PyTorch
部署:
ONNX/TensorRT
三、本文使用的环境
1. Docker 镜像
沿用之前博客环境:
nvcr.io/nvidia/pytorch:24.12-py3
优势:
- 自带 CUDA
- 自带 PyTorch
- GPU 环境完整
- 避免宿主机污染
NVIDIA 官方 PyTorch 容器:(catalog.ngc.nvidia.com)
四、启动 Docker
1. 启动容器
docker run -it --gpus all \
--shm-size=16g \
--name yolov8-onnx \
-v /home/workspace:/workspace \
nvcr.io/nvidia/pytorch:24.12-py3
五、安装 YOLOv8
1. 克隆源码
cd /workspace
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics
官方项目:Ultralytics YOLOv8 Github
2. 安装依赖
pip install -e .
3. 验证安装
yolo version
六、准备模型
这里直接使用官方预训练模型:
yolov8n.pt
原因:
- 模型小
- 转换快
- GTX1660S 更容易测试
下载:
wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n.pt
七、YOLOv8 导出 ONNX
YOLOv8 官方已经内置 ONNX 导出。
非常方便。
八、最简单的导出方式
1. 导出 ONNX
yolo export \
model=yolov8n.pt \
format=onnx
导出完成后:
yolov8n.onnx
九、导出参数详解
1. 指定输入尺寸
yolo export \
model=yolov8n.pt \
format=onnx \
imgsz=640
2. 使用 FP16
减少模型大小。
yolo export \
model=yolov8n.pt \
format=onnx \
half=True
注意:
FP16需要GPU支持
GTX1660S 支持 FP16。
3. 动态 Batch
部署推荐。
yolo export \
model=yolov8n.pt \
format=onnx \
dynamic=True
作用:
支持不同batch size
4. 简化 ONNX
推荐开启。
yolo export \
model=yolov8n.pt \
format=onnx \
simplify=True
作用:
- 删除冗余节点
- 减少模型大小
- 提高推理性能
十、推荐完整导出命令
推荐:
yolo export \
model=yolov8n.pt \
format=onnx \
imgsz=640 \
half=True \
dynamic=True \
simplify=True
这是最常见的生产导出方式。
十一、导出成功日志
正常会看到:
ONNX: export success
Saved as yolov8n.onnx
十二、查看 ONNX 模型
1. 安装 ONNX 工具
pip install onnx
2. 查看模型
import onnx
model = onnx.load("yolov8n.onnx")
print(model)
十三、验证 ONNX 模型
1. 安装 onnxruntime
pip install onnxruntime-gpu
2. 编写测试脚本
创建:
touch test_onnx.py
十四、ONNX 推理代码
import onnxruntime as ort
import numpy as np
session = ort.InferenceSession(
"yolov8n.onnx",
providers=["CUDAExecutionProvider"]
)
input_name = session.get_inputs()[0].name
dummy = np.random.randn(
1, 3, 640, 640
).astype(np.float32)
outputs = session.run(
None,
{input_name: dummy}
)
print("推理成功")
print(outputs[0].shape)
运行:
python test_onnx.py
十五、ONNX Runtime 为什么更快?
因为:
ONNX Runtime做了图优化
包括:
- 算子融合
- Kernel优化
- Tensor优化
- CUDA加速
ONNX Runtime 官方介绍:(onnxruntime.ai)
十六、ONNX 的核心优势
1. 跨平台
支持:
- Linux
- Windows
- ARM
- Jetson
2. 跨框架
支持:
- PyTorch
- TensorFlow
- Paddle
- MXNet
3. 更适合部署
尤其:
工业AI
边缘AI
推理服务器
十七、后续 TensorRT 加速
通常:
PyTorch
↓
ONNX
↓
TensorRT Engine
TensorRT:
- NVIDIA 官方推理框架
- GPU 加速极强
很多 YOLO 部署最终都会转 TensorRT。
TensorRT 官方:(developer.nvidia.com)
十八、GTX1660S 部署建议
1660S:
- 6GB 显存
- 无 Tensor Core INT8
- FP16 性能不错
推荐:
| 项目 | 推荐 |
|---|---|
| 模型 | yolov8n/s |
| batch | 1 |
| FP16 | 开启 |
| imgsz | 640 |
十九、常见问题
1. CUDA 不可用
检查:
nvidia-smi
2. onnxruntime GPU 无法使用
检查:
print(ort.get_available_providers())
应包含:
CUDAExecutionProvider
3. 导出失败
升级:
pip install -U ultralytics onnx onnxsim
4. Docker GPU 不可见
检查:
docker run --gpus all
二十、ONNX 与 TensorRT 的关系
很多新手会误解:
ONNX ≠ TensorRT
关系:
ONNX:
模型交换格式
TensorRT:
NVIDIA推理引擎
通常:
TensorRT读取ONNX
生成engine
二十一、完整 AI 部署流程
真实项目中:
PyTorch训练
↓
导出ONNX
↓
TensorRT加速
↓
Docker部署
↓
FastAPI/Flask服务化
这是目前非常主流的工业部署方案。
二十二、总结
本文基于:
- Ubuntu22.04
- GTX1660S
- Docker
- YOLOv8
实现了:
- YOLOv8 环境部署
- ONNX 导出
- ONNX Runtime 推理
- GPU ONNX 加速
核心命令:
yolo export \
model=yolov8n.pt \
format=onnx
这是学习:
- TensorRT
- 模型部署
- AI推理优化
最重要的一步。
后续进阶方向
推荐继续学习:
ONNX
↓
TensorRT
↓
FP16
↓
INT8量化
↓
DeepStream
这是 NVIDIA GPU 部署主流路线。