注:作者使用的平台是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模型并没有经过上图中第三部分,即编译部分(Compiler) ,在该部分中,还会有算子的融合等操作,而连板推理时RKNN模型经过了上图中的第三部分,模型再次经过算子的融合,有些层自然就被去掉了。这也就是为什么runtime_error中部分量化层不存在的原因。