RKNPU2从入门到实践 --- 【6】模型评估----量化精度分析

注:作者使用的平台是Ubuntu20.04虚拟系统,开发板是瑞芯微RK3588开发板,开发板上搭载的系统为Ubuntu22.04系统。 

一、任务说明

1. 模拟器下调用 accuracy_analysis 接口进行量化精度分析
2. 连板推理下调用 accuracy_analysis 接口进行量化精度分析

二、量化精度分析介绍

 量化精度分析使用流程图


该接口的功能是进行浮点、量化推理并产生每层的数据,用于量化精度分析。

2.1 模拟器上(rknntoolkit2上)实际演示

 打开Ubuntu虚拟系统,打开pycharm,在工程中创建一个名为accuracy_analysis_learning的文件夹,在该文件夹中创建一个名为 accuracy_analysis的python文件。如下图所示。

 
将需要到的资料拷贝到该文件夹下,如下所示:



接下来我们按照量化精度分析接口使用流程图一步一步编写代码:
前四步和最后一步的代码在之前的博文中已经学习过了,在这里贴出这五步的代码:

from rknn.api import RKNN

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

    # 第二步:配置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]])

    # 第四步:调用build接口构建RKNN模型
    rknn.build(
        do_quantization=True, # 表示开启rknn模型量化
        dataset='dataset.txt', # 量化所用到的数据集
    )

    # 导出rknn模型
    rknn.export_rknn(export_path='./resnet.rknn')

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

第五步的实际代码如下: 

结合之后的整体代码如下图所示:

from rknn.api import RKNN

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

    # 第二步:配置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]])

    # 第四步:调用build接口构建RKNN模型
    rknn.build(
        do_quantization=True, # 表示开启rknn模型量化
        dataset='dataset.txt', # 量化所用到的数据集
    )

    # 导出rknn模型
    rknn.export_rknn(export_path='./resnet.rknn')

    # 第五步:使用accuracy_analysis 接口进行模型量化精度分析
    rknn.accuracy_analysis(
        inputs=['./space_shuttle_224.jpg'], # 表示进行推理的图像
        output_dir='snapshot', # 表示精度分析的输出目录
        target=None, # 默认为None,表示运行在模拟器上
        device_id=None, # 设备的编号
    )
    # 最后一步:释放RKNN对象
    rknn.release()

接下来我们就可以运行代码了。
执行上述程序,得到:

终端打印信息(部分)如下所示:

将终端打印信息存放之记事本中,如下:

      上图中可以看到,有 layer_name 和 quant_error 两类,layer_name表示每一层的名称,quant_error表示计算的量化误差【模拟器上推理与32位浮点模型推理之间的量化误差】。quant_error又分为两列,per_layer 表示模拟器推理时与32位浮点模型推理时每一层的余弦距离。而entire表示叠加每一层的精度损失值。
      至此,模拟器上量化精度分析就到此结束了。
      接下来我们会介绍连板推理下的精度分析,请看2.2节。

2.2 连板推理下实际演示

 连板推理下的精度分析代码只需要将:

修改为:

在运行程序之前,需要启动开发板。
      使用MobaXterm软件与开发板进行串口连接,在开发板上运行rknn_server服务,若在此有运行失败的,可参考博文:更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】-CSDN博客

 下图表示rknn_server运行成功示意图:

      还要保证开发板的adb要连接到虚拟机的Ubuntu系统上。 连接成功之后虚拟机Ubuntu系统任务栏处会出现一个手机的图标。
然后重新运行python程序即可: 

运行结束后得到:
这部分有bug,后续更新!!

上图来源于:06_RKNN 模型评估-量化精度分析_哔哩哔哩_bilibili
      和模拟器上推理相比,多出了runtime_error 这一大列,runtime_error表示计算的运行时误差。runtime_error又被分为了两列,分别为simu_error和golden_error,其中simu_error表示RKNPU实际推理时与模拟器推理时每一层输入的余弦距离。golden_error表示RKNPU实际推理时与32位浮点模型推理时每一层输入的余弦距离。
观察上图,我们可以发现:

在runtime_error中,缺少了部分层的量化分析。
分析原因,如下:

RKNN模型构建流程图

      模拟器上推理RKNN模型并没有经过上图中第三部分,即编译部分(Compiler) ,在该部分中,还会有算子的融合等操作,而连板推理时RKNN模型经过了上图中的第三部分,模型再次经过算子的融合,有些层自然就被去掉了。这也就是为什么runtime_error中部分量化层不存在的原因。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值