模型部署——RKNN模型量化精度分析及混合量化提高精度

2024-03-20 18:44

本文主要是介绍模型部署——RKNN模型量化精度分析及混合量化提高精度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


                        模型部署——RKNN模型量化精度分析及混合量化提高精度(附代码)-CSDN博客

3.1 量化精度分析流程
计算不同情况下,同一层网络输入值的余弦距离,来近似的查看每一层精度损失的情况。具体量化精度分析的流程如下:

3.2 量化精度分析accuracy_analysis接口
量化精度分析调用accuracy_analysis接口,推理并产生快照,也就是dump出每一层的tensor数据。会dump出包括fp32和quant两种数据类型的快照,用于计算量化误差。

注:

该接口只能在 build或 hybrid_quantization_step2之后调用,并且原始模型应该为非量化的模型,否则会调用失败。

该接口使用的量化方式与config_中指定的一致。

3.3.1 参数修改

量化精度分析代码对应于源码包中accuracy_analysis.py脚本,需要修改的地方如下:

from rknn.api import RKNN
import cv2
import numpy as npif __name__=='__main__':rknn = RKNN(verbose=True)             # 打印详细日志# 调用config接口设置模型的预处理、量化方法等参数rknn.config(mean_values = [[123.675,116.28,103.53]],           # mean_values表示预处理要减去的均值化参数std_values = [[58.395,58.395,58.395]],             # std_values 表示预处理要除的标准化参数target_platform = "rk3588"                         # target_platform表示生成的RKNN模型要运行在哪个RKNPU平台上。通常有rk3588,rk3566,rv1126等)# 添加load_xxx接口,进行常用深度学习模型的导入           将深度学习模型导入rknn.load_pytorch(model = "./resnet18.pt",input_size_list = [[1, 3,224,224]])# 使用build接口来构建RKNN模型rknn.build(do_quantization = True,dataset = "dataset.txt",rknn_batch_size = -1)# 调用export_rknn接口导出RKNN模型rknn.export_rknn(export_path="resnet18.rknn")# 使用accuracy_analysis 接口进行模型量化精度分析rknn.accuracy_analysis(inputs = ["space_shuttle_224.jpg"],               # inputs 表示进行推理的图像output_dir = 'snapshot',                          # 表示精度分析的输出目录target = None,                                    # 表示目标硬件平台device_id = None,                                 # 表示设备的编号)rknn.release()

4.2.2.2 代码

具体代码对应于源码包中hrhrid_quantization文件夹中的setp1.py脚本,具体代码如下:

from rknn.api import RKNN
import cv2
import numpy as npif __name__=='__main__':rknn = RKNN(verbose=True)             # 打印详细日志# 调用config接口设置模型的预处理、量化方法等参数rknn.config(mean_values = [[123.675,116.28,103.53]],           # mean_values表示预处理要减去的均值化参数std_values = [[58.395,58.395,58.395]],             # std_values 表示预处理要除的标准化参数target_platform = "rk3588"                         # target_platform表示生成的RKNN模型要运行在哪个RKNPU平台上。通常有rk3588,rk3566,rv1126等)# 添加load_xxx接口,进行常用深度学习模型的导入           将深度学习模型导入rknn.load_pytorch(model = "./resnet18.pt",input_size_list = [[1, 3,224,224]])# 使用hybrid_quantization_step 接口进行混合量化第一步rknn.hybrid_quantization_step1(dataset="dataset.txt",  # 表示模型量化所需要的数据集rknn_batch_size=-1,  # 表示自动调整模型输入batch数量proposal=False,  # 设置为True,可以自动产生混合量化的配置建议,比较耗时# proposal= True,  # 设置为True,可以自动产生混合量化的配置建议,比较耗时proposal_dataset_size=1,  # 第三步骤所用的图片)rknn.release()

4.2.2.5 添加量化层

从上面可以看出25层,33层,43层,51层等损失较大,这里举例选取其中input.25层,将该层从量化层转为非量化层,在resnet18.quantization.cfg文件夹添加,如下:

4.3.3 代码
代码对应源码包中的step2.py,具体代码如下:

from rknn.api import RKNNif __name__=="__main__":rknn = RKNN(verbose=True)# 调用hyborid_quantization_step2接口进行混合量化的第二个步骤rknn.hybrid_quantization_step2(model_input = "resnet18.model",          # 表示第一步生成的模型文件data_input= "resnet18.data",             # 表示第一步生成的配置文件model_quantization_cfg="resnet18.quantization.cfg"  # 表示第一步生成的量化配置文件)# 调用量化精度分析接口(评估RKNN模型)rknn.accuracy_analysis(inputs=["space_shuttle_224.jpg"],output_dir="./snapshot",target = None)# 调用RKNN模型导出RKNN模型rknn.export_rknn(export_path="./resnet18.rknn")rknn.release()

这篇关于模型部署——RKNN模型量化精度分析及混合量化提高精度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830398

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践