解析)
做嵌入式這幾年大家應該都感受到了邊緣AI從“可選”變成了“必選”。我最近在評估幾款面向工業(yè)視覺和智能終端的芯片發(fā)現(xiàn)一個很明顯的趨勢低功耗MPU開始把AI加速器直接做進SoC里而且宣傳口徑驚人地一致——都是“Power Efficient MPUs Embed AI Accelerator”。這話聽起來像營銷話術但實際接觸下來這確實是繼MCU外部NPU之后最值得關注的一條技術路線。工業(yè)質檢、智能門禁、便攜醫(yī)療、車載感知這些場景對功耗和體積越來越敏感。單純用MCU跑不動像樣的神經(jīng)網(wǎng)絡上大算力SoC又扛不住成本和散熱于是“低功耗MPU里內嵌AI加速器”就成了折中里的最優(yōu)解。這篇文章我會結合自己選型、開發(fā)、調優(yōu)的實操經(jīng)驗把這類芯片的架構思路、核心參數(shù)、工具鏈配置以及開發(fā)中真正讓人頭疼的坑都過一遍。如果你手里正好有帶NPU的MPU項目或者正在糾結要不要從MCU方案遷移過來這篇可以當個參考。1. 低功耗MPU內嵌AI加速器的設計思路與方案選型1.1 為什么非要往MPU里塞AI加速器先把概念理清楚。MPUMicroprocessor Unit在嵌入式語境里一般指的是帶MMU、能跑Linux/RTOS的應用處理器比如瑞薩RZ系列、NXP i.MX系列、TI Sitara系列。以前這類芯片的定位是“能跑系統(tǒng)的處理器”AI計算要么用CPU硬算要么掛個外置NPU或GPU。但實際項目里這么干有麻煩。CPU跑神經(jīng)網(wǎng)絡效率太低一個YOLO類的檢測模型在四核A53上跑算力被吃光不說內存帶寬也頂不住。外置NPU方案倒是算力強可一來成本抬上去二來PCB面積和走線復雜度增加三來兩顆芯片之間的數(shù)據(jù)搬運本身就耗電、費時間。對量產(chǎn)產(chǎn)品來說功耗、BOM成本、體積都是要命的指標。所以芯片廠商的思路很直接與其讓你外面掛一顆不如我直接把NPU、DSP這類AI加速單元集成進SoC和CPU共享DDR和中斷控制器。這樣一來數(shù)據(jù)不用再通過PCIe或USB在芯片間倒騰系統(tǒng)功耗天然更低二來軟件棧統(tǒng)一一套SDK搞定AI和業(yè)務邏輯三來對板級設計更友好四層板都能把核心電路畫完。我自己評估過幾個項目最直觀的感受是集成AI加速器的MPU在中等算力區(qū)間1-5 TOPS幾乎是無敵的存在。低于這個區(qū)間你用MCU輕量模型更劃算高于這個區(qū)間就要考慮獨立NPU或者GPU方案。目前很多低功耗MPU宣傳的能效比都在2-5 TOPS/W之間這個數(shù)對邊緣設備來說非常能打。1.2 三類主流AI計算方案的取舍在選型的時候把市面上常見的方案分成三類來看會清晰很多方案算力區(qū)間典型能效適合場景主要劣勢MCU DSP指令擴展0.1-0.5 TOPS高但絕對算力低喚醒詞、異常檢測、簡單分類跑不了復雜CNN/Transformer低功耗MPU 內置NPU/DRP1-5 TOPS2-5 TOPS/W工業(yè)視覺、邊緣盒子、醫(yī)療終端算力上限擺在那大模型跑不動MPU 外置NPU/GPU5-100 TOPS相對較低自動駕駛、服務器推理成本高、功耗高、板級復雜我接觸過的項目里有一個是工業(yè)產(chǎn)線上的瑕疵檢測原來用樹莓派加攝像頭跑Tiny-YOLOv4整板功耗7W左右還得外接散熱風扇。后來換成內置NPU的低功耗MPU同樣的模型量化到INT8功耗降到3W以內風扇直接去掉被動散熱搞定。這就是典型的內嵌AI加速器帶來的工程紅利。當然方案選型不能只看算力。你要考慮工具鏈的成熟度、開源模型能不能順利轉換、驅動和OS怎么集成、量產(chǎn)供貨周期多長。我見過不少項目在樣機階段發(fā)現(xiàn)“算力夠但工具鏈不行”模型死活轉換不過去最后又倒退回外置方案。所以下一節(jié)說的工具鏈問題很多時候比芯片本身參數(shù)更重要。2. 核心硬件細節(jié)解析算力、能效比與工具鏈兼容性2.1 不要被TOPS數(shù)字忽悠能效比才是關鍵選帶AI加速器的MPU時廠商最喜歡宣傳“XX TOPS AI算力”。TOPS通常指整數(shù)運算的每秒萬億次操作聽起來很猛但實際能發(fā)揮多少要看幾個隱性指標。首先是能效比單位是TOPS/W。低功耗MPU的優(yōu)勢恰恰在這里。比如瑞薩RZ/V2L那類方案集成的DRP-AI能效比做得很好整機功耗控制在幾瓦以內還能跑1 TOPS級別的推理。而一顆幾十瓦的獨立GPU跑幾十TOPS能效比反而被MPU甩開。對電池供電的設備來說能效比的意義遠大于峰值算力。其次是有效算力。TOPS是理論極限實際要看你跑的模型結構、數(shù)據(jù)精度、內存帶寬能不能喂飽NPU。我做過一個對比測試同樣標稱2 TOPS的兩款芯片跑同一個YOLOv5s量化模型幀率能差出40%。差距主要出在DDR帶寬上——NPU要不斷搬權重和中間結果如果內存帶寬不夠計算單元就是在空轉。這里有個經(jīng)驗公式可以參考對大多數(shù)CNN推理任務模型參數(shù)量MB乘以單幀計算量FLOPs除以DDR有效帶寬基本決定了理論幀率下限。選型時別光看TOPS把DDR帶寬也列進對比表里能少踩不少坑。2.2 比對幾款典型芯片的AI加速單元不同廠商的實現(xiàn)思路差異挺大我整理了幾款主流低功耗MPU的AI加速方案方便大家選型時參考芯片平臺核心CPUAI加速單元標稱算力開發(fā)工具鏈瑞薩RZ/V2L雙核A55 M33DRP-AI動態(tài)可重構處理器1.1 TOPSINT8DRP-AI Support Package、e2 studioNXP i.MX 8M Plus四核A53內置NPU2.3 TOPSeIQ Toolkit、ONNX/TFLite轉換器TI AM62A四核A53DLA深度學習加速器2 TOPSEdge AI Studio、TIDLDRP-AI和普通NPU不一樣它屬于動態(tài)可重構處理器可以把模型映射成硬件流水線在低功耗下跑出不錯的能效。NXP的NPU則是典型的DSA思路配合eIQ工具鏈對TensorFlow Lite模型的兼容性做得比較好。TI的DLA走的是“極簡”路線吃掉了TIDL的模型轉換流程和自家處理器綁定很深上車容易下車上也容易。我的建議是選型時重點看三樣東西模型轉換工具鏈是否支持你的主力框架PyTorch/ONNX/TFLite、有沒有現(xiàn)成的參考模型和benchmark、NPU驅動對Linux主線的適配是否及時。這些決定了你的算法團隊和嵌入式團隊能不能順暢配合。2.3 小模型也要注意數(shù)據(jù)精度和內存布局很多低功耗MPU的AI加速器只支持INT8甚至有些嚴格的還要求對稱量化。這就倒逼你在部署前做量化感知訓練或者至少做精度校準。實測下來分類模型量化到INT8基本不掉點但檢測模型偶爾會掉1-2個mAP左右這時候就得靠混合量化或者對敏感層做回退處理。同時內存布局很關鍵。NPU通常希望模型權重是連續(xù)且對齊的內存塊最好在系統(tǒng)啟動時就固定在預留的連續(xù)物理內存里。Linux下通常會預留CMA區(qū)域給NPU用這會影響整個系統(tǒng)的內存分配。我見過團隊因為CMA配置太小NPU驅動加載失敗推理任務直接崩潰排查了一天才找到原因。3. 實操過程從環(huán)境搭建到模型部署的全流程3.1 開發(fā)環(huán)境與工具鏈準備帶AI加速器的MPU開發(fā)和傳統(tǒng)嵌入式開發(fā)最大區(qū)別就是多了“AI工具鏈”這一層。以Linux系統(tǒng)為例典型的環(huán)境包括三部分交叉編譯工具鏈、Yocto/Buildroot鏡像、NPU推理運行時。先說交叉編譯。低功耗MPU基本是ARM架構用arm-none-linux-gnueabihf或aarch64-linux-gnu交叉編譯工具鏈都行。重點提醒一下NPU驅動和運行時庫最好直接用廠商SDK里自帶的版本別自己從主線編譯否則驅動接口不一致后面推理會莫名失敗。然后是OS鏡像。我一般推薦直接用廠商BSPBoard Support Package構建的Linux鏡像比如Yocto的SDK、Buildroot的defconfig。原因是AI推理涉及DDR帶寬、CMA內存、GPU/VPU共享相關內核配置廠商的配置模板都是調過的。自己從頭裁剪內核很容易因為某個DMA配置不對導致NPU和相機爭搶帶寬推理延遲直接翻倍。最后是推理運行時。目前主流的低功耗MPU都支持ONNX Runtime或者TFLite的適配后端通過廠商提供的外部算子實現(xiàn)NPU加速。舉個實際例子我在i.MX 8M Plus上用ONNX Runtime eIQ執(zhí)行YOLOv5s只需要把模型導出為ONNX再調用eIQ的轉換腳本生成NPU可執(zhí)行的格式整個流程跑得還是很順的。3.2 配置OS與MPU軟件包以AUTOSAR場景為例在車載和車規(guī)級項目里這類低功耗MPU經(jīng)常要跑AUTOSAR平臺OS配置就不是簡單的Linux啟動了而是要基于AUTOSAR工具鏈來做復雜軟件集成。這里就得提到Davinci Configurator這類工具。Davinci Configurator是Vector家的AUTOSAR配置工具在傳統(tǒng)MCU的BSW配置上用得很多。這兩年隨著MPU上車它也支持了MPU相關的OS配置和軟件包集成。大概流程是新建AUTOSAR工程導入MPU的芯片支持包SIP包里面會定義好內核、中斷、內存映射這些基礎信息。配置多核OS。這類MPU往往是AOTA Architecture的比如雙核A55加M33就要在工具里把不同核跑的任務分配清楚A55上跑高負載的AI推理或感知融合M33跑安全相關的控制邏輯。配置調度表。AI推理任務通常有周期性比如每33ms一幀這個周期和AUTOSAR的OS調度表要匹配好。如果調度表優(yōu)先級設得不對安全任務會被推理任務阻塞。集成NPU驅動。廠商一般會提供AUTOSAR組件形式的NPU驅動通過Davinci把驅動模塊的端口、數(shù)據(jù)接口、內存區(qū)域配置進去生成RTE代碼后再和用戶程序一起編譯。這套流程對傳統(tǒng)MCU工程師來說有一定學習成本因為MPU側的內存保護、緩存一致性、中斷路由比MCU復雜得多。我有一次就是因為沒有正確配置MPU的內存訪問權限NPU驅動在訪問輸入圖像緩存時觸發(fā)了總線錯誤系統(tǒng)直接panic。3.3 模型轉換、量化與部署的關鍵步驟模型部署流程是這類項目最容易卡殼的地方。我按自己習慣的流程整理一下訓練和導出在PC上用PyTorch或TensorFlow訓練模型導出為ONNX。注意保持輸入尺寸固定動態(tài)shape在NPU上支持很差。轉換前歸一化不要等轉換工具幫你歸一化把圖像的歸一化減均值除方差放到模型里的第一層這樣NPU單次推理更快。量化校準用幾百張代表性的圖像做INT8量化校準校準集的分布盡量貼近真實場景。校準集選不好量化后精度波動非常明顯。轉換成廠商的NN格式這一步根據(jù)廠商工具鏈不同叫法不一樣NXP叫NPU的eIQ轉換瑞薩叫DRP-AI轉換腳本TI叫TIDL導入?;旧鲜亲x取ONNX輸出一個NPU專用的二進制模型和依賴文件。交叉編譯部署程序在主程序里把輸入圖像從攝像頭或文件讀進來做必要的顏色空間轉換和縮放放到NPU驅動指定的輸入內存區(qū)調用推理接口再把輸出解析出來??雌饋碇挥形宀降恳徊蕉加胁簧偌毠?jié)。比如第一步里如果模型里有Loop、Squeeze這類NPU不支持的算子轉換工具報的錯非常難懂我建議先能在PC上轉成ONNX再用onnxsim做一遍簡化。再比如第四步轉換成功后通常會生成一個運行時配置里面有個模型加載緩沖區(qū)和執(zhí)行緩沖區(qū)的大小這些要映射到CMAC或DDR物理地址上別隨手改。4. 功耗優(yōu)化策略與實測數(shù)據(jù)經(jīng)驗4.1 從DVFS到低級時鐘門控的功耗優(yōu)化鏈路低功耗MPU的功耗優(yōu)化不能只依賴NPU的硬件效率軟件側也要做配合。首先要用好DVFSDynamic Voltage and Frequency Scaling根據(jù)當前負載動態(tài)調整CPU和NPU頻率。這塊我踩過坑系統(tǒng)默認的調頻器是performance模式NPU跑了個小模型也經(jīng)常滿頻率運行整機功耗比預期高了將近1W。后來改成ondemand或schedutil配合NPU驅動里的時鐘管理功耗明顯下來了。接著是電源域管理。很多MPU會把NPU、VPU、ISP等模塊放在獨立的電源域里不使用時可以完全斷電。我建議主程序做一個“空閑檢測”比如連續(xù)10秒沒有推理任務就把NPU電源域關掉同時讓CPU進入WFIWait For Interrupt或suspend狀態(tài)。這一招在電池設備上很有效待機功耗能差出兩個數(shù)量級。還有IO和外設功耗。低功耗MPU往往有多個UART、USB、Ethernet控制器如果開發(fā)時沒注意Linux內核會把沒用的外設也通電并保持時鐘開啟。排查方法是看/sys/kernel/debug/clk/clk_summary把沒用到的模塊關掉或者通過設備樹禁掉每項都能省幾十毫瓦。4.2 實測數(shù)據(jù)同一模型在不同功耗配置下的表現(xiàn)我之前做過一組實驗硬件平臺是一個內置1 TOPS NPU的四核A55 MPU跑INT8的YOLOv5s輸入尺寸416x416。分別在三種配置下測整板功耗和推理延遲配置CPU頻率NPU頻率整板功耗單幀延遲性能優(yōu)先1.8GHz固定滿頻5.8W28ms均衡模式動態(tài)調頻自動降頻3.6W36ms低功耗模式1.0GHz限制低頻運行2.4W52ms這個實驗說明在低功耗MPU上性能和功耗確實是可以做取舍的。關鍵要想清楚應用場景的硬性要求如果只是一個周期性的狀態(tài)上報2.4W的低功耗模式完全夠用如果是實時工業(yè)檢測那就得用前兩種模式并配合更大的散熱設計。4.3 異步推理是降低峰值功耗的利器經(jīng)常被忽視的優(yōu)化手段是異步推理。很多AI推理框架的接口是同步阻塞的比如你調用NPU推理CPU就死等結果期間CPU空閑NPU滿載。這個階段的瞬時功耗其實很高而且CPU沒有做任何有價值的事。改成異步后你可以把視頻幀采集、NPU推理、結果后處理三個環(huán)節(jié)做成流水線。NPU在推理第N1幀的時候CPU同時在解析第N幀的結果并且采集第N2幀的輸入。這樣CPU的負載被填滿NPU不會空閑等待整體的調度更均衡峰值功耗也能被平均掉。實測下來同樣的處理任務同步方案和異步方案的平均功耗能差10%-15%。5. 常見問題與排查技巧實錄5.1 模型跑不動或推理延遲飆高這是最多人問的問題。如果你發(fā)現(xiàn)NPU的標稱算力很高但模型跑起來幀率很低先別急著罵芯片。第一步是看有沒有用到NPU加速程序日志里如果顯示的是CPU fallback執(zhí)行那就是模型沒轉換成功或者算子沒跑在NPU上。第二步是查DDR帶寬可以跑一個內存帶寬測試工具比如mbw看看現(xiàn)在系統(tǒng)和DMA的帶寬占用。如果已經(jīng)把DDR帶寬占滿了NPU性能掉一半都不奇怪。第三步是看模型的算子融合情況。有些工具鏈對卷積BNReLU的結構能自動融合成一個算子有些不能。轉換前檢查一下模型結構盡量手動把BN層折疊進卷積這樣不僅NPU算得快內存訪問也少很多。5.2 實測功耗比芯片手冊高了太多功耗超標通常有幾個原因供電電壓設置太高、外設沒關閉、電源管理配置錯誤。先檢查PMIC的電壓配置有些MPU的VDD_GPU或VDD_NPU在出廠默認配置是最高電壓等級實際性能完全用不到那么高。再檢查內核態(tài)有沒有一直被喚醒的timer/proc/interrupts里如果某個中斷瘋狂觸發(fā)CPU沒辦法進入低功耗狀態(tài)。還有一個容易被忽略的點是調試接口比如JTAG和串口如果一直連著芯片無法進入深度睡眠。量產(chǎn)板子這些調試接口要默認斷電或者改成普通GPIO能省不少功耗。5.3 OS配置與NPU驅動的內存分配沖突在Linux或AUTOSAR里NPU驅動分配連續(xù)物理內存的位置很敏感。Linux下如果CMA區(qū)域太小或者被相機模塊占用過多NPU推理時就會申請內存失敗。我的建議是一切剛開始做的時候就通過內核cmdline預留一塊專用的物理內存比如memmap512M0x50000000讓NPU驅動永遠在這個區(qū)域工作避免跟其他子系統(tǒng)競爭。AUTOSAR場景下更要注意OS的任務棧和內存保護單元MPU的配置邊界經(jīng)常會把NPU驅動需要的共享內存排除在外。我用Davinci Configurator配置時就碰到過數(shù)據(jù)都傳不到NPU里。最后是把NPU相關內存區(qū)單獨添加進OS的內存映射配置還要額外配置MPU保護區(qū)確保S模式和應用模式都能訪問。5.4 常見問題速查表現(xiàn)象可能原因排查思路解決建議模型轉換報“Unsupported Operator”算子不在NPU支持列表檢查算子列表找出不支持節(jié)點算子替換或函數(shù)建模切成等價運算推理速度比CPU還快不了多少模型沒真正跑到NPU上看日志確認有沒有NPU加載重新轉換模型檢查驅動加載狀態(tài)NPU推理結果全為0或隨機的數(shù)輸入數(shù)據(jù)格式不對或內存地址錯檢查輸入圖像尺寸、通道順序確認縮放到模型的輸入要求對齊到內存系統(tǒng)掛起后無法喚醒喚醒源沒配置對查中斷喚醒能力查電源域配置在設備樹中配置正確的喚醒GPIO或timer整板功耗異常高外設或電壓沒優(yōu)化檢查clk_summary和PMIC寄存器關掉無用外設調低電壓等級遇到問題的時候別一個個硬扛廠商的SDK包通常都帶參考例程比如攝像頭采集加NPU推理再加LCD顯示的標準演示。如果你的程序跑不起來先把參考例程跑通再逐個模塊替換成自己的代碼能省下很多排查時間。寫在最后的一點個人體會做了幾個帶NPU的低功耗MPU項目之后我的最大感受是這一類芯片把AI落地的門檻拉低了很多但并不是說拿到手就能輕松跑起來。硬件上的能效比再漂亮軟件工具鏈、OS配置、功耗管理這些環(huán)節(jié)總有地方會卡你一下。我自己的習慣是新項目上馬后先花兩三天跑通廠商的參考例程把數(shù)據(jù)通路完整走一遍再開始調自己的模型和應用。這個前期投入很值得后面踩坑的概率會小很多。另外選型時多看看同系列芯片的roadmap也很重要。很多低功耗MPU同一個引腳兼容好幾款芯片低算力和高算力版本可替換。這意味著你的板子和軟件棧設計成同一套未來算力不夠時可以直接換Pin-to-Pin兼容的型號不用重新畫板。這個設計思路在量產(chǎn)項目里非常有價值產(chǎn)品生命周期被拉長了好幾年。