|
|
||
|---|---|---|
| yolov5s | ||
| yolov5s_crop | ||
| yolov5s_crop_hb | ||
| README.md | ||
| tensors_compare | ||
| yolov5s_crop_hb.py | ||
README.md
netrans工具示例
概述
本示例工程介绍 Netrans 下的模型优化和精度优化方法,包括通过网络裁剪提升速度和精度、混合量化提升精度。
项目结构
详情参考:https://gitlink.org.cn/nudt_dsp/netrans_examples.git
├── yolov5s/ # yolov5s 网络示例
├── yolov5s_crop/ # 裁剪网络示例
├── yolov5s_crop_hb/ # 混合量化示例
├── tensors_compare/ # 相似度对比工具
└── README.md # 项目说明文档
版本区别
| 模型版本 | 特点 | 应用场景 |
|---|---|---|
| yolov5s | 官方权重直接量化 | 基础推理场景 |
| yolov5s_crop | 倒数第三层 reshape 提前输出 | 尾部节点计算耗时/精度差的场景 |
| yolov5s_crop_hb | 剪枝 + 尾部混合量化 | 精度要求高的优化场景 |
环境配置
具体环境参考 Netrans 工程,与其保持一致。
下载工程:
git clone https://gitlink.org.cn/nudt_dsp/netrans_examples.git
网络剪枝
应用场景
模型尾部节点在 PNNA 核上计算耗时或精度损失大时,可通过剪枝优化。
剪枝方法
将模型输出层提前输出,裁剪尾部节点,将裁剪部分移至其他计算模块。
操作步骤
- 创建剪枝配置文件:在工程目录下新建
inputs_outputs.txt文件 - 配置输出节点:在文件中指定新的输出节点名称(用空格分隔)
- 获取节点信息:使用 Netron 打开
.onnx文件查看节点信息 - 执行剪枝:与常规 Netrans 示例步骤一致
示例配置
--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. 模型加载
netrans load ./yolov5s_crop_hb --mean 0 0 0 --scale 255 255 255
2. asymu8 量化
netrans quantize ./yolov5s_crop_hb asymu8
3. 配置混合量化文件
新建 cust_qnt_layers.txt,支持两种格式:
-
子图量化格式:
--inputs 442_52,390_57,338_62 --outputs 481_3,429_4,377_5 -
单层量化格式(每行一层):
442_52_acuity_mark_perm_270 442_52
说明:
--inputs是子图在yolov5s_crop_hb.json中的输入名称,不同子图用逗号分隔;--outputs是子图输出名称。
4. 执行混合量化
netrans quantize_hybrid ./yolov5s_crop_hb/ asymu8 --cust-qnt-layers cust_qnt_layers.txt --hybrid-qtype dfpi16
5. 导出模型
netrans export ./yolov5s_crop_hb/ asymu8 --use-hybrid
精度分析与层选择
1. 生成对比数据
# 生成各层 tensor 数据
netrans dump ./yolov5s_crop_hb fp16
netrans dump ./yolov5s_crop_hb asymu8
2. 对比精度损失
# 使用 TensorsCompare 工具
./tensors_compare ./yolov5s_crop_hb/dump/yolov5s_crop_hb_asymu8/ \
./yolov5s_crop_hb/dump/yolov5s_crop_hb_fp16/ \
./yolov5s_crop_hb/yolov5s_crop_hb.json
3. 选择量化层
- 查看生成的
yolov5s_crop_hb_precision_analysis.json文件 - 主要参考 Cosine Similarity 值(越接近 1 相似度越高)
- 将精度损失大的层或子图(低相似度)加入
cust_qnt_layers.txt,改为 dfpi16 量化
4. 关键点
- 混合量化仅适用于 asymu8 量化类型
- 可通过 Netron 查看
yolov5s_crop_hb.json获取层/子图名称 - 支持子图量化和单层量化混合配置
- 优先对精度敏感层使用 dfpi16 量化
作者 {{liangliangou}}