▼點(diǎn)擊下方名片,關(guān)注公眾號(hào),獲取更多精彩內(nèi)容▼
大家好,我是賀老師,嵌入式 AI工程師,《嵌入式AI:讓單片機(jī)學(xué)會(huì)思考》課程主理人,專注AI在MCU上的落地實(shí)踐。
最近很多人賀老師:“我的 STM32 能不能跑 AI”?
其實(shí)問的不是一個(gè)單純的芯片問題,而是一個(gè)完整工程問題。AI 模型不是孤立運(yùn)行的,它要占 Flash,要申請(qǐng) RAM,要處理傳感器輸入,還要在規(guī)定時(shí)間內(nèi)輸出結(jié)果。所以判斷一塊板子能不能跑 AI,不能只看它是不是 STM32,也不能只看開發(fā)板價(jià)格。首先賀老師先拆解常見的幾個(gè)誤區(qū):
第一個(gè)誤區(qū):只有最新、最貴、帶 NPU 的 STM32 才能跑 AI。
不是這樣。很多傳感器分類、異常檢測、關(guān)鍵詞喚醒,本質(zhì)上都是小輸入、小模型、小輸出,Cortex-M4 就能完成。比如電機(jī)振動(dòng)異常檢測,輸入可能只是幾十個(gè)特征;手勢識(shí)別也不過是幾百個(gè) IMU 采樣點(diǎn);這類項(xiàng)目不需要一開始就上 NPU。
第二個(gè)誤區(qū):只要叫 STM32 就都能跑 AI。
也不是這樣。STM32F103 這種老朋友非常適合學(xué)裸機(jī)、RTOS、通信和控制,但 20KB RAM、64KB Flash 的配置,基本不適合走 STM32Cube.AI 的常規(guī)路線。不是它完全不能做任何“智能判斷”,而是它承載不了一個(gè)比較完整的模型運(yùn)行時(shí)、輸入緩存和中間激活內(nèi)存。
第三個(gè)誤區(qū):跑 AI 必須有 NPU。
NPU 很強(qiáng),尤其適合視覺和高吞吐場景;但在很多 TinyML 項(xiàng)目里,真正決定能不能落地的是 RAM、Flash、輸入數(shù)據(jù)和工具鏈,而不是有沒有 NPU 這一個(gè)指標(biāo)。一塊沒有 NPU 但 RAM 夠、外設(shè)合適、工具鏈支持好的板子,往往比一塊參數(shù)看起來很強(qiáng)但接口不合適的板子更適合課程項(xiàng)目。
判斷一塊 STM32 能不能跑 AI,不看宣傳詞,只看六件事:內(nèi)核、RAM、Flash、主頻、外設(shè)、工具鏈報(bào)告。
如果是 TinyML 入門,我建議把 Cortex-M4 當(dāng)成實(shí)用分界線。原因很簡單:M4 通常帶 FPU 和 DSP 指令,對(duì)濾波、FFT、MFCC、矩陣運(yùn)算、int8 推理都更友好。很多嵌入式 AI 項(xiàng)目并不是只跑一個(gè)模型函數(shù),前面還有信號(hào)預(yù)處理。聲音項(xiàng)目要做頻譜或 MFCC,振動(dòng)項(xiàng)目要做窗口和頻域特征,IMU 項(xiàng)目要做濾波和統(tǒng)計(jì)特征,這些計(jì)算都能從 FPU/DSP 中受益。
M7 則明顯更適合計(jì)算量更大的任務(wù)。它通常主頻更高,緩存和總線能力也更強(qiáng),適合復(fù)雜音頻、多傳感器融合、輕量視覺前篩。M33/M55 常見于更新的低功耗或 AI 方向系列,安全、功耗、DSP 擴(kuò)展和生態(tài)支持會(huì)更好。到了 STM32N6,Cortex-M55 加 Neural-ART 加速器已經(jīng)是另一檔平臺(tái),適合討論真正的 MCU 端視覺 AI,而不是只做一個(gè)簡單傳感器分類。
M0/M3 不是“物理上絕對(duì)不能做任何智能判斷”,但它們不適合作為實(shí)際項(xiàng)目中的 TinyML 主力板。沒有 FPU、RAM 小、Flash 小,稍微像樣一點(diǎn)的模型和運(yùn)行時(shí)都會(huì)很吃力。你當(dāng)然可以手寫一個(gè)極小的閾值模型或線性分類器,也可以把傳統(tǒng)算法包裝成“智能判斷”,但那已經(jīng)不是大多數(shù)人說的 STM32Cube.AI 部署路線。
快速判斷:
看到 STM32F103C8T6,先別想著跑模型,先把它當(dāng)控制板;
看到 STM32F407、STM32L4、STM32G4,可以考慮小模型;
看到 STM32H7,可以考慮更復(fù)雜的音頻、傳感器融合和輕量視覺;
看到 STM32N6,才適合認(rèn)真討論 MCU 端視覺 AI。
很多人只看 Flash,因?yàn)槟P臀募嬖?Flash 里。實(shí)際部署時(shí),最先把你攔住的常常是 RAM。一個(gè)模型在電腦上看起來很小,導(dǎo)出成 int8 以后也不大,但它運(yùn)行時(shí)需要保存每一層的中間結(jié)果,這部分空間通常叫激活內(nèi)存或運(yùn)行時(shí)工作區(qū)。STM32Cube.AI 的 Analyze 報(bào)告里,最值得看的就是這部分。
模型運(yùn)行時(shí)需要輸入緩沖區(qū)、輸出緩沖區(qū)、中間激活值、運(yùn)行時(shí)工作區(qū),還要給 RTOS、通信、傳感器采樣、日志和業(yè)務(wù)代碼留空間。模型文件只有幾十 KB,不代表運(yùn)行時(shí)只需要幾十 KB RAM。比如一個(gè) IMU 分類模型,輸入窗口可能占幾 KB;一個(gè)音頻模型,1 秒 16kHz 的音頻緩沖就已經(jīng)是 32KB 左右的 int16 數(shù)據(jù);視覺項(xiàng)目更夸張,一張圖像就可能占掉一大塊 SRAM。
更麻煩的是,RAM 不是一整塊永遠(yuǎn)任你用。有些 STM32 的 SRAM 分成多個(gè)區(qū)域,DMA 能訪問的區(qū)域、Cache 相關(guān)區(qū)域、TCM 區(qū)域、外部 SDRAM 區(qū)域,各自限制不同。模型能不能跑,不只取決于總 RAM,還取決于這塊 RAM 能不能被你的采樣、推理和后處理鏈路正確使用。
粗略判斷:
RAM 低于 64KB:
不建議走常規(guī) TinyML 部署路線,除非模型極小、運(yùn)行時(shí)極簡。
RAM 128KB 左右:
可以嘗試傳感器分類、簡單異常檢測、小型關(guān)鍵詞識(shí)別。
RAM 512KB 以上:
大多數(shù)實(shí)用 TinyML 項(xiàng)目才有比較舒服的調(diào)試空間。
RAM 1MB 以上:
可以開始考慮輕量視覺、多通道音頻、更復(fù)雜的模型和緩存設(shè)計(jì)。如果是攝像頭項(xiàng)目,RAM 預(yù)算要更保守。一張 128 × 128 灰度圖約 16KB,一張 240 × 240 × 3 RGB 圖約 169KB。還沒有算模型中間張量、后處理緩存、攝像頭 DMA 緩沖和顯示緩沖。視覺項(xiàng)目不是模型先卡你,很多時(shí)候是圖像緩存先卡你。只要你打算接攝像頭,就要提前把幀緩存算進(jìn)預(yù)算里。
Flash 不是只放模型權(quán)重。真實(shí)工程里還有啟動(dòng)代碼、HAL/LL 庫、RTOS、協(xié)議棧、業(yè)務(wù)邏輯、日志、Bootloader、OTA 分區(qū),以及模型本身。很多演示代碼能放下,不代表產(chǎn)品工程也能放下,因?yàn)檠菔敬a通常沒有完整日志、升級(jí)、通信協(xié)議和異常處理。
如果只是課堂演示,256KB Flash 可以跑一些很小的 int8 模型;如果想做一個(gè)比較完整的工程,建議從 1MB Flash 起步。復(fù)雜一點(diǎn)的視覺、語音、多模型切換,最好看 2MB 以上,或者考慮外部 Flash。尤其是有 OTA 的設(shè)備,F(xiàn)lash 不能只算當(dāng)前固件,還要考慮升級(jí)區(qū)和回滾空間。
這里要特別注意量化。float32 權(quán)重一個(gè)參數(shù) 4 字節(jié),int8 權(quán)重一個(gè)參數(shù) 1 字節(jié)。對(duì) MCU 來說,量化不是錦上添花,而是常規(guī)動(dòng)作。很多模型不量化時(shí)看起來能跑,真正部署后會(huì)發(fā)現(xiàn) Flash、RAM、推理時(shí)間三項(xiàng)一起超預(yù)算。
50,000 個(gè)參數(shù):
float32 權(quán)重約 200KB
int8 權(quán)重約 50KB
這還只是權(quán)重,不包含運(yùn)行庫、代碼和中間緩沖。主頻當(dāng)然重要,但不能只看 MHz。TinyML 的推理速度,還取決于內(nèi)核架構(gòu)、FPU、DSP 指令、Cache、內(nèi)存訪問速度,以及推理庫有沒有用到優(yōu)化內(nèi)核。同樣是 100MHz,不同內(nèi)核、不同內(nèi)存路徑、不同編譯優(yōu)化等級(jí),實(shí)際推理時(shí)間可能差很多。
M4 可以做小模型,M7 更適合計(jì)算量明顯的任務(wù)。到了 H7 這類平臺(tái),I-Cache、D-Cache、TCM、DMA、內(nèi)存區(qū)域放置都會(huì)影響性能。比如圖像數(shù)據(jù)從外部 SDRAM 讀入,模型中間激活放在片內(nèi) SRAM,和所有數(shù)據(jù)都放在慢速外部存儲(chǔ)里,體驗(yàn)完全不同。到了 N6,問題又變成模型能不能被 NPU 高效支持,而不只是 CPU 跑多快。
還有一個(gè)容易忽略的點(diǎn):模型推理不是系統(tǒng)里唯一的任務(wù)。你的 MCU 還要采樣、濾波、通信、控制電機(jī)、刷新顯示、記錄日志。主頻看起來夠,但如果推理任務(wù)把 CPU 長時(shí)間占滿,系統(tǒng)整體仍然不穩(wěn)定。
一個(gè)實(shí)用原則:如果模型推理時(shí)間已經(jīng)超過業(yè)務(wù)周期的一半,這塊板子就很危險(xiǎn)。比如你每 100ms 要判斷一次,模型推理最好不要貼著 100ms 跑,采樣、預(yù)處理、后處理、通信都要時(shí)間。
AI 模型不是憑空運(yùn)行,它必須依賴輸入。做聲音識(shí)別,要看 PDM/I2S/ADC;做振動(dòng)檢測,要看 I2C/SPI、定時(shí)器、DMA;做視覺,要看 DCMI、MIPI、外部 RAM、LCD 或者數(shù)據(jù)上傳鏈路。模型能跑只是中間一步,數(shù)據(jù)能不能穩(wěn)定進(jìn)入模型,才是項(xiàng)目能不能演示和交付的前提。
有些板子 MCU 性能夠了,但板上沒有合適的傳感器接口,課程體驗(yàn)會(huì)很差。比如你想做攝像頭識(shí)別,卻選了一塊沒有 DCMI、沒有足夠 RAM、也沒有合適擴(kuò)展接口的板子,后面就會(huì)把時(shí)間花在轉(zhuǎn)接和驅(qū)動(dòng)上。再比如你想做聲音關(guān)鍵詞喚醒,但板子沒有合適的數(shù)字麥克風(fēng)接口,只能臨時(shí)用模擬 ADC 采樣,噪聲和增益問題會(huì)把學(xué)習(xí)重點(diǎn)帶偏。
所以選板時(shí)別只看芯片型號(hào),也要看開發(fā)板實(shí)際引出了什么接口。很多項(xiàng)目不是芯片不能跑 AI,而是開發(fā)板不適合這個(gè) AI 項(xiàng)目。課程項(xiàng)目尤其要重視這一點(diǎn),因?yàn)閷W(xué)生需要快速看到完整閉環(huán),而不是把大部分時(shí)間耗在硬件轉(zhuǎn)接和驅(qū)動(dòng)適配上。
STM32F103C8T6:Cortex-M3,20KB RAM,64KB Flash。
適合控制、通信、RTOS 入門,不建議拿它做 TinyML 主力板。
它可以做極簡單的規(guī)則判斷,比如閾值報(bào)警、狀態(tài)機(jī)、線性判斷,但不要指望它承擔(dān)標(biāo)準(zhǔn) AI 部署流程。
拿 F103 硬跑 TinyML,很容易把問題變成“如何在極小資源里硬擠”,不適合作為課程主線。
STM32F407VET6:Cortex-M4F,168MHz,192KB RAM,512KB Flash。
可以跑簡單傳感器分類、小型異常檢測、特征輸入的小模型。比如 IMU 手勢識(shí)別、電機(jī)振動(dòng)異常檢測、簡單聲音事件分類,這類任務(wù)比較適合。它的邊界也很清楚:不要一上來做視覺,更不要拿它挑戰(zhàn)通用目標(biāo)檢測。
STM32L4 / G4:適合低功耗傳感器類 TinyML。
比如電機(jī)振動(dòng)、動(dòng)作識(shí)別、簡單關(guān)鍵詞喚醒。L4 的優(yōu)勢偏低功耗,適合電池供電和長期運(yùn)行;G4 的模擬外設(shè)和控制能力更突出,適合電機(jī)、電源、工業(yè)采樣相關(guān)項(xiàng)目。它們不是靠極限算力取勝,而是靠功耗、外設(shè)和工程平衡。
STM32H743VIT6:Cortex-M7,最高 480MHz,片上 RAM 資源明顯更寬裕,F(xiàn)lash 也更大。
適合復(fù)雜一點(diǎn)的音頻、傳感器融合、輕量視覺前篩。H7 的性能很好,但它也帶來新的工程細(xì)節(jié):Cache、DMA、TCM、外部 SDRAM、內(nèi)存區(qū)域放置都要認(rèn)真處理。很多 H7 項(xiàng)目的問題不是模型不會(huì)跑,而是數(shù)據(jù)緩存和 DMA 一致性沒有處理好。
STM32N657:Cortex-M55 最高 800MHz,集成 Neural-ART 加速器,
官方資料給出的 NPU 性能為 600 GOPS,片上 SRAM 也更大。它適合討論真正的端側(cè)視覺、多傳感器融合和高性能推理。但 N6 不是“新手萬能板”,它要求你理解模型格式、NPU 支持范圍、內(nèi)存規(guī)劃和圖像鏈路。適合課程后半段或進(jìn)階項(xiàng)目,不適合第一節(jié)課就拿來堆概念。
手冊(cè)判斷只能做第一輪篩選。最后能不能跑,要看工具鏈報(bào)告。因?yàn)橥粔K板子,跑不同模型會(huì)有完全不同的結(jié)果;同一個(gè)模型,輸入尺寸不同、量化方式不同、后處理不同,也會(huì)改變 RAM、Flash 和推理時(shí)間。
最省事的方法是用 ST Edge AI Developer Cloud。上傳模型,選擇目標(biāo)板,在線做 benchmark。它能給出推理時(shí)間、RAM、Flash 等結(jié)果,還能在 ST 的板卡資源上遠(yuǎn)程測試。沒有開發(fā)板時(shí),這一步尤其有用。你可以先用云端結(jié)果排除明顯不合適的板子,再?zèng)Q定是否購買開發(fā)板。
如果你已經(jīng)在本地做工程,就用 STM32Cube AI Studio 或 CubeMX 相關(guān) AI 工具鏈導(dǎo)入模型,看 Analyze 和 Validate 結(jié)果。重點(diǎn)看這些數(shù)字:模型參數(shù)量、MACC、激活內(nèi)存、權(quán)重大小、輸入輸出大小、推理時(shí)間、是否有不支持的層。不要只看“能生成代碼”,能生成代碼只是開始,能在真實(shí)外設(shè)和真實(shí)數(shù)據(jù)下穩(wěn)定運(yùn)行才是目標(biāo)。
判斷流程:
1. 查 MCU 型號(hào):內(nèi)核、RAM、Flash、主頻、外設(shè)
2. 明確任務(wù):傳感器分類、語音、振動(dòng)、視覺
3. 準(zhǔn)備 int8 模型,而不是 float32 模型
4. 上傳 ST Edge AI Developer Cloud 做 benchmark
5. 看 RAM / Flash / 推理時(shí)間,而不是只看能否生成代碼
6. 上板驗(yàn)證真實(shí)數(shù)據(jù)和真實(shí)外設(shè)


