0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是PRelu算子?PRelu算子調優(yōu)經歷-先行篇

恩智浦MCU加油站 ? 來源:NXP ? 作者:NXP ? 2023-08-24 08:50 ? 次閱讀

最近小編收到一個客戶模型,其中使用了一個叫做PRelu的算子,想要運行在RT170上。本來小編是信心滿滿的答應客戶說:速度上放心,我們這主頻1GHz的CPU絕對沒問題,包您滿意。沒想到跑分結果出爐直接給了小編沉重一擊。

直接依賴TFLm推理引擎的默認實現(xiàn),PRelu算子的運行時間竟然高達188ms。于是小編本著工程師本有的探索精神,決定迎難而上,徹底將它優(yōu)化一下。

所謂知己知彼,百戰(zhàn)不殆,首先我們來看一下什么叫做PRelu算子。

PRelu,看著好像特別的高大上,我們將其拆分來看,將其分成P+Relu,是不是瞬間就覺得熟悉了。沒錯,他實際上就是我們常用的Relu算子的變種。其中,P,是Parametric的縮寫,因此,所謂PRelu就是帶參數(shù)的Relu,只不過,這里的參數(shù)實際上是可以被訓練的,而非一個固定值。那么PRelu到底長什么樣呢?小編馬上揭開它的神秘面紗:

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

上圖就是PRelu的廬山真面目。i 表示不同的通道。alpha的個數(shù)是跟著通道走的,不過好消息是,各個通道之間參數(shù)是可以共享的,這樣看著清爽了不少。特殊的,如果我們配置H和W通道共享參數(shù),那么參數(shù)alpha就變成了類似于bias的功能,逐通道共享一個參數(shù),因此,其shape = (1, 1, c);

為了對客戶負責,外加能夠更加方便地進行模型測試,小編首先收利用Keras手動構建一個具有PRelu算子的小巧模型。正所謂小巧而又不失優(yōu)雅,我們構建模型如下所示:

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

這個小巧的模型本身具備了我們所常見的多個算子,例如Conv2D,MaxPool2D,F(xiàn)ullyConnect等,因此作為PRelu算子的測試模型也不至于顯得過于寒酸。

接下來和大家聊聊小編的調試經歷:

第一步,就是要對TFLm的源碼進行分析,了解為何其運行緩慢。

PRelu算子實際上就是一個進階版本的Relu算子,根據(jù)其輸入值的正負分別進行計算,當輸入為正是,就等于本身;當輸入為負時,將結果乘以一個系數(shù)alpha。看似非常簡單的計算方式,為啥TFLm的參考實現(xiàn)能算的這么慢呢?口說無憑,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); }

看到這里,恰似風平浪靜,的確是按照我們分析的那樣,按照輸入值的正負進行計算。但是...細心的讀友可能發(fā)現(xiàn)了問題:

1) 這里的alpha_data有個index,沒錯,這就是運行慢的第一個原因。剛才說過,PRelu中的alpha參數(shù)是和通道數(shù)相關的,也就是說每個通道都可以擁有自己的值,而且各通道之間還可以共享,因此并不能直接順序訪問,而是需要根據(jù)index進行查找。

2) 這里多了一個叫做MultiplyByQuantizedMultiplier的函數(shù),為啥不直接計算?這是另一個原因。熟悉深度學習的伙伴們一定知道,MCU平臺常被稱作:資源受限平臺,這里的受限不僅體現(xiàn)在算力上,還有內存空間上,相較于MPU那種動輒幾個G的DDR的龐然大物,MCU上的內存資源也是捉襟見肘。

想要將我們訓練的模型部署運行在MCU上,第一步就是對模型進行量化操作,將浮點類型的模型轉換為int8類型的模型,這樣直接縮小到之前的1/4。同時由于量化后的模型采用int8表示,同時能夠借助于優(yōu)化后的運行庫進行加速。

這樣一來,為了既想要使用int8模型帶來的遍歷,又保證模型精度,就需要對輸出結果進行反量化表示,已達到使用int8類型結果表達浮點數(shù)的效果。因此,就需要調用類似MultiplyByQuantizedMultiplier這樣的函數(shù)進行反量化處理。

基于以上兩點,我們也就發(fā)現(xiàn)了算法本身所存在的慢速隱患,接下來的優(yōu)化操作也正是基于此展開。

下一篇會繼續(xù)介紹通過內存外加反量化函數(shù)的改造提升算法執(zhí)行速度。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16802

    瀏覽量

    349361
  • NXP
    NXP
    +關注

    關注

    60

    文章

    1255

    瀏覽量

    182493
  • 恩智浦
    +關注

    關注

    14

    文章

    5806

    瀏覽量

    105956
  • 內存
    +關注

    關注

    8

    文章

    2947

    瀏覽量

    73730
  • 算子
    +關注

    關注

    0

    文章

    16

    瀏覽量

    7249

原文標題:PRelu算子調優(yōu)經歷-先行篇

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    PRelu算子調優(yōu)經歷-函數(shù)優(yōu)化策略

    上一小編和大家分享了在運行客戶的一個模型時遇到了一個PRelu算子,在利用TFLm自帶的PRelu參考實現(xiàn)的代碼,其中PRelu竟然拋出了
    的頭像 發(fā)表于 08-24 08:50 ?835次閱讀
    <b class='flag-5'>PRelu</b><b class='flag-5'>算子</b><b class='flag-5'>調</b><b class='flag-5'>優(yōu)</b><b class='flag-5'>經歷</b>-函數(shù)優(yōu)化策略

    Labview 調用Halcon 算子gen_rectangle1異常?

    1.將halcon 算子封裝成VI其他算子都無異常,gen_rectangle1算子總是偶爾會出現(xiàn)異常,執(zhí)行后無錯誤,然后生成的Region 是空的,不知道怎么回事程序自動運行的時候,嘗試
    發(fā)表于 09-17 15:26

    基于GFO算子的圖像增強算法如何去實現(xiàn)?

    基于GFO算子(廣義模糊算子)的圖像增強算法如何去實現(xiàn)?怎樣對圖像增強算法進行分析?
    發(fā)表于 06-04 06:24

    邊緣檢測的幾種微分算子

    一、邊緣檢測邊緣檢測的幾種微分算子:一階微分算子:Roberts、Sobel、Prewitt二階微分算子:Laplacian、Log/Marr非微分算子:Canny一階微分
    發(fā)表于 07-26 08:29

    卷積解算子族的乘積擾動

    卷積解算子族的乘積擾動:
    發(fā)表于 10-26 13:46 ?5次下載

    LOG算子在FPGA中的實現(xiàn)

    介紹了一種高斯拉普拉斯LOG算子在FPGA中的實現(xiàn)方案!并通過對一幅BMP圖像的處理!論證了在FPGA中實現(xiàn)的LOG算子的圖像增強效果
    發(fā)表于 05-16 17:12 ?50次下載
    LOG<b class='flag-5'>算子</b>在FPGA中的實現(xiàn)

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

    已有的一些直覺模糊集成算子在處理一些特殊直覺模糊數(shù)時會出現(xiàn)反直覺現(xiàn)象。首先介紹了兩個直覺模糊集成算子和直覺模糊數(shù)的比較方法。接著,舉例說明了這些集成算子在某些情況下出現(xiàn)的反直覺現(xiàn)象。然后提出了基于£
    發(fā)表于 11-17 14:36 ?9次下載

    canny算子的語法原理分析

    Canny算子Canny邊緣檢測算子是JohnF.Canny于1986年開發(fā)出來的一個多級邊緣檢測算法。更為重要的是 Canny 創(chuàng)立了邊緣檢測計算理論解釋這項技術如何工作。Canny 算法包含許多可以調整的參數(shù),它們將影響到算法的計算的時間與實效。
    發(fā)表于 12-18 17:55 ?8822次閱讀
    canny<b class='flag-5'>算子</b>的語法原理分析

    HALCON機器視覺算子的詳細資料理解

    所有算子是做什么的,用途,什么時候會用,為什么要用,怎么用一般halcon的語法是:前面是該算子的目的(作用),后續(xù)的是條件或來源等。
    發(fā)表于 10-09 08:00 ?20次下載

    Laplacian算子的FPGA實現(xiàn)方法

    拉普拉斯算子是一種重要的圖像增強算子,它是一種各向同性濾波器,即濾波器的響應與濾波器作用圖像的突變方向無關,而且實現(xiàn)簡單,被廣泛用于圖像銳化和高頻增強等算法中。在此,提出一種使用QuartusⅡ開發(fā)環(huán)境的Megafunctions功能模塊實現(xiàn)拉普拉斯
    的頭像 發(fā)表于 06-16 17:47 ?3181次閱讀
    Laplacian<b class='flag-5'>算子</b>的FPGA實現(xiàn)方法

    Sobel算子原理介紹與實現(xiàn)方法

    索貝爾算子(Sobel operator)主要用作邊緣檢測,在技術上,它是一離散性差分算子,用來運算圖像亮度函數(shù)的灰度之近似值。在圖像的任何一點使用此算子,將會產生對應的灰度矢量或是其法矢量Sobel 卷積因子為:
    的頭像 發(fā)表于 07-21 17:27 ?1.3w次閱讀

    自定義算子開發(fā)

    一個完整的自定義算子應用過程包括注冊算子、算子實現(xiàn)、含自定義算子模型轉換和運行含自定義op模型四個階段。在大多數(shù)情況下,您的模型應該可以通過使用hb_mapper工具完成轉換并順利部署
    的頭像 發(fā)表于 04-07 16:11 ?2637次閱讀
    自定義<b class='flag-5'>算子</b>開發(fā)

    機器學習算法的5種基本算子

    機器學習算法的5種基本算子 機器學習是一種重要的人工智能技術,它是為了讓計算機能夠通過數(shù)據(jù)自主的學習和提升能力而發(fā)明的。機器學習算法是機器學習的核心,它是指讓計算機從數(shù)據(jù)中進行自主學習并且可以實現(xiàn)
    的頭像 發(fā)表于 08-17 16:11 ?1668次閱讀

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

    如何給TPU-MLIR添加新的算子
    的頭像 發(fā)表于 08-18 11:29 ?625次閱讀
    如何給TPU-MLIR添加新的<b class='flag-5'>算子</b>

    圖像銳化的Sobel、Laplacian算子基礎知識介紹

    Sobel 算子是一種用于邊緣檢測的離散微分算子,它結合了高斯平滑和微分求導
    的頭像 發(fā)表于 09-13 09:52 ?1193次閱讀
    圖像銳化的Sobel、Laplacian<b class='flag-5'>算子</b>基礎知識介紹