0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是PRelu算子?PRelu算子调优经历-先行篇

恩智浦MCU加油站 来源:NXP 作者:NXP 2023-08-24 08:50 次阅读

最近小编收到一个客户模型,其中使用了一个叫做PRelu的算子,想要运行在RT170上。本来小编是信心满满的答应客户说:速度上放心,我们这主频1GHz的CPU绝对没问题,包您满意。没想到跑分结果出炉直接给了小编沉重一击。

直接依赖TFLm推理引擎的默认实现,PRelu算子的运行时间竟然高达188ms。于是小编本着工程师本有的探索精神,决定迎难而上,彻底将它优化一下。

所谓知己知彼,百战不殆,首先我们来看一下什么叫做PRelu算子。

PRelu,看着好像特别的高大上,我们将其拆分来看,将其分成P+Relu,是不是瞬间就觉得熟悉了。没错,他实际上就是我们常用的Relu算子的变种。其中,P,是Parametric的缩写,因此,所谓PRelu就是带参数的Relu,只不过,这里的参数实际上是可以被训练的,而非一个固定值。那么PRelu到底长什么样呢?小编马上揭开它的神秘面纱:

88969390-4217-11ee-a2ef-92fbcf53809c.png

上图就是PRelu的庐山真面目。i 表示不同的通道。alpha的个数是跟着通道走的,不过好消息是,各个通道之间参数是可以共享的,这样看着清爽了不少。特殊的,如果我们配置H和W通道共享参数,那么参数alpha就变成了类似于bias的功能,逐通道共享一个参数,因此,其shape = (1, 1, c);

为了对客户负责,外加能够更加方便地进行模型测试,小编首先收利用Keras手动构建一个具有PRelu算子的小巧模型。正所谓小巧而又不失优雅,我们构建模型如下所示:

88bfb4d2-4217-11ee-a2ef-92fbcf53809c.png

这个小巧的模型本身具备了我们所常见的多个算子,例如Conv2D,MaxPool2D,FullyConnect等,因此作为PRelu算子的测试模型也不至于显得过于寒酸。

接下来和大家聊聊小编的调试经历:

第一步,就是要对TFLm的源码进行分析,了解为何其运行缓慢。

PRelu算子实际上就是一个进阶版本的Relu算子,根据其输入值的正负分别进行计算,当输入为正是,就等于本身;当输入为负时,将结果乘以一个系数alpha。看似非常简单的计算方式,为啥TFLm的参考实现能算的这么慢呢?口说无凭,show me the code:

if (input_value >= 0) { output_value = MultiplyByQuantizedMultiplier( input_value, params.output_multiplier_1, params.output_shift_1); } else { auto alpha_index = SubscriptToIndex(desc2, b, y, x, c); const int32_t alpha_value = params.alpha_offset + alpha_data[alpha_index]; output_value = MultiplyByQuantizedMultiplier( input_value * alpha_value, params.output_multiplier_2, params.output_shift_2); }

看到这里,恰似风平浪静,的确是按照我们分析的那样,按照输入值的正负进行计算。但是...细心的读友可能发现了问题:

1) 这里的alpha_data有个index,没错,这就是运行慢的第一个原因。刚才说过,PRelu中的alpha参数是和通道数相关的,也就是说每个通道都可以拥有自己的值,而且各通道之间还可以共享,因此并不能直接顺序访问,而是需要根据index进行查找。

2) 这里多了一个叫做MultiplyByQuantizedMultiplier的函数,为啥不直接计算?这是另一个原因。熟悉深度学习的伙伴们一定知道,MCU平台常被称作:资源受限平台,这里的受限不仅体现在算力上,还有内存空间上,相较于MPU那种动辄几个G的DDR的庞然大物,MCU上的内存资源也是捉襟见肘。

想要将我们训练的模型部署运行在MCU上,第一步就是对模型进行量化操作,将浮点类型的模型转换为int8类型的模型,这样直接缩小到之前的1/4。同时由于量化后的模型采用int8表示,同时能够借助于优化后的运行库进行加速。

这样一来,为了既想要使用int8模型带来的遍历,又保证模型精度,就需要对输出结果进行反量化表示,已达到使用int8类型结果表达浮点数的效果。因此,就需要调用类似MultiplyByQuantizedMultiplier这样的函数进行反量化处理。

基于以上两点,我们也就发现了算法本身所存在的慢速隐患,接下来的优化操作也正是基于此展开。

下一篇会继续介绍通过内存外加反量化函数的改造提升算法执行速度。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16024

    浏览量

    343712
  • NXP
    NXP
    +关注

    关注

    60

    文章

    1215

    浏览量

    177342
  • 恩智浦
    +关注

    关注

    14

    文章

    5716

    浏览量

    100784
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72779
  • 算子
    +关注

    关注

    0

    文章

    15

    浏览量

    7239

原文标题:PRelu算子调优经历-先行篇

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PRelu算子调优经历-函数优化策略

    上一篇小编和大家分享了在运行客户的一个模型时遇到了一个PRelu算子,在利用TFLm自带的PRelu参考实现的代码,其中PRelu竟然抛出了188ms的天文数字...因此小编开始准备
    的头像 发表于 08-24 08:50 578次阅读
    <b class='flag-5'>PRelu</b><b class='flag-5'>算子</b>调优<b class='flag-5'>经历</b>-函数优化策略

    Labview 调用Halcon 算子gen_rectangle1异常?

    1.将halcon 算子封装成VI其他算子都无异常,gen_rectangle1算子总是偶尔会出现异常,执行后无错误,然后生成的Region 是空的,不知道怎么回事程序自动运行的时候,尝试
    发表于 09-17 15:26

    基于GFO算子的图像增强算法如何去实现?

    基于GFO算子(广义模糊算子)的图像增强算法如何去实现?怎样对图像增强算法进行分析?
    发表于 06-04 06:24

    边缘检测的几种微分算子

    一、边缘检测边缘检测的几种微分算子:一阶微分算子:Roberts、Sobel、Prewitt二阶微分算子:Laplacian、Log/Marr非微分算子:Canny一阶微分
    发表于 07-26 08:29

    如何使用BMLang开发自定义的算子

    如何使用BMLang开发自定义的算子
    发表于 09-18 06:57

    卷积解算子族的乘积扰动

    卷积解算子族的乘积扰动:
    发表于 10-26 13:46 5次下载

    LOG算子在FPGA中的实现

    介绍了一种高斯拉普拉斯LOG算子在FPGA中的实现方案!并通过对一幅BMP图像的处理!论证了在FPGA中实现的LOG算子的图像增强效果
    发表于 05-16 17:12 50次下载
    LOG<b class='flag-5'>算子</b>在FPGA中的实现

    基于SUSAN算子的LEACHC路由算法唐启涛

    基于SUSAN算子的LEACH_C路由算法_唐启涛
    发表于 03-17 08:00 1次下载

    基于修正的直觉模糊集成算子

    已有的一些直觉模糊集成算子在处理一些特殊直觉模糊数时会出现反直觉现象。首先介绍了两个直觉模糊集成算子和直觉模糊数的比较方法。接着,举例说明了这些集成算子在某些情况下出现的反直觉现象。然后提出
    发表于 11-17 14:36 9次下载

    Laplacian算子的FPGA实现方法

    拉普拉斯算子是一种重要的图像增强算子,它是一种各向同性滤波器,即滤波器的响应与滤波器作用图像的突变方向无关,而且实现简单,被广泛用于图像锐化和高频增强等算法中。在此,提出一种使用QuartusⅡ开发环境的Megafunctions功能模块实现拉普拉斯
    的头像 发表于 06-16 17:47 2993次阅读
    Laplacian<b class='flag-5'>算子</b>的FPGA实现方法

    浅述Sobel算子在HLS上的实现教程

    Sobel 原理介绍 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度
    的头像 发表于 07-23 14:53 1930次阅读
    浅述Sobel<b class='flag-5'>算子</b>在HLS上的实现教程

    Sobel算子原理介绍与实现方法

    索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量Sobel 卷积因子为:
    的头像 发表于 07-21 17:27 9387次阅读

    自定义算子开发

    一个完整的自定义算子应用过程包括注册算子算子实现、含自定义算子模型转换和运行含自定义op模型四个阶段。在大多数情况下,您的模型应该可以通过使用hb_mapper工具完成转换并顺利部署
    的头像 发表于 04-07 16:11 1914次阅读
    自定义<b class='flag-5'>算子</b>开发

    机器学习算法的5种基本算子

    机器学习算法的5种基本算子 机器学习是一种重要的人工智能技术,它是为了让计算机能够通过数据自主的学习和提升能力而发明的。机器学习算法是机器学习的核心,它是指让计算机从数据中进行自主学习并且可以实现
    的头像 发表于 08-17 16:11 1343次阅读

    如何给TPU-MLIR添加新的算子

    如何给TPU-MLIR添加新的算子
    的头像 发表于 08-18 11:29 357次阅读
    如何给TPU-MLIR添加新的<b class='flag-5'>算子</b>