RKNPU入门与实践 ---- 混合量化

news2024/9/19 10:47:27

目录

前言

一、混合量化

1.1 概念介绍 

1.1.1 hybrid_quantization_step1

1.1.2 hybrid_quantization_step2

二、实际编写程序 

2.1混合量化第一阶段 

2.2 混合量化第二阶段 

三、混合量化第一步接口参数proposal

前言

为什么要进行混合量化?
答案:提高模型每一层精度,提高模型精度 
从博文:
RKNPU2从入门到实践 --- 【6】模型评估----量化精度分析-CSDN博客我们得到了量化精度,如下图所示,下图表示的是连板推理时模型的量化精度,我们以input.25这一层为例,发现该层的runtime_error中的golden_err【计算的是上一层的输出层,也即input.25当前层的精度】只有0.930068,这是比较小的。

那对于这种问题,该如何处理呢?
这就需要混合量化来优化这个精度了。

一、混合量化

1.1 概念介绍 

1.1.1 hybrid_quantization_step1

混合量化第一阶段

      使用混合量化功能时,第一阶段调用的主要接口是 hybrid_quantization_step1,用于生成临时 模 型 文 件 ( {model_name}.model ) 、 数 据 文 件 ( {model_name}.data ) 和 量 化 配 置 文 件({model_name}.quantization.cfg)。接口详情如下:

1.1.2 hybrid_quantization_step2

混合量化第二阶段

用于使用混合量化功能时生成 RKNN 模型,接口详情如下: 

举例如下:

二、实际编写程序 

创建项目文件夹,以及相应的文件,并将相关资料放入项目文件夹中,如下图所示。 


在step1.py文件中,先写入如下代码:

from rknn.api import RKNN

if __name__ == '__main__':
    # 第一步:创建RKNN对象
    rknn = RKNN()

    # 第二步:配置RKNN对象参数
    rknn.config(
        mean_values=[[123.675,116.28,103.53]],
        std_values=[[58.395,58.395,58.395]],
        target_platform='rk3588'
        # 其余参数保持默认即可
    )

    # 第三步:调用load_pytorch接口导入pt模型
    rknn.load_pytorch(model='./resnet18.pt',input_size_list=[[1, 3, 224, 224]])

    
    # 最后一步:释放RKNN对象
    rknn.release()

2.1混合量化第一阶段 

根据流程图,第四步为混合量化的step1,对应的代码为:

添入step1代码后的整体代码如下:

from rknn.api import RKNN

if __name__ == '__main__':
    # 第一步:创建RKNN对象
    rknn = RKNN()

    # 第二步:配置RKNN对象参数
    rknn.config(
        mean_values=[[123.675,116.28,103.53]],
        std_values=[[58.395,58.395,58.395]],
        target_platform='rk3588'
        # 其余参数保持默认即可
    )

    # 第三步:调用load_pytorch接口导入pt模型
    rknn.load_pytorch(model='./resnet18.pt',input_size_list=[[1, 3, 224, 224]])

    # 使用hybrid_quantization_step1 接口进行混合量化的第一步
    rknn.hybrid_quantization_step1(
        dataset='dataset.txt', # 表示模型量化所需要的数据集
        rknn_batch_size=-1, # 表示自动调整模型输入batch数量
        proposal=False, # 默认为False。设置为True,可以自动产生混合量化的配置建议值
        proposal_dataset_size=1
    )
    # 最后一步:释放RKNN对象
    rknn.release()

接下来运行该程序:
 得到如下图:

我们要对得到的resnet18.quantization.cfg文件进行修改。 该文件内容如下所示:

      修改的地方为该文件的第一行,即custom_quantize_layers:{},将input.25层由量化层转换为非量化层,如下所示:

2.2 混合量化第二阶段 

 在step2.py文件中编写程序:

from rknn.api import RKNN

if __name__ == '__main__':
    # 创建RKNN对象
    rknn = RKNN()
    
    # 直接调用hybrid_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='rk3588'
    )
    
    # 调用RKNN模型导出接口(方便后续模型部署)
    rknn.export_rknn(
        export_path='./resnet18.rknn'
    )
    
    #释放RKNN对象
    rknn.release()

运行step2.py程序: 

此处有bug,后续更新!!

上图来自于:06_RKNN 模型评估-量化精度分析_哔哩哔哩_bilibili
可以看到,input.25层的golden_err从原来的0.930068变为了现在的0.999746。精度变高。
将经过混合量化和没有经过混合量化的进行对比,这里贴出没有经过混合量化的精度信息截图。

      我们从上图中可以看到,input.25这一层的下一层是142层,但是在经过混合量化之后,我们发现input.25层的下一层并不是142层,而是input.25__int8,这一层在input.25层和142层中间,这是为什么呢?这会带来什么样的后果呢?
      由于142层的输入类型为int8类型,而input.25已经变为float16类型,故浮点数转换为int8类型,因此才会有input.25__int8这一层的出现。我们看到,input.25__int8层的golden_err只有0.930005。因此,这么一操作,精度不增反减了,那该如何补救呢?
      我们干脆直接跳过input.25__int8这一层,因此修改.cfg文件,如下图所示:

加入的 '142': float16 表示将input.25层的输出层,即142层由量化层变为非量化层。
然后重新运行step2.py程序,得到(下图是将终端打印信息拷贝到记事本中,便于观察):

可以看到,input.25 层周围的精度值都变高了,这也就证明了混合量化效果有效。
以上是对 resnet18.pt 模型的某一层进行混合量化。若对模型进行更多层的混合量化,那么模型的效果会大大提高。

三、混合量化第一步接口参数proposal

      在上面,proposal这个参数的取值为False,导致了我们在混合量化第二阶段修改.cfg文件时需要手动去修改。
      那么我们将这个参数取值设置为True,又会有怎样的变化呢?

随后运行step1.py程序,得到:

我们来看看.cfg文件有什么变化:

      我们发现.cfg文件中的custom_quantize_layers由proposal取值为False时的空变为了proposal取值为True时的好多内容。
这相当于是手动筛选精度差的层变为了自动筛选精度差的层。何乐而不为呢? 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zookeeper未授权访问的漏洞处理

echo envi |nc 192.168.0.1 2181 这个命令可以用于获取Zookeepr(下面有zk代替)目标服务器的环境信息、部署路径、版本等敏感信息。如果这些信息被恶意利用,确实可能导致安全漏洞,进而对网络和服务器安全构成威胁。 1.执行zkCli.…

XSS LABS - Level 17 过关思路

关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 进入靶场,空空如也,右击页面,查看网页源码,找找可疑点: 可以看到,靶场默认传参,都传…

初赛试题-2022年CSP-J2

目录 先言 二、阅读程序(判断题1.5分,选择题3分,共40分) (1) 16. 17. 18. 19. 20. 21. (2) 22. 23. 24. 25. 26. 27. (3) 28. 29. 30. 3…

18.神经网络 - 非线性激活

神经网络 - 非线性激活 使用到的pytorch网站: Padding Layers(对输入图像进行填充的各种方式) 几乎用不到,nn.ZeroPad2d(在输入tensor数据类型周围用0填充) nn.ConstantPad2d(用常数填充) 在 …

【图像】灰度图与RGB图像的窗宽、窗位的值范围二三问

1. 16位灰度图的窗宽、窗位的值范围? 对于16位的灰度图像,每个像素点可以表示从0到2^16-1(即0至65535)之间的强度值。在医学影像领域,如CT扫描图像中,窗宽和窗位是用来调整图像对比度和亮度的参数&#xf…

【Spring Boot 3】【Web】自定义过滤器

【Spring Boot 3】【Web】自定义过滤器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…

fabricjs 添加图片并实时更新小车位置

需求:添加小车图片到画布中, 后端通过ws实时更新小车位置 实际过程中遇到的问题: 设置中心点:我想把图片的中心设置为后端传来的坐标点,可以通过设置对象的originX和originY属性来改变对象的旋转和定位基点。让小车…

error:0308010C:digital envelope routines::unsupported【超详细图解】

目录 一、报错信息 二、分析原因 三、解决方案 一、报错信息 二、分析原因 node.js 18 不兼容oppsll,node.js v17以上版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制 三、解决方案 方案1:打开终端,直接输入…

Zotero7最新(2024)安装、配置步骤

提醒: 绝大部分插件都已经适配了 Zotero 7,但是 ZotFile 插件已经停止对 Zotero 7 的支持,可以使用 Attanger 插件 替代。如果不适应还是建议装Zotero 6 一、安装 1、进入官网,点击下载进入下载界面 https://www.zotero.org/h…

OpenCV绘图函数(7)从一个椭圆定义中提取出多边形的顶点坐标函数ellipse2Poly()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 近似一个椭圆弧为一个多边形线。 函数 ellipse2Poly 计算近似指定椭圆弧的多边形线的顶点。它被 ellipse 函数所使用。如果 arcStart 大于 arcEn…

[羊城杯 2024] Crypto

文章目录 TH_Curvebaby_CurveRSA_lossTheoremPlus TH_Curve 题目描述: from Crypto.Util.number import * from secret import flagdef add_THcurve(P, Q):if P (0, 0):return Qif Q (0, 0):return Px1, y1 Px2, y2 Qx3 (x1 - y1 ** 2 * x2 * y2) * pow(a * …

使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能

Using statistical methods to reliably compare algorithm performance in large generative AI models with JAX Profiler on AMD GPUs — ROCm Blogs 摘要 本文提供了一份详细的指南,介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAX Profiler…

Python编码系列—Docker容器的高效使用与实战应用

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第八篇:Tab标签页的实现

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【Selenium】UI自动化实践——输入验证码登录

文章目录 实战题目解题方案 实战题目 使用pythonselenium实现输入验证码的UI自动化。登录页面如图: 解题方案 验证码登录需要导入相关模块和库,本文使用的是opencv和ddddocr模块组合,导入方式采用pip3 install opencv-python、pip3 insta…

JMeter 工具安装以及简单使用

一、安装以及汉化 傻瓜式JMeter下载和环境配置及永久汉化-CSDN博客https://blog.csdn.net/weixin_45608163/article/details/136528719 二、发送GET请求 配置请求头: 配置该线程组的请求: 放在线程组统计,下面请求则共享配置

深度强化学习算法(三)(附带MATLAB程序)

深度强化学习(Deep Reinforcement Learning, DRL)结合了深度学习和强化学习的优点,能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数,从而提高学习能力和决策效率…

光性能 -- 光功率平坦度

什么是光功率平坦度? 光功率平坦度指的是,光放各单波功率值与所有波平均值的功率差。 通过MCA(多通道光谱分析单元)扫描OMS(光复用段)上的所有单波光功率,计算经过光放的所有波长的功率平均值&#xff0…

OHIF viewers

OHIF Viewer 是一个开源的 DICOM(数字成像和通信医学)图像查看器,旨在为医疗影像学提供一个灵活且功能强大的解决方案。以下是 OHIF Viewer 的详细介绍,包括发展史、特点、优势、应用及目的等方面的信息。 1. 介绍 OHIF Viewer 是…

一个初始化的服务器,需要配置的相关软件以及环境(cuda、torch、conda)

文章目录 一个刚初始化的服务器需要下载的应用google chromeghelp 解压安装包解压大型zip文件 更新nvidia的驱动pycharm设置conda相关下载condaconda换源 torch相关安装torch包,浏览器下载包安装pytorch常用包安装 导包的方法 一个刚初始化的服务器需要下载的应用 …