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

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑