You're reading an pre-release version of this documentation.
For the latest stable release version, please have a look at master.

剪枝与混合量化

概述

本示例工程介绍 Netrans 下的模型优化和精度优化方法,包括通过网络裁剪提升速度和精度、混合量化提升精度。

项目结构

详情参考:https://gitlink.org.cn/nudt_dsp/netrans_examples.git

1├── yolov5s/                     # yolov5s 网络示例
2├── yolov5s_crop/                # 裁剪网络示例
3├── yolov5s_crop_hb/             # 混合量化示例
4├── tensors_compare/             # 相似度对比工具
5└── README.md                    # 项目说明文档

版本区别

模型版本

特点

应用场景

yolov5s

官方权重直接量化

基础推理场景

yolov5s_crop

倒数第三层 reshape 提前输出

尾部节点计算耗时/精度差的场景

yolov5s_crop_hb

剪枝 + 尾部混合量化

精度要求高的优化场景


环境配置

具体环境参考 Netrans 工程,与其保持一致。

下载工程:

1git clone https://gitlink.org.cn/nudt_dsp/netrans_examples.git

网络剪枝

应用场景

模型尾部节点在 PNNA 核上计算耗时或精度损失大时,可通过剪枝优化。

剪枝方法

将模型输出层提前输出,裁剪尾部节点,将裁剪部分移至其他计算模块。

操作步骤

  1. 创建剪枝配置文件:在工程目录下新建 inputs_outputs.txt 文件

  2. 配置输出节点:在文件中指定新的输出节点名称(用空格分隔)

  3. 获取节点信息:使用 Netron 打开 .onnx 文件查看节点信息

  4. 执行剪枝:与常规 Netrans 示例步骤一致

示例配置

1--inputs images --input-size-list '3,640,640' --outputs '377 429 481'

混合量化

混合量化仅适用于 asymu8,将 asymu8 的部分层修改为 dfpi16 或 float32 量化。以下示例将裁剪和混合量化相结合。

流程图

graph TD A[开始混合量化流程] --> B[模型加载] B --> C[asymu8量化] C --> D[准备混合量化配置] D --> E{选择量化方式} E --> F[子图量化] E --> G[单层量化] F --> H[配置输入输出] H --> I[填写层配置文件] G --> J[配置层名称] J --> K[填写层配置文件] I --> L[执行混合量化] K --> L L --> M[添加后处理网络] M --> N[导出最终模型] N --> O[量化完成] C --> P[精度分析分支] P --> Q[生成float32数据] P --> R[生成asymu8数据] Q --> S[对比层相似度] R --> S S --> T[分析精度结果] T --> U{精度损失严重?} U --> V[将该层/子图加入<br>cust_qnt_layers.txt] U --> W[保持asymu8量化] V --> D W --> D

操作步骤

1. 模型加载

1netrans load ./yolov5s_crop_hb --mean 0 0 0 --scale 255 255 255

2. asymu8 量化

1netrans quantize ./yolov5s_crop_hb asymu8

3. 配置混合量化文件

新建 cust_qnt_layers.txt,支持两种格式:

  • 子图量化格式:

    1--inputs 442_52,390_57,338_62 --outputs 481_3,429_4,377_5
    
  • 单层量化格式(每行一层):

    1442_52_acuity_mark_perm_270
    2442_52
    

说明:--inputs 是子图在 yolov5s_crop_hb.json 中的输入名称,不同子图用逗号分隔;--outputs 是子图输出名称。

4. 执行混合量化

1netrans quantize_hybrid ./yolov5s_crop_hb/ asymu8 --cust-qnt-layers cust_qnt_layers.txt --hybrid-qtype dfpi16

5. 导出模型

1netrans export ./yolov5s_crop_hb/ asymu8 --use-hybrid

精度分析与层选择

1. 生成对比数据

1# 生成各层 tensor 数据
2netrans dump ./yolov5s_crop_hb fp16
3netrans dump ./yolov5s_crop_hb asymu8

2. 对比精度损失

1# 使用 TensorsCompare 工具
2./tensors_compare ./yolov5s_crop_hb/dump/yolov5s_crop_hb_asymu8/ \
3                  ./yolov5s_crop_hb/dump/yolov5s_crop_hb_fp16/ \
4                  ./yolov5s_crop_hb/yolov5s_crop_hb.json

3. 选择量化层

  1. 查看生成的 yolov5s_crop_hb_precision_analysis.json 文件

  2. 主要参考 Cosine Similarity 值(越接近 1 相似度越高)

  3. 将精度损失大的层或子图(低相似度)加入 cust_qnt_layers.txt,改为 dfpi16 量化

4. 关键点

  • 混合量化仅适用于 asymu8 量化类型

  • 可通过 Netron 查看 yolov5s_crop_hb.json 获取层/子图名称

  • 支持子图量化和单层量化混合配置

  • 优先对精度敏感层使用 dfpi16 量化


作者:ougaoliang