模型部署——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

相关文章

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序