算 | Fall 2026 | 筆記 | Lecture 10:MCUNet: TinyML on Microcontrollers)
目錄前言1. Lecture Plan2. What Is TinyML?3. Understanding the TinyML Challenges4. Tiny Neural Network Design4.1 MCUNet: Co-Designing Architecture and Inference Engine4.2 TinyNAS: Search Space Design4.3 Patch-based Inference4.4 The Halo Problem and Receptive-Field Redistribution4.5 MCUNetV2 Results and Insights5. Applications5.1 Tiny Vision5.2 Tiny Audio5.3 Tiny Time Series and Anomaly Detection6. Summary結(jié)語參考前言學(xué)習(xí) MIT 韓松教授講授的 MIT 6.5940: Tiny ML and Efficient AI Computing 課程本篇文章記錄第十講MCUNet的學(xué)習(xí)內(nèi)容和大家一起分享交流Websitehttps://hanlab.mit.edu/courses/2026-fall-65940Videohttps://www.youtube.com/playlist?listPLH7PIPKvCm381. Lecture Plan今天我們要講第十講MCUNet 與 TinyML。我們會(huì)通過一個(gè)非常詳細(xì)的例子看看如何為微控制器上的極小規(guī)模模型做模型壓縮與部署。我們會(huì)用到前面幾講討論過的所有技術(shù)比如量化、剪枝、神經(jīng)架構(gòu)搜索和蒸餾。這是今天的安排首先討論什么是 TinyML以及 TinyML 面臨的挑戰(zhàn)和困難比如如何壓縮模型、如何把它塞進(jìn)微控制器。然后我們會(huì)講神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)結(jié)合神經(jīng)架構(gòu)搜索技術(shù)。最后講 TinyML 的一些應(yīng)用比如視覺應(yīng)用、音頻應(yīng)用還有異常檢測(cè)。2. What Is TinyML?我們先從一個(gè)很簡(jiǎn)單的問題開始。什么是 TinyML為什么我們要把深度學(xué)習(xí)網(wǎng)絡(luò)放到那么小的微控制器上運(yùn)行這張圖我們?cè)诘谝恢v里討論過今天的 AI 系統(tǒng)可以非常龐大、非常昂貴。模型的參數(shù)越來越多、GPU 也在變大但今天的前沿模型遠(yuǎn)比這還要大。即使在 2020 年發(fā)布的 GPT-3也已經(jīng)有 1750 億參數(shù)訓(xùn)練大約需要超過 300 個(gè) GPU 年估計(jì)成本 460 萬美元。而 TinyML 的工作點(diǎn)完全不同低能耗、低延遲、低成本還有更好的隱私保護(hù)。在傳統(tǒng)的云端 AI 模式下設(shè)備會(huì)把數(shù)據(jù)上傳到遠(yuǎn)程服務(wù)器服務(wù)器執(zhí)行模型推理比如做預(yù)測(cè)。這樣我們能用到強(qiáng)大的云端算力比如這里最新的 GPU但它也帶來了通信延遲、額外成本而且你需要把個(gè)人數(shù)據(jù)上傳到云服務(wù)器這可能引發(fā)隱私問題。移動(dòng) AI 把一部分計(jì)算從云端移到智能手機(jī)上把大部分推理負(fù)載保留在本地設(shè)備、本地計(jì)算資源上能更好地保護(hù)隱私。不過智能手機(jī)仍有數(shù) GB 內(nèi)存計(jì)算資源也比微控制器多得多。那我們的問題是能不能再進(jìn)一步能不能超越移動(dòng) AI能不能在只有幾百 KB 片上內(nèi)存的微型設(shè)備上運(yùn)行有實(shí)際意義的神經(jīng)網(wǎng)絡(luò)為什么要 Tiny AI為什么要把 AI 模型跑在微控制器上而不是手機(jī)或云端 GPU 上一方面是我們討論過的隱私問題另一方面用微控制器我們可以做到更低的成本、更低的能耗而且?guī)缀蹩梢圆渴鹪谌魏蔚胤奖热鐐€(gè)人健康監(jiān)測(cè)器、個(gè)人檢測(cè)設(shè)備以及各種制造場(chǎng)景。微控制器遍布全世界全球已有數(shù)十億臺(tái) IoT 設(shè)備在使用微控制器。在這些平臺(tái)上部署神經(jīng)網(wǎng)絡(luò)可以把智能直接帶到傳感器、不同應(yīng)用、不同機(jī)器和嵌入式系統(tǒng)上。它還能大幅降低成本GPU 可能要幾十萬到上百萬美元而微控制器非常便宜。這種低成本讓 AI 能力可以用在那些沒有智能手機(jī)、服務(wù)器或可靠網(wǎng)絡(luò)、或者部署不實(shí)用的場(chǎng)景里。它還能幫我們省電實(shí)現(xiàn)“綠色 AI”。微控制器通常功耗很低工作在毫瓦級(jí)。這讓始終在線的檢測(cè)與感知成為可能而不會(huì)很快耗盡設(shè)備電量也支持由小電池或能量采集供電的應(yīng)用。這些特性打開了廣泛的應(yīng)用場(chǎng)景比如智能家居、制造業(yè)的自動(dòng)化檢測(cè)、個(gè)性化醫(yī)療還有精準(zhǔn)農(nóng)業(yè)等等。在資源極其受限的場(chǎng)景中引入智能挑戰(zhàn)在哪里關(guān)鍵挑戰(zhàn)是把有用的模型塞進(jìn)極小的硬件預(yù)算里也就是極低的算力、極低的內(nèi)存帶寬和極低的存儲(chǔ)。在這張表里可以看到即使是很老的云端 GPU 比如 Tesla V100也有 32 GB 的顯存而且部署在云集群里會(huì)有 TB 級(jí)的磁盤存儲(chǔ)。移動(dòng) AI 通常有 4 GB 到 32 GB 的內(nèi)存存儲(chǔ)大約 250 GB 或稍大一些。而 TinyML 的典型微控制器要小得多通常只有大約 300 KB 的片上 SRAM 用于計(jì)算、存放激活值存儲(chǔ)方面大約 1 MB 的 flash用于存放模型權(quán)重和程序。這里有數(shù)個(gè)數(shù)量級(jí)的差距激活內(nèi)存也就是用于深度學(xué)習(xí)網(wǎng)絡(luò)激活值的片上內(nèi)存大約只有云端 AI 的 1/13,000存儲(chǔ)大約只有 1/100,000。所以為 GPU 或手機(jī)設(shè)計(jì)的模型不能輕易適配到微控制器這樣的 TinyML 設(shè)備上。因此我們需要同時(shí)減小內(nèi)存占用減少激活值這樣模型才能逐層運(yùn)行而不撐爆片上內(nèi)存同時(shí)減少模型權(quán)重因?yàn)?flash 只有 1 MB 存儲(chǔ)。如果模型太大比如有 2 MB就沒法存到微控制器上。總結(jié)一下TinyML 通常受延遲和能耗約束也有內(nèi)存約束。在這種場(chǎng)景下我們需要同時(shí)減小模型的激活值和權(quán)重大小才能把它塞進(jìn) SRAM 和 flash。面對(duì)這種不同的設(shè)定我們需要同時(shí)改變模型架構(gòu)設(shè)計(jì)和系統(tǒng)優(yōu)化。3. Understanding the TinyML Challenges下面我們先看看卷積神經(jīng)網(wǎng)絡(luò)在微控制器上運(yùn)行時(shí)權(quán)重內(nèi)存和激活內(nèi)存分別用在哪里??紤]一個(gè)卷積層它先讀入激活值把卷積核作用在上面得到輸出激活值。要理解網(wǎng)絡(luò)的權(quán)重在做什么我們需要知道推理過程中激活值和權(quán)重分別存在哪里。通常推理運(yùn)行時(shí)我們把輸入和輸出激活值存放在 SRAM 里而卷積核在推理期間是固定的所以可以存在非易失的 flash 中在需要時(shí)讀取。如果你還記得像 Arduino Nano 33 BLE Sense 這樣的微控制器有 256 KB SRAM 和 1 MB flash。另一個(gè)例子是STM32 F746ZG—過去幾年非常流行的一款商用微控制器有 320 KB SRAM 和 1 MB flash。我們的任務(wù)是設(shè)計(jì)一個(gè)能跑在這些微控制器上的模型輸入和輸出激活值要小于 SRAM模型權(quán)重也要能存進(jìn) flash。粗略估算時(shí)flash 通常用來存模型所以在評(píng)估模型能否存進(jìn)微控制器時(shí)我們要計(jì)算靜態(tài)模型大小而 SRAM 使用量通常按輸入激活加輸出激活來考慮。它是動(dòng)態(tài)的因?yàn)椴煌瑢拥奶卣鲌D大小不同我們只關(guān)心整個(gè)推理過程中的峰值 SRAM。比如在卷積網(wǎng)絡(luò)的早期層激活圖可能非常大所以早期層的 SRAM 消耗更高而后面層的 SRAM 壓力會(huì)小得多。這是不同網(wǎng)絡(luò)激活峰值 SRAM 的分析結(jié)果。我們有 ResNet-50也有 MobileNet V2。即使 MobileNet V2 是為移動(dòng)設(shè)備部署優(yōu)化的它的峰值 SRAM、最大激活仍然非常大可能是片上預(yù)算的 22 倍。即使做量化最大激活、最大 SRAM 使用量仍然遠(yuǎn)大于設(shè)備 320 KB 的約束。如果我們把 MobileNet V2 和 ResNet-18 比較MobileNet V2 的參數(shù)量已經(jīng)比 ResNet-18 小得多但激活值其實(shí)略大峰值激活甚至比 ResNet-18 還高。也就是說它是為移動(dòng)部署優(yōu)化的卻不是為 TinyML 部署優(yōu)化的尤其是在微控制器上。這會(huì)導(dǎo)致一個(gè)很嚴(yán)重的問題SRAM 與 flash 都會(huì)成為推理的整體瓶頸。在 MCUNet 中我們會(huì)同時(shí)處理這兩個(gè)約束既減小模型大小也設(shè)計(jì)峰值激活內(nèi)存更低的網(wǎng)絡(luò)。TinyML 模型必須同時(shí)適配 flash 和 SRAM因?yàn)槌^任何一個(gè)預(yù)算模型都無法在微控制器上運(yùn)行。4. Tiny Neural Network Design帶著硬件約束我們來研究如何專門為端側(cè)部署設(shè)計(jì)網(wǎng)絡(luò)。MCUNet 是我們研究組之前的工作采用算法-系統(tǒng)協(xié)同設(shè)計(jì)。4.1 MCUNet: Co-Designing Architecture and Inference Engine傳統(tǒng)上人們通常只優(yōu)化神經(jīng)網(wǎng)絡(luò)架構(gòu)或者只優(yōu)化推理引擎。但在 MCUNet 中模型架構(gòu)和推理引擎是一起設(shè)計(jì)的這樣能同時(shí)利用兩邊的優(yōu)勢(shì)用協(xié)同設(shè)計(jì)的方式演進(jìn)比只優(yōu)化一邊高效得多。這是對(duì)我們討論過的神經(jīng)架構(gòu)搜索的簡(jiǎn)要回顧。這是一種常見的做法用來優(yōu)化可部署在資源受限場(chǎng)景中的模型保持軟件或者說推理庫不變優(yōu)化模型架構(gòu)。這里的例子有 ProxylessNAS 和 MnasNet展示了神經(jīng)架構(gòu)搜索的有效性。另一條研究路線是給定輸入模型如何相應(yīng)地優(yōu)化推理引擎一個(gè)非常重要的例子是TVM它可以在給定神經(jīng)網(wǎng)絡(luò)的情況下調(diào)優(yōu)深度學(xué)習(xí)庫在不改變模型架構(gòu)的前提下優(yōu)化推理效率。而MCUNet 把兩個(gè)方向的優(yōu)化結(jié)合起來它協(xié)同設(shè)計(jì)高效的神經(jīng)網(wǎng)絡(luò)架構(gòu)和高效的編譯器、運(yùn)行時(shí)。這樣就把設(shè)計(jì)空間擴(kuò)展到比以往單純的模型搜索或推理庫、編譯器優(yōu)化更大。MCUNet 框架有兩個(gè)主要組件第一是 TinyNAS搜索能適配目標(biāo)硬件的神經(jīng)架構(gòu)比如我們今天反復(fù)提到的微控制器第二是 TinyEngine它編譯搜索得到的模型并在目標(biāo)設(shè)備上高效執(zhí)行。兩個(gè)組件互相反饋可以迭代得越來越好。TinyNAS 在評(píng)估候選架構(gòu)時(shí)通常使用真實(shí)的系統(tǒng)約束TinyEngine 則圍繞最終網(wǎng)絡(luò)用到的算子和內(nèi)存訪問模式做優(yōu)化。4.2 TinyNAS: Search Space Design本講我們主要關(guān)注 TinyNAS 和神經(jīng)網(wǎng)絡(luò)的自動(dòng)化設(shè)計(jì)推理引擎會(huì)在后面的講座里討論。TinyNAS 建立在我們已經(jīng)很熟悉的神經(jīng)架構(gòu)搜索之上。人工設(shè)計(jì)架構(gòu)嚴(yán)重依賴人類專業(yè)知識(shí)而 NAS 會(huì)用機(jī)器學(xué)習(xí)和計(jì)算以更高效的方式探索不同候選。一個(gè)重要的問題是搜索應(yīng)該在哪里進(jìn)行或者說TinyML 的搜索空間是什么這張圖說明搜索空間的質(zhì)量在很大程度上決定了最終網(wǎng)絡(luò)的質(zhì)量。比如你的搜索空間不好即使有很強(qiáng)的神經(jīng)架構(gòu)搜索算法也找不到足夠好、令人滿意的結(jié)果。那如果我們有好的搜索空間也有好的搜索算法就能為精度和效率找到非常好的最終網(wǎng)絡(luò)。簡(jiǎn)單地復(fù)用移動(dòng)網(wǎng)絡(luò)的搜索空間對(duì) TinyML 是行不通的因?yàn)橘Y源約束差別非常大手機(jī)上幾 GB 和微控制器上幾百 KB 之間的鴻溝會(huì)讓整個(gè)情形完全不同。甚至最小的移動(dòng)網(wǎng)絡(luò)也無法在微控制器上運(yùn)行因?yàn)樗膮?shù)太多、激活值太大塞不進(jìn)微控制器的設(shè)備內(nèi)存。所以我們需要選擇不同的搜索空間專門為微控制器、為 IoT 設(shè)備設(shè)計(jì)。挑戰(zhàn)在于如何縮放架構(gòu)讓空間里包含足夠有能力的模型能夠滿足 SRAM 和 flash 約束。對(duì)于 MobileNet 這類模型家族兩個(gè)有用的縮放維度是輸入分辨率和寬度乘子這里用 R 和 W 表示。R 表示分辨率比如輸入是 224×224R 就是 224。W 是施加在模型通道數(shù)上的乘子W 越大可以想象模型的寬度、通道數(shù)就越大。對(duì)于智能手機(jī)典型的起點(diǎn)是 R 224、W 1.0。同一個(gè)架構(gòu)家族可以放大到更強(qiáng)的硬件比如云端 GPU那里分辨率更大、寬度乘子也更大。而對(duì)于微控制器我們要往相反方向縮放因?yàn)橄MP透?、更容易塞進(jìn)設(shè)備內(nèi)存。不同設(shè)備提供的 SRAM 和 flash 約束不同所以微控制器的神經(jīng)架構(gòu)設(shè)計(jì)沒有簡(jiǎn)單的“最優(yōu)解”。TinyNAS 會(huì)針對(duì)每個(gè)硬件預(yù)算獨(dú)立選擇這些取值。這引出了兩階段流程首先在目標(biāo)內(nèi)存和存儲(chǔ)約束下優(yōu)化、設(shè)計(jì)搜索空間然后在特定的搜索空間里搜索出最好的單個(gè)網(wǎng)絡(luò)。第一階段通常選擇較粗的縮放變量比如前面討論的分辨率和寬度乘子搜索空間縮小之后第二階段搜索細(xì)節(jié)架構(gòu)比如不同的卷積核大小、不同的擴(kuò)展比以及每個(gè)階段的 block 數(shù)量。這就是在給定分辨率和寬度乘子下進(jìn)行模型架構(gòu)設(shè)計(jì)。這里有一個(gè)有意思的觀察在相同內(nèi)存約束下我們希望模型有更多的 FLOPs—FLOPs 越大模型容量越大也更有可能取得更高精度。圖中這些曲線分別對(duì)應(yīng)不同的搜索空間但都處在相同的內(nèi)存約束下如果搜索空間好我們就能有更大的 FLOPs也能有更高的精度而搜索空間不好時(shí)平均 FLOPs 會(huì)低得多精度也會(huì)比好的設(shè)計(jì)低得多。這張網(wǎng)格圖展示了不同設(shè)計(jì)選擇之間的另一個(gè)關(guān)系。可以看到如果 SRAM 大小相同、flash 更大我們就能有更多參數(shù)因?yàn)槟P涂梢愿笕绻?flash 大小相同、增大 SRAM就意味著可以有更寬的激活通道模型容量更大??偨Y(jié)一下如圖中所示如果 SRAM 固定分辨率可能需要降低以補(bǔ)償更寬的激活值SRAM 更大則允許更大的激活圖所以分辨率可以提高而寬度仍然大致受不變的 flash 容量約束。如果搜索空間已經(jīng)確定TinyNAS 會(huì)使用帶權(quán)重共享的 once-for-all NAS訓(xùn)練一個(gè)超網(wǎng)絡(luò)采樣不同的子網(wǎng)再一起微調(diào)。較小的子網(wǎng)絡(luò)嵌套在較大的子網(wǎng)絡(luò)中所以一次訓(xùn)練過程就能得到許多硬件專用的網(wǎng)絡(luò)。比如設(shè)備內(nèi)存較小就選較小的子網(wǎng)部署片上內(nèi)存更多就可以用更大、參數(shù)更多的網(wǎng)絡(luò)。所有這些網(wǎng)絡(luò)都能在同一個(gè)超網(wǎng)絡(luò)中一次性訓(xùn)練完成。這是不同子網(wǎng)嵌套在超網(wǎng)絡(luò)中的演示。與 MobileNetV2 的對(duì)比很能說明問題MobileNetV2 的峰值激活內(nèi)存可能達(dá)到平均值的兩倍而 TinyNAS 里這個(gè)差距小得多各層的峰值內(nèi)存更均勻—因?yàn)樗阉鞒龅木W(wǎng)絡(luò)通常會(huì)在不同 block 之間更均勻地使用內(nèi)存。這正是我們想要的因?yàn)槿绻逯祪?nèi)存遠(yuǎn)大于平均值就意味著大多數(shù)層沒有充分利用設(shè)備內(nèi)存。而如果分布更均勻每一層都能最大化利用設(shè)備內(nèi)存模型容量更大、精度更好。結(jié)果TinyNAS 取得了更好的精度-效率權(quán)衡。在VWW—視覺喚醒詞—數(shù)據(jù)集上任務(wù)就是檢測(cè)給定圖像里有沒有人MCUNet 相比人工設(shè)計(jì)和早期 NAS 模型在精度高得多的同時(shí)峰值 SRAM 顯著更少、實(shí)測(cè)延遲更低。4.3 Patch-based Inference現(xiàn)在我們更仔細(xì)地回顧激活內(nèi)存SRAM 使用量逐層變化所以正如之前所說決定網(wǎng)絡(luò)能否跑起來的是峰值而不是平均值。比如這張圖里峰值內(nèi)存大約有 1300 KB塞不進(jìn)只有 250 KB 或 320 KB 的微控制器。這個(gè)峰值對(duì)本地部署來說太大了。而到了后面的層SRAM 占用就遠(yuǎn)低于某些微控制器 256 KB 的約束了。那問題是能不能降低前幾層的峰值內(nèi)存從而把更強(qiáng)的模型塞進(jìn)微控制器解決方案就是我們針對(duì)早期層超大內(nèi)存消耗所做的這兩項(xiàng)優(yōu)化。在傳統(tǒng)卷積中我們用逐層推理即基于給定輸入計(jì)算完整的輸出。比如給定很大的輸入特征圖你需要在每個(gè)位置應(yīng)用卷積核得到一個(gè)很大的輸出特征圖。不過根據(jù)卷積的特性我們可以一塊一塊地patch by patch做卷積計(jì)算?;?patch 的推理改變了調(diào)度方式把大的激活值切分成更小的部分讓一個(gè) patch 先穿過前幾層再處理下一個(gè) patch。結(jié)果就是每次卷積推理時(shí)—尤其是早期層—我們只處理原特征圖的一部分所以峰值激活小得多。比如這張圖里我們把峰值激活降到了原來的約 1/4。再回頭看之前的柱狀圖用了 patch 推理后峰值內(nèi)存大幅下降可以塞進(jìn) 256 KB 的約束。我們還可以選擇不同的 patch 大小也就是把原始輸入特征圖切成多少塊并優(yōu)化這個(gè)參數(shù)讓模型能塞進(jìn)目標(biāo)內(nèi)存約束。同樣的思路也適用于不同網(wǎng)絡(luò)架構(gòu)。這些是在 STM32F746 微控制器上測(cè)得的一些峰值 SRAM 使用量。Q AQ把輸入特征圖切成不同的 patch 或塊會(huì)增加整體推理延遲嗎A對(duì)于如今的大規(guī)模云端 GPU這種操作肯定會(huì)引入大量開銷原來每層卷積只做一次前向現(xiàn)在要按 patch 數(shù)做很多次還可能有額外的冗余計(jì)算。但對(duì)微控制器來說設(shè)備受峰值內(nèi)存和算力的嚴(yán)格約束這類額外的控制開銷相對(duì)原始推理時(shí)間不算什么最大的問題反而是它引入的額外計(jì)算我們后面會(huì)討論如何解決。這一頁最重要的信息是原本無法在本地微控制器上運(yùn)行的模型現(xiàn)在因?yàn)榉逯祪?nèi)存降到了設(shè)備約束以下就能運(yùn)行了。我們回來繼續(xù)講。之前介紹的那款商用微控制器有 320 KB 片上 SRAM。原來的逐層推理會(huì)產(chǎn)生大約 315 KB 的峰值已經(jīng)非常接近硬性上限。即使是縮小后的 MobileNetV2—我們同時(shí)降低了分辨率和寬度—把輸入按 2×2 切 patch 來做推理也能大幅降低最大 SRAM 使用量為推理留出更多空間。Q AQpatch 推理時(shí)輸出激活是怎么處理的多個(gè) patch 的結(jié)果在哪里合并A這是個(gè)很好的問題。做 patch 推理時(shí)我們不僅把輸入激活切成不同的 patch也同時(shí)切分輸出激活因?yàn)樵谧鼍矸e時(shí)如果只對(duì)左上角那塊做卷積輸出特征圖也只有原來的四分之一。但在幾層之后因?yàn)?CNN 中有下采樣特征圖的尺寸會(huì)遠(yuǎn)小于原始尺寸。一旦特征圖足夠小我們就可以保留這個(gè) patch 的輸出開始下一個(gè) patch 的推理。聚合只發(fā)生在幾層之后的輸出層因?yàn)槟菚r(shí)特征圖已經(jīng)足夠小這樣輸入和輸出尺寸都能減小。對(duì)不同模型在卷積中應(yīng)用逐 patch 推理都能帶來一致的內(nèi)存節(jié)省尤其是在輸入激活圖非常大的前幾層。4.4 The Halo Problem and Receptive-Field Redistribution這里還有一個(gè) patch 推理的問題我們稱之為 halo光環(huán)問題。如果按 2×2 切 patch只輸入左上角那四分之一就會(huì)漏掉邊界上的一些元素原始卷積層—比如對(duì)于這個(gè)輸出元素假設(shè)有 3×3 卷積核—實(shí)際上會(huì)用上一些當(dāng)前 patch 中不存在的元素這就引入了 halo 問題。而且隨著傳播到更多層卷積的感受野會(huì)大得多所需的 halo 更寬重復(fù)的卷積計(jì)算量也會(huì)逐層增加。比如假設(shè)卷積核是 3×3要迭代三層每層 halo 會(huì)在每條邊上向外擴(kuò)一個(gè)元素三層之后特征圖的寬和高都會(huì)比原始尺寸大 6。這類問題會(huì)引入大量冗余計(jì)算因?yàn)橐?patch 推理時(shí)我們不想改變最終輸出不想犧牲正確性或精度所以必須考慮第一層輸入激活中所有這些感受野。因此把原始特征圖切成不同塊時(shí)不同 patch 之間會(huì)有重疊。如果層數(shù)太多感受野可能非常大甚至與原始特征圖相當(dāng)這不是我們想要的因?yàn)闀?huì)引入大量冗余計(jì)算。halo 區(qū)域里的元素會(huì)在覆蓋它的所有 patch 中被計(jì)算多次。所以我們?cè)?MCUNetV2 中引入了另一種優(yōu)化用來重新分配感受野。標(biāo)準(zhǔn) MobileNet V2 架構(gòu)里有很多 3×3 卷積塊—這是 MobileNet 的卷積塊可以把它理解為一個(gè)卷積子網(wǎng)絡(luò)。核大小為 3×3 時(shí)可以想象隨著推理層數(shù)增加感受野會(huì)變得很大。而在 MCUNetV2 中我們重新分配了這種感受野早期層多用 1×1 逐點(diǎn)卷積、少用 3×3 空間卷積包括深度卷積這樣模型早期層的感受野不會(huì)增長(zhǎng)太快而在后面的層我們做更多的空間卷積來增大感受野。因?yàn)槟抢飯D像大小、激活大小已經(jīng)很小可以引入更大的卷積核并且可以用逐層推理代替 patch 推理就不會(huì)有冗余計(jì)算問題同時(shí)也補(bǔ)償了前幾層減少的感受野。這種在前幾層減小感受野、在后面層補(bǔ)償?shù)脑O(shè)計(jì)能在保持精度的同時(shí)讓 patch 推理的額外開銷小到可以忽略。最后這兩個(gè)方法—神經(jīng)架構(gòu)和推理調(diào)度—是聯(lián)合搜索的。架構(gòu)搜索的選項(xiàng)包括深度、寬度、卷積核大小等很多設(shè)計(jì)空間調(diào)度則包括 patch 的數(shù)量以及前多少層使用 patch 推理。TinyEngine 會(huì)貢獻(xiàn)額外的系統(tǒng)級(jí)選擇讓推理更高效并且無需太多人工工程開銷就能適配微控制器。4.5 MCUNetV2 Results and Insights剛才我們講了 MCUNetV2 中的優(yōu)化技術(shù)比如 patch 推理也簡(jiǎn)單提到了推理優(yōu)化和推理引擎用于把模型部署到微控制器上?,F(xiàn)在來看 MCUNetV2 的一些實(shí)際應(yīng)用。首先這張圖展示了 MCUNetV2 把內(nèi)存需求降低了大約 30 KB同時(shí)保持 90% 的精度。在固定精度下由于前面講的優(yōu)化它的 SRAM 用量大約只有第一代 MCUNet 的 1/4。這種改進(jìn)不僅限于 VWW 這樣的行人檢測(cè)數(shù)據(jù)集也提升了在 SRAM 非常有限的設(shè)備比如前面說的 256 KB 片上內(nèi)存上的 ImageNet 分類在同樣約束下還在 Pascal VOC 目標(biāo)檢測(cè)上帶來更大收益。我們可以檢視搜索出來的 MCUNetV2 架構(gòu)理解自動(dòng)神經(jīng)架構(gòu)搜索做出的設(shè)計(jì)決策。早期層使用基于 patch 的推理因?yàn)檩斎雸D很大后面的層回到普通的逐層執(zhí)行因?yàn)樘卣鲌D已經(jīng)足夠小不需要再切成 patch。在早期的 patch 階段搜索選擇了不同的、更小的核尤其是 1×1 卷積和深度卷積核來減小感受野增長(zhǎng)從而減少前面提到的 halo 問題帶來的重復(fù)計(jì)算。這也證明了推理與模型架構(gòu)協(xié)同設(shè)計(jì)的有效性我們知道推理瓶頸是 SRAM 的峰值內(nèi)存所以引入 patch 推理而 patch 推理有冗余計(jì)算、感受野增大的挑戰(zhàn)所以我們?cè)谠缙趯右敫〉木矸e核讓整個(gè)優(yōu)化循環(huán)不斷演進(jìn)為特定應(yīng)用產(chǎn)出更好的模型架構(gòu)和推理引擎。在中間階段擴(kuò)展比保持得很小空間分辨率仍然可觀所以在這里激進(jìn)的擴(kuò)展通道會(huì)重新造成巨大的內(nèi)存峰值。層名里的 MB4 就表示擴(kuò)展比很小。在后面的階段分辨率已經(jīng)通過大量下采樣大幅降低所以網(wǎng)絡(luò)可以使用更大的擴(kuò)展比有更多通道來提升模型容量從而帶來更多計(jì)算量和更好的精度而不會(huì)超出 SRAM 預(yù)算。由于引入了 patch 推理我們還能使用更大的輸入分辨率而不撞上內(nèi)存墻。這對(duì)分辨率敏感的任務(wù)很重要比如前面提到的 VWW在低分辨率下如果遠(yuǎn)處有人人可能非常小低分辨率圖像會(huì)損害模型檢測(cè)遠(yuǎn)處行人的性能。MCUNetV2 使用 160×160 的輸入而不是 128×128—后者是之前 MobileNet 版本的配置。所以 patch 推理讓我們能用更高的輸入分辨率帶來更好的模型性能。5. Applications現(xiàn)在我們已經(jīng)講完了 MCUNetV2 的主要設(shè)計(jì)和主要技術(shù)。接下來看看不同的應(yīng)用。我們先講一些視覺應(yīng)用然后講 TinyML 中非常重要的音頻場(chǎng)景最后講時(shí)間序列尤其是異常檢測(cè)。5.1 Tiny Vision在早期的微控制器演示中我們通常分類簡(jiǎn)單的物體比如蘋果、香蕉、橙子等等。而物體的顏色能提供很多信息是分類的強(qiáng)信號(hào)。比如看到紅色的東西它更可能是蘋果而不是香蕉或橙子。有了 MCUNet我們可以超越這些玩具例子在商用微控制器上跑真正 ImageNet 級(jí)別的分類。想象一下我們現(xiàn)在能在極小的微控制器上做 ImageNet 級(jí)分類—再次強(qiáng)調(diào)這個(gè)設(shè)備的片上內(nèi)存只有幾百 KB、總存儲(chǔ)只有 1 MB。在這項(xiàng)對(duì)比中MCUNet 是第一個(gè)在商用微控制器上實(shí)現(xiàn)超過 70% ImageNet top-1 精度的系統(tǒng)。不同設(shè)備的 SRAM 和 flash 限制不同所以我們?cè)?MCUNet 中使用的 once-for-all 訓(xùn)練策略可以一次訓(xùn)練、特化出不同的子網(wǎng)絡(luò)部署到不同目標(biāo)約束、不同類型的商用微控制器上。這里是針對(duì) VWW 基準(zhǔn)的實(shí)際微型視覺任務(wù)檢測(cè)是否有人在場(chǎng)。它相當(dāng)于語音喚醒詞的視覺版本。一個(gè)小的始終在線模型可以持續(xù)監(jiān)測(cè)畫面里是否有人進(jìn)入檢測(cè)區(qū)域而不用昂貴的、始終運(yùn)行的人臉識(shí)別模型這樣就能讓模型一直在微控制器上運(yùn)行而不會(huì)過快耗光設(shè)備電量同時(shí)節(jié)省能耗、降低設(shè)備成本也有助于保護(hù)隱私。這是微控制器上的演示畫面里是 MIT 36 號(hào)樓或 38 號(hào)樓的電梯—有人時(shí)亮紅燈人走了就亮綠燈。目標(biāo)檢測(cè)是另一類應(yīng)用相比分類任務(wù)它對(duì)輸入分辨率更敏感因?yàn)樾枰龀砻艿目臻g預(yù)測(cè)。降低分辨率會(huì)嚴(yán)重?fù)p害檢測(cè)精度正如圖中所示分辨率越低精度越低。我們的 patch 推理技術(shù)打破了激活內(nèi)存瓶頸讓微控制器能處理大得多的輸入從而在目標(biāo)檢測(cè)任務(wù)上獲得更好的精度。這是口罩檢測(cè)的演示戴口罩的人畫綠框不戴口罩的畫紅框。這是疫情期間一個(gè)很有意思的演示。右邊還有行人檢測(cè)演示會(huì)用框把攝像頭中的人框出來。定量結(jié)果說明了分辨率為什么重要與基線相比基于 patch 的推理找回了漏檢的人并減少了若干誤檢??梢钥吹絻蓚€(gè)例子里MCUNet 在高分辨率下檢測(cè)得更好模型在同樣的 SRAM 預(yù)算內(nèi)看到了更多細(xì)節(jié)??醋筮呥@個(gè)人因?yàn)榉直媛实蜎]有被模型檢測(cè)到而這個(gè)檢測(cè)就好得多。此外我們甚至可以在同樣的內(nèi)存預(yù)算下做訓(xùn)練或微調(diào)而不只是在微控制器上做推理。想象一下現(xiàn)在我們用 256 KB 內(nèi)存訓(xùn)練一個(gè)模型。這個(gè)例子里我們有一個(gè)微控制器和一個(gè)圖像分類模型用微控制器拍攝不同物體的幾張照片訓(xùn)練之后模型就能區(qū)分兩種不同物體—橙子和香蕉。采集過程中紅色代表香蕉、綠色代表橙子。經(jīng)過若干訓(xùn)練樣本、若干微調(diào)樣本后把攝像頭對(duì)著香蕉屏幕會(huì)顯示這是香蕉并亮紅燈如果是橙子就顯示綠色。微型視覺的例子就講到這里。我們講了分類、目標(biāo)檢測(cè)甚至端側(cè)訓(xùn)練等不同應(yīng)用。5.2 Tiny Audio接下來講 TinyML 音頻和關(guān)鍵詞識(shí)別應(yīng)用。音頻是 TinyML 另一個(gè)非常重要的工作負(fù)載應(yīng)用包括關(guān)鍵詞識(shí)別、語音識(shí)別和噪聲消除。這些任務(wù)受益于始終在線、低功耗的處理不需要持續(xù)把麥克風(fēng)數(shù)據(jù)發(fā)到云端你還能獲得更好的隱私。關(guān)鍵詞識(shí)別流水線會(huì)把波形切成重疊的幀再把每一幀變換成頻域特征。這里有語音波形切成不同幀后轉(zhuǎn)成頻譜圖。這個(gè)頻譜圖會(huì)輸入到某個(gè)模型中神經(jīng)網(wǎng)絡(luò)就可以預(yù)測(cè)不同關(guān)鍵詞的概率比如 yes、no、on、off 等等。全連接 DNN 會(huì)忽略這種時(shí)頻表示中的局部結(jié)構(gòu)而卷積神經(jīng)網(wǎng)絡(luò)能利用相鄰時(shí)間幀、相鄰頻率之間的相關(guān)性還能處理不同說話風(fēng)格帶來的小幅偏移。所以在相近的計(jì)算預(yù)算下CNN 在這類關(guān)鍵詞識(shí)別任務(wù)上比傳統(tǒng) DNN 效果好得多。MCUNet 進(jìn)一步把同樣的硬件感知約束和協(xié)同設(shè)計(jì)理念推廣到語音命令領(lǐng)域在搜索中引入真實(shí)的硬件刻畫從而在關(guān)鍵詞識(shí)別任務(wù)中在精度、效率和模型大小之間找到更好的權(quán)衡。相比 MobileNetV2 等現(xiàn)有網(wǎng)絡(luò)我們精度更好、延遲更小。5.3 Tiny Time Series and Anomaly Detection最后我們來看 TinyML 在時(shí)間序列分析和異常檢測(cè)中的應(yīng)用。異常檢測(cè)在很多應(yīng)用中非常重要尤其是制造業(yè)質(zhì)檢我們也把它用于健康監(jiān)測(cè)、欺詐或攻擊檢測(cè)。目標(biāo)是學(xué)習(xí)正常數(shù)據(jù)的模式把偏離已學(xué)習(xí)模式的輸入標(biāo)記出來這樣當(dāng)模型收到異常的輸入時(shí)就能發(fā)出警告。這里簡(jiǎn)要介紹自編碼器它包含編碼器和解碼器。編碼器把高維輸入壓縮成低維的潛在表示解碼器再從這個(gè)潛在表示重建出輸出輸出應(yīng)該與原始輸入非常相似—這就是自編碼器的目標(biāo)。借助這個(gè)信息瓶頸我們可以訓(xùn)練出一個(gè)非常有用的編碼器來壓縮、編碼原始輸入。訓(xùn)練時(shí)我們最小化正常樣本上的重建誤差。推理時(shí)正常輸入能很好地重建而異常輸入會(huì)產(chǎn)生很大的誤差我們就可以用這個(gè)誤差做異常檢測(cè)。自編碼器如今也被廣泛用于不同的領(lǐng)域比如圖像生成、視覺語言模型我們會(huì)在后面的講座中討論。這里我們主要討論它在異常檢測(cè)中的應(yīng)用。它對(duì)這個(gè)任務(wù)有兩個(gè)有用的性質(zhì)。首先訓(xùn)練可以是無監(jiān)督的因?yàn)槲覀儾恍枰肴魏萎惓颖?、異常?biāo)簽—有時(shí)異常樣本的標(biāo)簽比正常樣本難獲得得多。這個(gè)例子里我們主要在正常樣本上訓(xùn)練自編碼器學(xué)到一個(gè)特定于正常訓(xùn)練分布的表征。最后我們用它在評(píng)估任務(wù)上做重建如果有不正常的樣本最終輸出會(huì)有很大差異于是我們就能報(bào)告異常。這里是運(yùn)轉(zhuǎn)風(fēng)扇異常檢測(cè)的演示。這是微控制器風(fēng)扇正在運(yùn)轉(zhuǎn)。如果用螺絲刀去干擾風(fēng)扇這里就會(huì)亮起黃色的警告燈把螺絲刀拿走黃燈就熄滅。搖晃風(fēng)扇時(shí)警告燈也會(huì)亮起?,F(xiàn)在警告燈是亮的因?yàn)轱L(fēng)扇在晃。它會(huì)熄滅—現(xiàn)在滅了因?yàn)樗謴?fù)正常狀態(tài)了。6. Summary今天的課差不多就到這里??偨Y(jié)一下我們把深度學(xué)習(xí)帶到了資源極其受限的設(shè)備上這里有很多約束比如計(jì)算約束和內(nèi)存約束。今天的課我們主要討論如何壓縮和部署模型到非常有限的片上內(nèi)存中比如微控制器的 250 KB SRAM。我們還講了 MCUNet 的系統(tǒng)-算法協(xié)同設(shè)計(jì)以及 MCUNetV2 的基于 patch 的推理。這些技術(shù)讓實(shí)用的視覺、音頻和異常檢測(cè)應(yīng)用可以直接跑在微控制器上。你可以讓始終在線的微控制器在日常生活中承擔(dān)各種監(jiān)測(cè)任務(wù)。結(jié)語第十講把前面所有的武器—量化、剪枝、NAS、蒸餾—收攏成一個(gè)完整的案例MCUNet。它先回答了為什么要 TinyML云端 AI 有通信延遲、成本和隱私問題手機(jī)雖然能本地推理但仍有數(shù) GB 內(nèi)存而微控制器只有約 300 KB SRAM 和 1 MB flash—激活內(nèi)存只有前者的約 1/13,000、存儲(chǔ)約 1/100,000。更麻煩的是這兩個(gè)預(yù)算要同時(shí)滿足激活值放在 SRAM、權(quán)重放在 flash任何一邊溢出模型就根本跑不起來。這一講還用數(shù)據(jù)戳破了一個(gè)幻覺MobileNet V2 雖然是為移動(dòng)端優(yōu)化的參數(shù)量比 ResNet-18 小得多峰值激活卻反而略大其峰值 SRAM 甚至可能是片上預(yù)算的 22 倍。于是問題被定義得很清楚既要更小的權(quán)重又要更低的峰值激活。MCUNet 的答案是算法-系統(tǒng)協(xié)同設(shè)計(jì)TinyNAS 負(fù)責(zé)搜架構(gòu)、TinyEngine 負(fù)責(zé)編譯與執(zhí)行兩者互相反饋。TinyNAS 先解決在哪搜—直接把移動(dòng)端的搜索空間搬過來是不行的得為微控制器重新設(shè)計(jì)它用分辨率 R 和寬度乘子 W 做粗縮放兩階段地從粗到細(xì)搜索而判斷空間好壞的標(biāo)準(zhǔn)很漂亮相同內(nèi)存約束下 FLOPs 越大模型容量和精度越可能高。再配上 once-for-all 的權(quán)重共享一次訓(xùn)練就能給不同 SRAM/flash 預(yù)算切出嵌套子網(wǎng)而且搜出來的網(wǎng)絡(luò)在各 block 間的峰值內(nèi)存更均勻把設(shè)備內(nèi)存用滿。MCUNetV2 則盯住了新的瓶頸—前幾層的峰值激活patch 推理把大特征圖切塊、逐塊穿過早期層峰值激活降到約 1/4256 KB 的內(nèi)存終于放得下代價(jià)是 halo 問題—patch 之間要重疊、感受野逐層增長(zhǎng)會(huì)帶來重復(fù)計(jì)算于是又反過來調(diào)整架構(gòu)早期層改用更小的 1×1 與深度卷積把感受野的補(bǔ)償留到分辨率已經(jīng)降下來的后層。架構(gòu)與調(diào)度聯(lián)合搜索之后同等精度下 SRAM 用量只有原來的約 1/4還能把輸入分辨率提到 160×160。這些技術(shù)讓微控制器真正有了實(shí)用價(jià)值第一個(gè)在商用 MCU 上把 ImageNet top-1 做到 70% 以上的系統(tǒng)VWW 可以一直在線地檢測(cè)有沒有人電梯里有人亮紅燈、無人亮綠燈的演示都安排上了目標(biāo)檢測(cè)對(duì)分辨率敏感patch 推理恰好找回了低分辨率下漏檢的行人甚至還能在 256 KB 內(nèi)存上做端側(cè)訓(xùn)練拍幾張照片就能分清橙子和香蕉。音頻側(cè)的關(guān)鍵詞識(shí)別把波形切幀、轉(zhuǎn)成頻譜圖再喂給 CNNMCUNet 把硬件刻畫帶進(jìn)搜索精度更好、延遲更小時(shí)間序列側(cè)則用自編碼器做無監(jiān)督異常檢測(cè)—正常樣本重建誤差小、異常樣本誤差大風(fēng)扇被螺絲刀一干擾就亮起黃燈?;剡^頭看這一講像一次收網(wǎng)剪枝、量化、NAS、蒸餾各自解決一個(gè)維度而只有把它們放進(jìn)同一個(gè)協(xié)同設(shè)計(jì)的循環(huán)幾百 KB 的芯片才真正裝得下智能。下一講我們將講解 TinyEngine 和并行處理 。參考https://hanlab.mit.edu/courses/2026-fall-65940https://www.youtube.com/playlist?listPLH7PIPKvCm38