模型在rv1126上跑起来遇到的坑

2024-05-25 23:58
文章标签 模型 遇到 起来 rv1126

本文主要是介绍模型在rv1126上跑起来遇到的坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

rknn对模型是彩色图片输入的很友好,如果输入是灰度图片,需要好好理解它的整套数据处理流程。
在这里插入图片描述
上面是数据处理的整个流程,cpu拿到的图片数据,需要经过一系列的预处理(颜色通道转换,归一化,量化,通道转换)这一过程是在rknn_inputs_set里面完成。
我的模型信息:
在这里插入图片描述
模型输入1个,单通道,数据类型是uint8, 量化类型为asymmetric affine非对称量化,即float32和uint8之间的转换。fl zp scale都是量化的参数。
在这里插入图片描述
模型输出2个,一个数据类型为float16 没有量化
第二个类型为uint8, 量化类型为asymmetric affine.

rknn_inputs_set耗时严重

我碰到的问题就是rknn_inputs_set非常的耗时!大概33ms左右!我是单通道图片,1400640,fmt是NCHW,也就是需要进行中间两步即可。先归一化成float32,再量化为uint8,然后把数据从cpu拷贝到npu,不知道为啥耗时这么长。最后问了rk的工作人员,说是对彩色图片内部做了优化,而灰度图片没有。
所以只能自己做优化。
rk的文档提供了两种方式:
1.是rknn_inputs_set里设置pass_through=1,相当于数据不再需要rknn_inputs_set做预处理,我自己处理好。我理解的这种应该是只节省了预处理的时间,拷贝的时间是仍然需要的。我之前自己实现了归一化和量化步骤(官网也有demo),耗时在10ms左右。后来我仔细阅读文档,发现如果三通道均值和方差相同,则输入 uint8 数据等于归一化后量化的 uint8 数据。
在这里插入图片描述
所以我的归一化和量化是可以省略的,也就是中间两步也省了,图片原始数据直接透传给NPU。这时rknn_inputs_set变成了1ms左右!我理解的拷贝耗时呢???
2.第二种是零拷贝,即把拷贝也省了。官方给了很详细的demo。原理大概是在内核核申请一片内存,数据放到这片内存上,npu直接去拿。不需要从cpu拷贝到npu。

rknn_outputs_set耗时

我已经设置了output_optimize=1,耗时在14ms左右,耗时主要是因为第二个输出,需要从uint8变为float32。
为了解决这个问题,我决定自己在外面做反量化。
反量化比量化简单很多,就是((float)qnt - (float)zp) * scale 我的模型第二个输出zp = 136 scale = 4.625256.

验证结果:
按照uint8_t直接把结果拿出来:

outputs[1].want_float = 0;
uint8_t* pdes = (uint8_t*)outputs[1].buf;
cv::Mat des_mat(400/8 * 256, 640/8, CV_8UC1, pdes);
std::cout << "des " << des_mat << std::endl;

输出结果:
在这里插入图片描述
耗时变成8ms。
按照float把结果拿出来:

outputs[1].want_float = 1;
float* pdes = (float*)outputs[1].buf;
cv::Mat des_mat(400/8 * 256, 640/8, CV_32FC1, pdes);
std::cout << "des " << des_mat << std::endl;

输出结果:
在这里插入图片描述
耗时19ms。
拿第一个做反量化运算:(124-136)* 4.625256 = −55.503072 恰好等于float拿出来的结果。所以这种方式是ok。

注意opencv恰好有数据类型转换的函数convertTo

/** @brief Converts an array to another data type with optional scaling.The method converts source pixel values to the target data type. saturate_cast\<\> is applied atthe end to avoid possible overflows:\f[m(x,y) = saturate \_ cast<rType>( \alpha (*this)(x,y) +  \beta )\f]@param m output matrix; if it does not have a proper size or type before the operation, it isreallocated.@param rtype desired output matrix type or, rather, the depth since the number of channels are thesame as the input has; if rtype is negative, the output matrix will have the same type as the input.@param alpha optional scale factor.@param beta optional delta added to the scaled values.*/void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

只需要转换一下参数即可。代码如下:

    uint8_t* pdes = (uint8_t*)outputs[1].buf;cv::Mat des_mat(400/8 * 256, 640/8, CV_8UC1, pdes);cv::Mat des;des.convertTo(des, CV_32FC1, 4.625256, -136*4.625256);

其实第一个输出也可以做类似的工作,模型的输出是float16, 我们可以自己在外面转为float32,(32 位浮点 和16 位浮点数相互转换 请参考 IEEE-754标准)。我看了一下,第一个也outputs[1].want_float = 0;模型输出耗时为4ms,测试convertTo的耗时为3.6855。加上第一个输出convertTo的耗时,和rk内部转换耗时8ms差不多,可以不采用自己转换。而计算描述子是放在后端5hz的,我们可以把第二个输出的convertTo到后端,不计入整个提点耗时里面。
故第一个输出采用want_float = 1,由rk内部转换;第二个采用want_float = 0,自己转换;

输出结果和在电脑的输出差异很大

应该是量化带来的误差。
1.首先确保 float 类型的精度和原始平台测试结果相近,rknn.build(do_quantization=False)
结果如下:
在电脑跑出来的结果
在这里插入图片描述
没有量化的结果
在这里插入图片描述
可见结果还是比较相近,误差在百分位上面。
2.测试量化后的精度
在这里插入图片描述
明显已经误差很大了,我用的图片数量10张,文档建议给出大于200张图片。
结果还是还上面一样
在这里插入图片描述
结果还是和上面一样,说明不是图片量太少的问题,需要分析每一层的量化精度。
rknn.accuracy_analysis(inputs='./image/dataset1.txt', target='rv1126')分析。
首先找到每一层对应的npu表示术语。

x = self.relu(self.conv1a(data))convolution_at_input0.1_1_1_out0_nhwc_1_400_640_64.tensor relu_at_89_2_2_out0_nhwc_1_400_640_64.tensor
x = self.relu(self.conv1b(x))convolution_at_input.3_3_3_out0_nhwc_1_400_640_64.tensor relu_at_101_4_4_out0_nhwc_1_400_640_64.tensor
x = self.pool(x)max_pooling_at_input.4_5_5_out0_nhwc_1_200_320_64.tensor
x = self.relu(self.conv2a(x))convolution_at_input.5_6_6_out0_nhwc_1_200_320_64.tensor relu_at_122_7_7_out0_nhwc_1_200_320_64.tensor
x = self.relu(self.conv2b(x))convolution_at_input.6_8_8_out0_nhwc_1_200_320_64.tensor relu_at_134_9_9_out0_nhwc_1_200_320_64.tensor
x = self.pool(x)max_pooling_at_input.7_10_10_out0_nhwc_1_100_160_64.tensor
x =self.relu(self.conv3a(x))convolution_at_input.8_11_11_out0_nhwc_1_100_160_128.tensor relu_at_155_12_12_out0_nhwc_1_100_160_128.tensor
x = self.relu(self.conv3b(x))convolution_at_input.9_13_13_out0_nhwc_1_100_160_128.tensor relu_at_167_14_14_out0_nhwc_1_100_160_128.tensor
x = self.pool(x)max_pooling_at_input.10_15_15_out0_nhwc_1_50_80_128.tensor
x = self.relu(self.conv4a(x))convolution_at_input.11_16_16_out0_nhwc_1_50_80_128.tensor relu_at_188_17_17_out0_nhwc_1_50_80_128.tensor
x = self.relu(self.conv4b(x))convolution_at_input.12_18_18_out0_nhwc_1_50_80_128.tensor relu_at_200_19_19_out0_nhwc_1_50_80_128.tensor

之后就是分开部分了,由于我们只关心描述子,就只看描述子部分的。

cDa = self.relu(self.convDa(x))convolution_at_input.1_40_34_out0_nhwc_1_50_80_256.tensor relu_at_235_41_35_out0_nhwc_1_50_80_256.tensor
descriptors = self.convDb(cDa)convolution_at_246_43_37_out0_nhwc_1_50_80_256.tensor

这篇关于模型在rv1126上跑起来遇到的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002979

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者