【3】基于 Docker + YOLOv8 环境实现模型裁剪(GTX1660S + Ubuntu22.04)
·
本文基于之前博客中的 YOLOv8 Docker 环境,详细讲解:
YOLOv8模型
↓
模型裁剪(Pruning)
↓
微调恢复精度
↓
ONNX/TensorRT部署
适合人群:
- 想学习 AI 模型压缩
- 想减少模型体积
- 想提升推理速度
- 想学习剪枝/蒸馏/量化
- 想做边缘部署
本文环境:
| 项目 | 版本 |
|---|---|
| Ubuntu | 22.04 |
| GPU | GTX1660S |
| Docker | 最新版 |
| CUDA | 容器内置 |
| PyTorch | nvcr官方镜像 |
| YOLOv8 | ultralytics |
一、什么是模型裁剪?
模型裁剪(Pruning):
删除神经网络中“不重要”的参数
核心思想:
很多神经元其实没什么用
因此:
- 可以删除
- 不影响太多精度
- 还能减少计算量
二、为什么需要裁剪?
深度学习模型通常:
参数很多
计算量很大
尤其:
| 模型 | 参数量 |
|---|---|
| yolov8x | 非常大 |
| yolov8l | 很大 |
| yolov8m | 较大 |
边缘设备:
- GPU弱
- 显存小
- 功耗低
因此:
必须做模型压缩
三、模型裁剪的优势
1. 模型更小
例如:
40MB
↓
20MB
2. 推理更快
减少:
- FLOPs
- MACs
- GPU计算
3. 更适合部署
适用于:
- Jetson
- 工控机
- IPC
- ARM设备
四、模型裁剪的缺点
裁剪并不是白赚。
问题:
裁剪越狠
精度下降越大
因此:
裁剪后通常需要微调(Fine-tune)
恢复精度。
五、本文使用环境
1. Docker 镜像
沿用之前博客环境:
nvcr.io/nvidia/pytorch:24.12-py3
优势:
- 自带 CUDA
- 自带 PyTorch
- GPU 环境稳定
NVIDIA NGC 官方容器:(catalog.ngc.nvidia.com)
六、启动 Docker
docker run -it --gpus all \
--shm-size=16g \
--name yolov8-prune \
-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 .
八、准备模型
这里使用:
yolov8n.pt
因为:
- 模型小
- GTX1660S 更容易测试
- 裁剪速度快
下载:
wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n.pt
九、模型裁剪原理
很多卷积权重:
接近0
说明:
贡献不大
因此:
可以删除。
十、两种主流裁剪方式
1. 非结构化裁剪
删除:
单个权重
例如:
0.000001
直接变成:
0
优点:
- 简单
缺点:
实际加速不明显
因为:
GPU 不喜欢稀疏矩阵。
2. 结构化裁剪(推荐)
删除:
- Channel
- Conv层
- Filter
例如:
64 channels
↓
32 channels
真正减少:
- FLOPs
- 显存
- 推理时间
这是工业界主流方案。
十一、PyTorch 裁剪工具
PyTorch 官方:
torch.nn.utils.prune
提供:
- L1裁剪
- 随机裁剪
- 结构化裁剪
PyTorch 官方文档:(pytorch.org)
十二、创建裁剪脚本
创建:
touch prune_yolov8.py
十三、完整裁剪代码
import torch
import torch.nn.utils.prune as prune
from ultralytics import YOLO
# 加载模型
model = YOLO("yolov8n.pt")
net = model.model
# 遍历所有卷积层
for name, module in net.named_modules():
if isinstance(module, torch.nn.Conv2d):
print(f"Pruning {name}")
# L1非结构化裁剪
prune.l1_unstructured(
module,
name="weight",
amount=0.3
)
# 永久生效
prune.remove(module, "weight")
# 保存裁剪后的模型
torch.save(
net.state_dict(),
"yolov8n_pruned.pth"
)
print("模型裁剪完成")
十四、代码解析
1. amount=0.3
表示:
裁剪30%权重
2. prune.remove()
作用:
真正删除mask
否则:
只是临时mask。
十五、运行裁剪
python prune_yolov8.py
输出:
Pruning model.0.conv
Pruning model.1.conv
...
模型裁剪完成
十六、查看模型大小变化
裁剪前
ls -lh yolov8n.pt
例如:
6.2MB
裁剪后
ls -lh yolov8n_pruned.pth
可能:
4.5MB
十七、为什么推理速度可能没变化?
很多新手会疑惑:
模型小了
为什么速度没提升?
原因:
非结构化裁剪
不会真正减少计算图
因此:
GPU 实际加速有限。
十八、真正工业界怎么做?
工业界:
结构化裁剪
例如:
- 删除整个 Channel
- 删除整个 Filter
- 修改网络结构
这样:
才能真正加速
十九、结构化裁剪示意
例如:
原始:
Conv:
64 channels
裁剪后:
Conv:
32 channels
这样:
- 参数减少
- FLOPs减少
- TensorRT真正加速
二十、裁剪后的问题
裁剪后:
精度通常下降
因此:
必须:
重新训练(Fine-tune)
二十一、微调恢复精度
例如:
yolo detect train \
model=yolov8n_pruned.pth \
data=coco128.yaml \
epochs=10
作用:
恢复精度
二十二、推荐裁剪比例
| 裁剪比例 | 建议 |
|---|---|
| 10% | 很安全 |
| 20% | 推荐 |
| 30% | 常用 |
| 50% | 容易掉点 |
| 70% | 基本废了 |
GTX1660S:
推荐:
20~30%
二十三、模型裁剪 + 蒸馏
工业界常见:
蒸馏
+
裁剪
流程:
Teacher
↓
蒸馏
↓
小模型
↓
裁剪
↓
Fine-tune
效果非常好。
二十四、后续 ONNX/TensorRT
裁剪后:
推荐继续:
PyTorch
↓
ONNX
↓
TensorRT
这是部署主流路线。
二十五、为什么 YOLOv8 适合裁剪?
YOLOv8:
- Backbone清晰
- Conv结构明显
- 模块化设计
因此:
非常适合剪枝
二十六、GTX1660S 裁剪建议
1660S:
- 6GB显存
- Tensor Core有限
- 更适合轻量模型
推荐:
| 项目 | 推荐 |
|---|---|
| 模型 | yolov8n/s |
| 裁剪率 | 20~30% |
| imgsz | 640 |
| batch | 4 |
二十七、常见问题
1. 裁剪后无法加载
原因:
网络结构变化
解决:
- 使用相同结构
- 或重新构建模型
2. 精度掉太多
原因:
裁剪过度
解决:
- 降低 pruning ratio
- 增加 fine-tune
3. 推理没加速
原因:
只是稀疏化
需要:
结构化裁剪
二十八、完整 AI 模型优化路线
推荐学习路线:
YOLOv8训练
↓
蒸馏
↓
裁剪
↓
ONNX
↓
TensorRT
↓
INT8量化
这是目前视觉 AI 非常主流的路线。
二十九、总结
本文基于:
- Ubuntu22.04
- Docker
- GTX1660S
- YOLOv8
实现了:
- 模型裁剪
- 权重删除
- Fine-tune恢复
- ONNX部署方向
核心思想:
删除不重要参数
实现:
- 更小模型
- 更低显存
- 更快推理
这是 AI 部署优化中的核心技术之一。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)