剪枝与混合量化
概述
本示例工程侧重于向用户介绍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 |
剪枝+尾部混合量化 |
精度要求高的优化场景 |
环境要求及配置
具体环境参考https://www.gitlink.org.cn/nudt_dsp/netrans)工程,与其保持一致
下载工程
1git clone https://gitlink.org.cn/nudt_dsp/netrans_examples.git
网络剪枝
应用场景:模型尾部节点在PNNA核上计算耗时或精度损失大时,可通过剪枝优化。 剪枝方法:将模型输出层提前输出,裁剪尾部节点,将裁剪部分移至其他计算模块。 操作步骤:
创建剪枝配置文件:在工程目录下新建inputs_outputs.txt文件
配置输出节点:在文件中指定新的输出节点名称(用空格分隔)
获取节点信息:使用Netron打开.onnx文件查看节点信息
执行剪枝:与常规netrans示例步骤一致
示例配置:
1--inputs images --input-size-list '3,640,640' --outputs '377 429 481'
混合量化
混合量化只适用于asymu8,把asymu8的部分层从asymu8量化修改为dfpi16、float32量化,参考示例资源下的yolov5s_crop_hb示例,此示例将裁剪和混合量化相结合
混合量化流程图:
混合量化流程如下: 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
3444_22
其中--inputs '442_52,390_57,338_62,是子图在yolov5s_crop_hb.json中的输入名称,不同子图的输入名称用逗号分隔,--outputs 481_3,429_4,377_5是yolov5s_crop_hb.json格式的子图输出名称,不同子图的输出名称用逗号分隔
4 执行混合量化
1netrans quantize_hybrid ./yolov5s_crop_hb/ asymu8 --cust-qnt-layers cust_qnt_layers.txt
5 添加前后处理
1netrans add_pre_post ./yolov5s_crop_hb/ asymu8 --use-hybrid
6 导出模型
1netrans export ./examples/onnx/yolov5s_crop_hb/ asymu8 --use-hybrid
精度分析与层选择
1 生成对比数据
1# 生成各层tensor数据
2netrans dump ./yolov5s_crop_hb float32
3netrans dump ./yolov5s_crop_hb asymu8
2 对比精度损失
1# 使用TensorsCompare工具
2./tensors_compare ./yolov5s_crop_hb/dump/yolov5s_crop_hb_asymu8/ ./yolov5s_crop_hb/dump/yolov5s_crop_hb_float32/ ./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量化
作者 @ogl ougaoliang@hngwg.com