本文基于之前博客中的 YOLOv8 Docker 环境,详细讲解:
PyTorch模型
↓
ONNX
↓
FP16 / INT8量化
↓
TensorRT部署
适合人群:
- 想学习 AI 模型部署优化
- 想降低显存占用
- 想提升推理速度
- 想学习 INT8 / FP16
- 想部署到边缘设备
本文环境:
| 项目 | 版本 |
|---|---|
| Ubuntu | 22.04 |
| GPU | GTX1660S |
| Docker | 最新版 |
| CUDA | 容器内置 |
| PyTorch | nvcr官方镜像 |
| YOLOv8 | ultralytics |
一、什么是模型量化?
模型量化(Quantization):
降低模型计算精度
例如:
| 原始类型 | 量化后 |
|---|---|
| FP32 | FP16 |
| FP32 | INT8 |
本质:
用更小的数据类型
表示神经网络参数
二、为什么需要量化?
深度学习模型默认:
FP32(32位浮点)
问题:
- 显存占用大
- 推理速度慢
- 功耗高
因此:
需要低精度推理
三、量化后的优势
1. 模型更小
例如:
| 精度 | 模型大小 |
|---|---|
| FP32 | 100% |
| FP16 | 50% |
| INT8 | 25% |
2. 推理更快
特别:
TensorRT INT8
加速非常明显。
TensorRT 支持 INT8/FP8/FP4 等低精度推理。
3. 显存更低
尤其:
- 边缘设备
- Jetson
- 小显卡
非常重要。
四、量化的缺点
量化不是没有代价。
通常:
精度会下降
尤其:
INT8
比:
FP16
掉点更多。
五、本文使用环境
1. Docker 镜像
沿用之前博客环境:
nvcr.io/nvidia/pytorch:24.12-py3
优势:
- 已内置 CUDA
- 已内置 PyTorch
- GPU 环境稳定
NVIDIA 官方 PyTorch 容器:
六、启动 Docker
docker run -it --gpus all \
--shm-size=16g \
--name yolov8-quant \
-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
官方项目:
2. 安装依赖
pip install -e .
八、准备模型
这里使用:
yolov8n.pt
原因:
- 模型小
- GTX1660S 更适合
- 转换速度快
下载:
wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n.pt
九、量化的两种主流方式
1. PTQ(Post Training Quantization)
训练完成后:
直接量化
优点:
- 简单
- 快速
- 工程常用
缺点:
精度可能下降
TensorRT 支持 PTQ 校准流程。
2. QAT(Quantization Aware Training)
量化感知训练:
训练时模拟INT8误差
优点:
- 精度更高
缺点:
- 训练复杂
- 时间更长
十、GTX1660S 推荐哪种?
你的环境:
GTX1660S
推荐:
| 类型 | 推荐 |
|---|---|
| FP16 | 强烈推荐 |
| INT8 | 可学习 |
| QAT | 后期再学 |
因为:
1660S没有完整INT8 Tensor Core优势
所以:
FP16收益通常更明显
十一、YOLOv8 导出 FP16 ONNX
YOLOv8 官方已经支持:
FP16导出
1. 导出命令
yolo export \
model=yolov8n.pt \
format=onnx \
half=True
参数:
| 参数 | 作用 |
|---|---|
| half=True | FP16量化 |
十二、推荐完整 ONNX 导出命令
yolo export \
model=yolov8n.pt \
format=onnx \
imgsz=640 \
half=True \
dynamic=True \
simplify=True
作用:
| 参数 | 作用 |
|---|---|
| imgsz | 输入尺寸 |
| half | FP16 |
| dynamic | 动态batch |
| simplify | 简化ONNX |
十三、FP16 的优势
FP16:
几乎不掉精度
但:
速度明显提升
因此:
工业界大量使用FP16
十四、YOLOv8 转 TensorRT FP16
1. 直接导出 engine
yolo export \
model=yolov8n.pt \
format=engine \
half=True
生成:
yolov8n.engine
十五、INT8 量化
INT8:
8位整数推理
优点:
- 更小
- 更快
- 更低显存
十六、INT8 的问题
INT8:
精度下降更明显
尤其:
- 小目标
- 检测任务
- YOLO
对量化更敏感。
研究中也提到:
INT8通常会有3~7%mAP下降
尤其在目标检测任务中更明显。
十七、INT8 需要 Calibration
INT8 不是直接转换。
需要:
Calibration(校准)
作用:
统计激活值范围
TensorRT PTQ 流程核心就是 Calibration。
十八、导出 TensorRT INT8
YOLOv8 已支持:
yolo export \
model=yolov8n.pt \
format=engine \
int8=True \
data=coco128.yaml
参数:
| 参数 | 作用 |
|---|---|
| int8=True | 开启INT8 |
| data | 校准数据集 |
十九、为什么需要 data?
INT8:
需要真实图片做校准
否则:
精度会崩
二十、INT8 校准原理
TensorRT 会:
统计每层激活分布
然后:
映射到INT8范围
ONNX Runtime 与 TensorRT 都采用 scale + zero_point 的量化方式。
二十一、FP16 vs INT8
| 项目 | FP16 | INT8 |
|---|---|---|
| 精度损失 | 很小 | 较明显 |
| 推理速度 | 快 | 更快 |
| 部署难度 | 简单 | 较复杂 |
| 校准需求 | 不需要 | 需要 |
二十二、GTX1660S 推荐方案
推荐:
优先FP16
原因:
- 精度稳定
- 转换简单
- 兼容性好
INT8:
更适合Jetson/数据中心
二十三、ONNX Runtime 量化
除了 TensorRT:
ONNX Runtime 也支持:
INT8量化
官方提供 quantize API。
二十四、ONNX Runtime 量化示例
安装:
pip install onnxruntime onnxruntime-tools
量化脚本
from onnxruntime.quantization import quantize_dynamic
from onnxruntime.quantization import QuantType
quantize_dynamic(
"yolov8n.onnx",
"yolov8n_int8.onnx",
weight_type=QuantType.QInt8
)
print("INT8量化完成")
二十五、查看模型大小变化
FP32
12MB
FP16
6MB
INT8
3MB
二十六、真实部署中的量化流程
工业界常见:
PyTorch训练
↓
ONNX
↓
FP16
↓
TensorRT
高端场景:
再进一步INT8
二十七、量化后的性能提升
社区测试中:
TensorRT FP16
通常可提升2~4倍
INT8:
还能进一步提升5~15%
尤其:
- Jetson
- Orin
- NVIDIA GPU
效果明显。
二十八、为什么 YOLO 更适合 FP16?
YOLO:
检测头对量化敏感
INT8:
容易:
- bbox漂移
- 小目标丢失
因此:
很多生产环境优先FP16
二十九、量化 + 裁剪 + 蒸馏
工业界常见组合:
蒸馏
+ 裁剪
+ 量化
最终:
小模型
高速度
低功耗
三十、完整 AI 优化路线
推荐学习路线:
YOLOv8训练
↓
ONNX
↓
FP16
↓
INT8
↓
TensorRT
↓
DeepStream
这是目前 NVIDIA GPU 部署主流路线。
三十一、常见问题
1. INT8 精度掉太多
解决:
增加Calibration数据
社区实践中:
校准数据越真实
精度越稳定
2. 导出失败
升级:
pip install -U ultralytics onnx onnxruntime
3. TensorRT 不支持某些层
解决:
升级TensorRT
4. FP16 没加速
检查:
nvidia-smi
确认:
GPU支持FP16
三十二、总结
本文基于:
- Ubuntu22.04
- Docker
- GTX1660S
- YOLOv8
实现了:
- FP16量化
- INT8量化
- ONNX量化
- TensorRT量化
- Calibration校准
核心思想:
降低精度
提升速度
这是 AI 推理部署中最核心的优化技术之一。
后续进阶方向
后面推荐继续学习:
QAT
↓
TensorRT INT8
↓
DeepStream
↓
Jetson部署
这是目前非常主流的工业部署路线。