国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法在嵌入式端的部署與優(yōu)化

這篇具有很好參考價(jià)值的文章主要介紹了算法在嵌入式端的部署與優(yōu)化。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

我創(chuàng)作這篇博客的目的是記錄學(xué)習(xí)技術(shù)過程中的筆記。希望通過分享自己的學(xué)習(xí)經(jīng)歷,能夠幫助到那些對相關(guān)領(lǐng)域感興趣或者正在學(xué)習(xí)的人們。

理論

1.參考資源

1.神經(jīng)網(wǎng)絡(luò)的壓縮算法:6種神經(jīng)網(wǎng)絡(luò)的壓縮方法

2.深度學(xué)習(xí)推理架構(gòu):主流的深度學(xué)習(xí)推理架構(gòu)、AI模型部署落地綜述(ONNX/NCNN/TensorRT)

3.TensorFlow 模型優(yōu)化:TensorFlow 模型優(yōu)化工具包

2.其他

1.將深度學(xué)習(xí)模型移植到嵌入式端時(shí),提高推理速度的方法
  1. 硬件加速:使用專用芯片(例如GPU、NPU等)或FPGA進(jìn)行硬件加速可以大幅提升推理速度。
  2. 模型壓縮:對于已經(jīng)訓(xùn)練好的模型,可以通過減少參數(shù)量、降低精度等方式來達(dá)到壓縮的效果。常見的方法包括剪枝、量化和蒸餾等。
  3. 網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化:優(yōu)化網(wǎng)絡(luò)結(jié)構(gòu)也是一種有效地提高推理速度的方式。比如改變網(wǎng)絡(luò)層數(shù)、調(diào)整通道數(shù)目和內(nèi)存消耗等。
  4. 編譯器優(yōu)化:針對不同平臺(tái)開發(fā)相應(yīng)編譯器,并且在編譯過程中嘗試各種技巧以最大限度地利用處理器功能單元和內(nèi)存帶寬,進(jìn)行代碼自動(dòng)向量化。
2.深度學(xué)習(xí)模型移植到嵌入式端的主要流程
  1. 對原始模型進(jìn)行剪枝/壓縮/轉(zhuǎn)換等操作以適配嵌入式設(shè)備。
  2. 針對特定平臺(tái)編寫底層驅(qū)動(dòng)程序。
  3. 針對特定平臺(tái)編寫適配深度學(xué)習(xí)模型的推理引擎。
  4. 進(jìn)行端到端的測試和優(yōu)化,不斷調(diào)整以實(shí)現(xiàn)最佳性能。
3.假設(shè)將已經(jīng)訓(xùn)練好的目標(biāo)檢測模型(比如YOLOv3)移植到樹莓派4B這樣一款嵌入式設(shè)備上,并且需要保證推理速度達(dá)到實(shí)時(shí)。具體流程如下
  1. 模型壓縮:為了適應(yīng)樹莓派4B較低的算力和存儲(chǔ)容量,可以使用剪枝、量化等技術(shù)對原始模型進(jìn)行壓縮處理。
  2. 硬件加速:由于樹莓派4B內(nèi)置GPU并不強(qiáng)大,因此可以考慮使用外部NPU芯片來提高推理速度。
  3. 軟硬件協(xié)同優(yōu)化:針對特定平臺(tái)編寫底層驅(qū)動(dòng)程序和適配深度學(xué)習(xí)模型的推理引擎。在軟硬件協(xié)同優(yōu)化方面,可以借助TensorFlow Lite或ONNX Runtime等工具進(jìn)行開發(fā)。
  4. 端到端測試和優(yōu)化:通過不斷地調(diào)整參數(shù)、修改網(wǎng)絡(luò)結(jié)構(gòu)以及采用更高效率的算法來實(shí)現(xiàn)最佳性能表現(xiàn)。同時(shí)也需要注意內(nèi)存消耗情況以及功耗限制等因素。
4.在樹莓派上使用ncnn推理引擎,可以采取以下措施提高推理速度
  1. 優(yōu)化ncnn環(huán)境配置:確保您的樹莓派上已經(jīng)安裝了所有必要的依賴,并且ncnn環(huán)境配置正確。
  2. 編譯ncnn
  3. 模型轉(zhuǎn)換:使用ncnn提供的工具將YOLO3模型從其原始格式(通常是.cfg和.weights文件)轉(zhuǎn)換為ncnn支持的格式。
  4. 模型優(yōu)化
  5. 硬件優(yōu)化
  6. 使用更輕量級(jí)的模型
  7. 減少圖像分辨率
  8. 并行處理:如果您的應(yīng)用程序允許,可以在樹莓派上使用多線程或多進(jìn)程來并行處理多個(gè)任務(wù),以此來提高整體效率。
5.先進(jìn)行模型壓縮再用推理模型部署是一種常見的深度學(xué)習(xí)模型部署方式,可以有效地減小模型大小并提高推理性能。
6.量化實(shí)際上發(fā)生在模型壓縮階段,是獨(dú)立于推理引擎之外的一步。它的作用是生成更小更快的量化模型。推理引擎只是基于此量化模型進(jìn)行推理。但是推理引擎轉(zhuǎn)化模型過程中支持量化,例如tensorRT INT8、tensorflow lite等等。
7.在多核CPU中,可以使用線程并發(fā)來加速推理過程。將推理任務(wù)分配給多個(gè)線程同時(shí)處理,可以利用CPU的多核能力,加速推理速度。
8.硬件以及推薦的推理引擎
  • 英特爾神經(jīng)網(wǎng)絡(luò)棒2代:openvino推理引擎
  • 在 Intel 的 CPU/GPU 上就使用 OpenVINO,在 Arm 的 CPU/GPU 上使用 NCNN/MNN 等,在 Nvidia GPU 上使用 TensorRT。

Python加速方案

1.參考資源

1.Python量化策略的算法性能提升指南

2.其他

1.numba 數(shù)值計(jì)算加速 上百倍提升 性價(jià)比最高的優(yōu)化方案
  • 用于加速Python數(shù)值計(jì)算的開源庫
  • 使用LLVM編譯器將Python代碼編譯為本地機(jī)器碼
  • 將處理numpy數(shù)組的Python函數(shù)JIT編譯成機(jī)器碼執(zhí)行

在使用Numba加速Python數(shù)值計(jì)算時(shí),需要注意以下幾點(diǎn):

  1. Numba只能加速一部分Python代碼,特別是那些涉及到數(shù)值計(jì)算的部分。因此,需要仔細(xì)分析代碼,選擇合適的部分進(jìn)行加速,以獲得最大的加速效果。

  2. Numba只支持一部分Python語法和標(biāo)準(zhǔn)庫函數(shù),因此需要注意使用的Python語法和函數(shù)是否在Numba的支持范圍內(nèi)。一般來說,Numba支持大多數(shù)基本數(shù)據(jù)類型和NumPy數(shù)組操作,但是不支持Python標(biāo)準(zhǔn)庫中的一些模塊和函數(shù),如math模塊、random模塊等。

  3. 在使用Numba加速函數(shù)時(shí),需要使用@jit裝飾器將函數(shù)標(biāo)記為JIT(Just-In-Time)編譯函數(shù)。這樣,Numba就會(huì)對函數(shù)進(jìn)行編譯,從而提高其執(zhí)行速度。需要注意的是,Numba只能對一部分函數(shù)進(jìn)行加速,因此需要根據(jù)實(shí)際情況選擇要加速的函數(shù)。

  4. 在使用Numba加速函數(shù)時(shí),需要將函數(shù)的參數(shù)和返回值類型聲明為Numba支持的數(shù)據(jù)類型。Numba支持大多數(shù)基本數(shù)據(jù)類型和NumPy數(shù)組類型,但是不支持Python標(biāo)準(zhǔn)庫中的一些類型,如list、tuple等??梢允褂胣umba.types模塊中的數(shù)據(jù)類型來聲明函數(shù)參數(shù)和返回值類型,例如:

    import numba as nb
    @nb.jit(nb.float32(nb.float32, nb.float32))
    def add(x, y):
    	return x + y
    
  5. 在使用Numba加速函數(shù)時(shí),需要注意函數(shù)內(nèi)部調(diào)用其他模塊的情況。如果被調(diào)用的模塊中的函數(shù)不是Numba支持的函數(shù),那么這部分代碼將無法被加速。此時(shí),可以將這部分代碼提取出來,單獨(dú)編寫一個(gè)Numba加速的函數(shù),然后在主函數(shù)中調(diào)用該函數(shù),從而實(shí)現(xiàn)對整個(gè)程序的加速。即如果在使用Numba加速的函數(shù)中調(diào)用了Numba不支持的math模塊中的函數(shù),會(huì)導(dǎo)致Numba編譯錯(cuò)誤。因此,如果要使用Numba加速的話,需要使用Numba支持的函數(shù)替代math模塊中的函數(shù)。

2.Numpy 使用ndarray代替Python自帶的list 支持大型多維數(shù)組和矩陣計(jì)算 10倍以上提升
3.Cython 麻煩 優(yōu)先找已有C庫或者numba加速或者撰寫C庫 比numba快幾倍
  • 需要學(xué)專門的Cython語言
  • 允許用戶以非常接近Python的語法來實(shí)現(xiàn)非常接近C的性能。
  • 將Python代碼轉(zhuǎn)換為C語言代碼的工具
  • 使用了Cython語言編寫,其實(shí)現(xiàn)方式和C語言非常類似,因?yàn)镃ython是一種基于Python語言的C擴(kuò)展語言,它可以將Python代碼轉(zhuǎn)換為C語言或C++代碼,然后通過編譯器進(jìn)行編譯和鏈接,生成可執(zhí)行代碼。因此,Cython代碼可以獲得接近于C語言的性能,并且可以與Python語言進(jìn)行交互。也就是說實(shí)現(xiàn)它要用Cpython語言,不能直接使用Python語言。
  • Cython適用于需要高性能的Python代碼,并且可以使用C語言的庫和工具進(jìn)行擴(kuò)展的場景。需要注意的是,使用Cython進(jìn)行加速需要編寫一些額外的類型聲明和C語言代碼,因此相對于Numba而言,Cython的使用難度較高。
4.使用C庫

相關(guān)的工具包括ctypes、cffi、Swig、Boost.Python等

python調(diào)用C代碼方法與加速效果

5.多線程
  • 代碼中存在一些可以并行執(zhí)行的任務(wù)。如果您的代碼中沒有這樣的任務(wù),那么多線程并不能給您帶來任何性能上的提升。
  • 可以考慮使用多進(jìn)程來利用多個(gè)CPU核心同時(shí)處理幀。由于Python的全局解釋鎖(Global Interpreter Lock,GIL)會(huì)限制線程在同一時(shí)間只能在一個(gè)CPU核心上運(yùn)行,因此使用多線程并不能真正利用多個(gè)CPU核心。這意味著在任何時(shí)間點(diǎn)只有一個(gè)線程可以處于執(zhí)行狀態(tài)。即使在使用多線程的情況下,也只能有一個(gè)線程執(zhí)行 Python 代碼,而其他線程將被阻塞。因此,使用多線程來處理 CPU 密集型任務(wù)可能不會(huì)提高性能,甚至可能會(huì)降低性能。而使用多進(jìn)程可以避開這個(gè)限制,實(shí)現(xiàn)真正的并行處理。

什么是Python全局解釋器鎖GIL

Python 多進(jìn)程、多線程效率比較 - massquantity - 博客園 (cnblogs.com)

6.PyPy 比Cpython更快的解釋器 也就是換個(gè)解釋器運(yùn)行 5-10倍提升 CPython 是 Python 官方的標(biāo)準(zhǔn)解釋器

PyPy是一個(gè)Python解釋器,它通過即時(shí)編譯(JIT)技術(shù)對Python代碼進(jìn)行加速,從而獲得比CPython更高的性能表現(xiàn)。PyPy可以運(yùn)行大部分的Python代碼,而且通常不需要對代碼進(jìn)行修改,因此可以輕松地將現(xiàn)有的Python代碼遷移到PyPy上。

7.學(xué)習(xí)如何降低算法復(fù)雜度和編寫更高效的算法——最有效但最麻煩

使用8位無符號(hào)整型處理圖像數(shù)據(jù)比使用64位浮點(diǎn)型數(shù)據(jù)要快。這是因?yàn)椋?位無符號(hào)整型數(shù)據(jù)類型需要的內(nèi)存和計(jì)算資源比64位浮點(diǎn)型數(shù)據(jù)類型少得多,而且處理8位整型數(shù)據(jù)的硬件部件也更加普遍和成熟,因此可以實(shí)現(xiàn)更快的計(jì)算速度。

8.其他

許多第三方模塊是使用 C 擴(kuò)展編寫的,這些擴(kuò)展可以通過 Python 的 C API 與 CPython 解釋器進(jìn)行交互。這些擴(kuò)展可以提供比純 Python 代碼更高的性能,并且可以訪問底層操作系統(tǒng)和硬件的功能。也就是說第三方模塊大多已經(jīng)使用了許多 C 語言庫和函數(shù)來加速圖像處理算法的計(jì)算。例如scikit-image (skimage)是一個(gè)Python第三方圖像處理庫,它提供了許多常用的圖像處理算法和工具。skimage庫是使用Python和Cython編寫的,它使用了許多C語言庫和函數(shù)來加速圖像處理算法的計(jì)算。文章來源地址http://www.zghlxwxcb.cn/news/detail-861367.html

到了這里,關(guān)于算法在嵌入式端的部署與優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Nodejs移植到嵌入式ARM板方法

    Nodejs移植到嵌入式ARM板有3種方法: 在上位機(jī)虛擬機(jī)軟件上安裝ARM的交叉編譯鏈,下載nodejs源碼,使用交叉編譯軟件編譯nodejs,得到ARM板上可執(zhí)行的文件,并放到ARM板上,通過node xxx.js文件的方式執(zhí)行。注意還需要移植依賴庫到ARM板上。該方式適合小型的nodejs程序,例如一個(gè)小

    2024年02月04日
    瀏覽(34)
  • ESP32 移植 AWTK(嵌入式GUI庫)

    ESP32 移植 AWTK(嵌入式GUI庫)

    最近了解到有一個(gè)叫AWTK的嵌入式GUI庫,是ZLG(周立功)開發(fā)的一個(gè)開源免費(fèi)可商用的嵌入式GUI庫。手頭上剛好有一個(gè)自己最近設(shè)計(jì)的ESP32測試板,型號(hào)是ESP32_WROOM_32,和一個(gè)0.96寸80x160的TFT屏,就想著能不能把這個(gè)AWTK庫移植到ESP32上玩一下。于是,我又開始給自己挖坑了。 這次移

    2024年01月22日
    瀏覽(24)
  • 嵌入式Linux下LVGL的移植與配置

    嵌入式Linux下LVGL的移植與配置

    ???????https://github.com/lvgl/lvgl git下載方式 git clone?https://github.com/lvgl/lvgl.git 鏈接:https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwd=c68e? 提取碼:c68e 注意: 以下的配置均基于個(gè)人移植的sdk上修改. 解壓sdk源碼后修改Makefile文件,修改如下 直接修改編譯器(編譯器需要添加進(jìn)系統(tǒng)的

    2024年02月13日
    瀏覽(20)
  • MQTT協(xié)議版本Mosquitto移植到嵌入式arm平臺(tái)

    MQTT協(xié)議版本Mosquitto移植到嵌入式arm平臺(tái)

    MQTT是一個(gè)基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。MQTT協(xié)議是輕量、簡單、開放和易于實(shí)現(xiàn)的,這些特點(diǎn)使它適用范圍非常廣泛。在很多情況下,包括受限的環(huán)境中,如:機(jī)器與機(jī)器(M2M)通信和物聯(lián)網(wǎng)(IoT)。其在,通過衛(wèi)星鏈路通信傳感器、偶爾撥號(hào)的醫(yī)療設(shè)備、智

    2024年02月06日
    瀏覽(27)
  • 嵌入式Linux底層系統(tǒng)開發(fā) +系統(tǒng)移植+內(nèi)核文件系統(tǒng)(基礎(chǔ))

    嵌入式Linux底層系統(tǒng)開發(fā) +系統(tǒng)移植+內(nèi)核文件系統(tǒng)(基礎(chǔ))

    搭建交叉編譯開發(fā)環(huán)境 bootloader的選擇和移植 kernel的配置、編譯、移植和調(diào)試 根文件系統(tǒng)的制作 前兩個(gè)要點(diǎn)通常芯片廠家提供。后邊兩個(gè)要點(diǎn)是公司的工作重點(diǎn)。 學(xué)習(xí)方法:先整體后局部,層層推進(jìn) 如何編譯—如何添加命令和功能—如何定義自己的開發(fā)板。 移植的基本步

    2024年02月03日
    瀏覽(102)
  • 【LVGL】學(xué)習(xí)筆記--(1)Keil中嵌入式系統(tǒng)移植LVGL

    【LVGL】學(xué)習(xí)筆記--(1)Keil中嵌入式系統(tǒng)移植LVGL

    最近emwin用的比較煩躁,同時(shí)被LVGL酷炫的界面吸引到了,所以準(zhǔn)備換用LVGL試試水。 LVGL(輕量級(jí)和通用圖形庫)是一個(gè)免費(fèi)和開源的圖形庫,它提供了創(chuàng)建嵌入式GUI所需的一切,具有易于使用的圖形元素,美麗的視覺效果和低內(nèi)存占用。 豐富且強(qiáng)大的模塊化圖形組件:按鈕 (b

    2024年02月02日
    瀏覽(20)
  • 基于嵌入式linux的OpenSSL源碼移植(基于arm64)

    基于嵌入式linux的OpenSSL源碼移植(基于arm64)

    SSL是Secure Sockets Layer(安全套接層協(xié)議)的縮寫,可以在Internet上提供秘密性傳輸。Netscape公司在推出第一個(gè)Web瀏覽器的同時(shí),提出了SSL協(xié)議標(biāo)準(zhǔn)。其目標(biāo)是保證兩個(gè)應(yīng)用間通信的保密性和可靠性,可在服務(wù)器端和用戶端同時(shí)實(shí)現(xiàn)支持。已經(jīng)成為Internet上保密通訊的工業(yè)標(biāo)準(zhǔn)。

    2024年02月11日
    瀏覽(20)
  • 可移動(dòng)嵌入式設(shè)備

    ? 可移動(dòng)嵌入式設(shè)備是數(shù)據(jù)客戶端的一種表現(xiàn)形式。軟件的代碼編寫之后是運(yùn)行在服務(wù)器之上,?? 服務(wù)器的數(shù)據(jù)為客戶端提供服務(wù)的模式為服務(wù)器客戶端模式,server2client 架構(gòu)。服務(wù)器可以是大型的機(jī)器,也可以是小型機(jī),主要看數(shù)據(jù)處理量和用戶量的大小。一臺(tái)計(jì)算機(jī)其實(shí)

    2024年02月08日
    瀏覽(15)
  • 實(shí)時(shí)嵌入式Linux設(shè)備基準(zhǔn)測試快速入門3實(shí)時(shí)嵌入式Linux

    實(shí)時(shí)嵌入式Linux設(shè)備基準(zhǔn)測試快速入門3實(shí)時(shí)嵌入式Linux

    計(jì)算機(jī)系統(tǒng)與環(huán)境之間的交互通常是實(shí)時(shí)發(fā)生的,因此,對于作為計(jì)算機(jī)系統(tǒng)一部分的嵌入式設(shè)備來說,有關(guān)實(shí)時(shí)操作系統(tǒng)的討論也是一個(gè)重要話題。 本章將討論實(shí)時(shí)系統(tǒng)的特點(diǎn),介紹在Linux嵌入式設(shè)備上實(shí)現(xiàn)實(shí)時(shí)性的主要方法。具體來說,本章將重點(diǎn)分析PREEMPT_RT內(nèi)核補(bǔ)丁,

    2024年02月15日
    瀏覽(25)
  • 嵌入式linux驅(qū)動(dòng)開發(fā)之移遠(yuǎn)4G模塊EC800驅(qū)動(dòng)移植指南

    嵌入式linux驅(qū)動(dòng)開發(fā)之移遠(yuǎn)4G模塊EC800驅(qū)動(dòng)移植指南

    回顧下移遠(yuǎn)4G模塊移植過程, 還是蠻簡單的。一通百通,無論是其他4G模塊都是一樣的。這里記錄下過程,分享給有需要的人。環(huán)境使用正點(diǎn)原子的imax6ul開發(fā)板,板子默認(rèn)支持中興和移遠(yuǎn)EC20的驅(qū)動(dòng),這里要移植使用的是移遠(yuǎn)4G模塊EC800。 imax6ul開發(fā)板 虛擬機(jī)(Ubuntu18.04) 交叉編譯

    2024年02月17日
    瀏覽(52)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包