本文基于之前博客中的 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 部署优化中的核心技术之一。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐