在MCU上運(yùn)用機(jī)器學(xué)習(xí)實(shí)現(xiàn)輕智能
Enable light intelligence by using machine learning on MCUs
本文引用地址:http://m.butianyuan.cn/article/201904/400009.htm作者/宋巖 恩智浦(中國)管理有限公司 MCU高級(jí)系統(tǒng)工程師 (北 京 100022)
摘要:簡要探討了人工智能的主要實(shí)現(xiàn)方式——機(jī)器學(xué)習(xí),尤其是深度學(xué)習(xí)應(yīng)用于MCU的可行性與特點(diǎn)。結(jié)合自己的實(shí)踐,介紹了在這類資源受限的平臺(tái)上建模的要點(diǎn)、工作流程、配套工具、優(yōu)化方法,以及實(shí)踐的例子。筆者認(rèn)為,在智能物聯(lián)時(shí)代,也就是AIoT時(shí)代的蓬勃發(fā)展下,機(jī)器學(xué)習(xí)與MCU都在飛速發(fā)展,它們的有機(jī)結(jié)合會(huì)與日俱增,大放異彩。
關(guān)鍵詞:MCU;機(jī)器學(xué)習(xí);邊緣;智能
雖然在現(xiàn)今的生產(chǎn)生活中,以機(jī)器學(xué)習(xí)和深度學(xué)習(xí)為主力的人工智能應(yīng)用已無處不在,但是承載的計(jì)算平臺(tái)絕大多數(shù)是具備加速器的服務(wù)器、PC,以及智能手機(jī),而在微控制器(MCU)等級(jí)的平臺(tái)上的運(yùn)用卻寥寥無幾。究其原因,傳統(tǒng)MCU的定位使其在算力和存儲(chǔ)資源上捉襟見肘,硬件的限制也導(dǎo)致應(yīng)用深度學(xué)習(xí)所需的配套軟件和工具幾近為0。
但近年來MCU的資源有著突飛猛進(jìn)地發(fā)展,有代表性的是NXP的i.MX RT1060系列,使用高達(dá)600 MHz并且?guī)SP擴(kuò)展的Cortex-M7內(nèi)核,理論整數(shù)算力已達(dá)1.2 GOPS;片內(nèi)有1 MB快速內(nèi)存并且可擴(kuò)展,已能勝任相當(dāng)多的機(jī)器學(xué)習(xí)應(yīng)用。
同時(shí),由于MCU具有價(jià)格低,實(shí)時(shí)性強(qiáng)等自身的特點(diǎn),基于MCU的機(jī)器學(xué)習(xí)也要與MCU的應(yīng)用結(jié)合才能相得益彰,一般來說,“輕”是最顯著的特征。在這樣的背景下,筆者摸索和實(shí)踐了在MCU上如何應(yīng)用深度學(xué)習(xí),撰文以分享和總結(jié)相關(guān)的工作。
1 在MCU上部署機(jī)器學(xué)習(xí)
1.1 物聯(lián)網(wǎng)環(huán)境下的智能應(yīng)用分布
在智能物聯(lián)環(huán)境下,嵌入式系統(tǒng)一般位于網(wǎng)絡(luò)的邊緣,因此在嵌入式系統(tǒng)中的智能也常常被稱為邊緣輕智能。不過,嵌入式系統(tǒng)也是一個(gè)很寬泛的概念,其智能應(yīng)用在邊緣上的分布也各有特色,如圖1所示。
最邊緣的是IoT節(jié)點(diǎn)與離線節(jié)點(diǎn)——也就是傳統(tǒng)的嵌入式系統(tǒng),它們通常使用MCU、DSP以及低功耗的MPU,運(yùn)行最輕量級(jí)的智能模型,可以永遠(yuǎn)在線。如果位于更復(fù)雜系統(tǒng)的前級(jí)處理,則完成初步的計(jì)算,視情況決定是否喚醒主系統(tǒng)。
另一類可稱為富功能節(jié)點(diǎn)與邊緣門戶,它們使用更加強(qiáng)勁的處理器,或者是帶機(jī)器學(xué)習(xí)IP的MCU,能運(yùn)行更加大型的模型,并常常作為IoT網(wǎng)關(guān)。對(duì)于復(fù)雜度很高的問題,比如語音識(shí)別,仍然能調(diào)用云端服務(wù)來完成。
近年來,以i.MX RT (600 MHz) 和STM32H7 (400MHz)等為代表的高配置MCU逐漸豐富,模糊了節(jié)點(diǎn)與門戶的界限,使得產(chǎn)品設(shè)計(jì)得以更加一脈相承,并且能讓開發(fā)者以MCU簡單易用的方式上手。
1.2 MCU上機(jī)器學(xué)習(xí)應(yīng)用的特點(diǎn)
MCU強(qiáng)調(diào)降低功耗、節(jié)約成本、加快上市,以及實(shí)時(shí)響應(yīng)。所以在MCU上一般都要精簡AI模型,在精度與算力上合理取舍,改進(jìn)已有算法的性能。在一些分級(jí)響應(yīng)的大型系統(tǒng)中,可以發(fā)揮MCU低功耗的優(yōu)勢,在本地跑輕量級(jí)的AI模型,擔(dān)任永遠(yuǎn)在線的前級(jí)處理。例如 ,語音識(shí)別系統(tǒng)的喚醒詞檢測就可以由MCU來完成。又如,物體識(shí)別系統(tǒng)可以先由MCU快速處理,遇到識(shí)別困難時(shí)再喚醒主系統(tǒng)來判定。
下面列舉了一些適合MCU上部署的AI,為嵌入式系統(tǒng)屬性加成的常見場景:
在強(qiáng)化圖像分類性能方面,可用于智能電器、生產(chǎn)線次品檢測、智能家居;
在強(qiáng)化音頻分類性能方面,主要用于識(shí)別口令關(guān)鍵字;在工業(yè)應(yīng)用方面,可改進(jìn)電機(jī)與傳動(dòng)、電源轉(zhuǎn)換,以及自動(dòng)控制算法;MCU上AI還適合做異常檢測,判斷部件損壞、過程穩(wěn)定性、異常情況的發(fā)生。
1.3 MCU上機(jī)器學(xué)習(xí)應(yīng)用的難點(diǎn)
盡管MCU上的AI應(yīng)用有自己的特色,但目前普及率還比較低。首要的難點(diǎn)就是算力弱,較專業(yè)的AI加速器可有成百上千倍的差距。拿AI模型常常需要的乘累加操作性能為例,即使是目前性能最高的MCU,i.MXRT1050/60主頻為600 MHz,其M7內(nèi)核單周期能處理2個(gè)16位整數(shù)乘累加,其int16算力也只有1.2 GOPS,而目前的AI加速器動(dòng)輒就是1 TOPS以上的算力。
因此,我們首先采用先進(jìn)的模型結(jié)構(gòu),并謹(jǐn)慎合理地精簡模型規(guī)模,配合高度優(yōu)化的底層代碼,今后還要結(jié)合器件的特色充分利用異構(gòu)多計(jì)算單元。其次,MCU上缺少建模工具,這方面我們可以借助PC/服務(wù)器上的建模軟件來建模與訓(xùn)練。再次,MCU上缺少集成和部署工具,這方面我們“自己動(dòng)手,豐衣足食”,下文會(huì)詳細(xì)報(bào)告具體的工作。最后,MCU上缺少標(biāo)準(zhǔn)運(yùn)行環(huán)境。這方面,我們通過把模型轉(zhuǎn)換成C代碼以及開發(fā)執(zhí)行引擎的方法來填補(bǔ)空白。
1.4 部署機(jī)器學(xué)習(xí)模型的過程
MCU的弱算力決定了通常不適合訓(xùn)練模型。因此,整個(gè)工作分為在PC端的部分和設(shè)備端的部分(如圖2)。在PC端要完成建模與訓(xùn)練、模型的轉(zhuǎn)換與量化,以及模型部署的上位機(jī)工作,比如把模型與工程合并,以及模型數(shù)據(jù)的下載等。在設(shè)備端則要完成模型部署的下位機(jī)部分,主要是把AI模型與其它模塊對(duì)接,采集模型輸入數(shù)據(jù)并運(yùn)行模型。
這里再詳細(xì)介紹一下模型的部署,這也是連接2個(gè)世界的關(guān)鍵環(huán)節(jié)。對(duì)于在上位機(jī)上訓(xùn)練好的模型,一個(gè)關(guān)鍵的步驟就是轉(zhuǎn)換與量化。這是要根據(jù)目標(biāo)計(jì)算平臺(tái)的硬件和軟件接口,把模型做格式的轉(zhuǎn)換、量化(參數(shù)由浮點(diǎn)轉(zhuǎn)成整數(shù)),并對(duì)接到目標(biāo)平臺(tái)上的NN庫或執(zhí)行引擎的API,生成可以部署的形式,如圖3所示。
主要有兩種方式。
第一種是生成與模型相對(duì)應(yīng)的C/C++代碼,它們包括訓(xùn)練出來的權(quán)重——用數(shù)組表示;模型各層的定義——用宏定義表示;以及模型所執(zhí)行的操作——包裝成一個(gè)函數(shù),由它來把模型操作映射成對(duì)目標(biāo)平臺(tái)NN庫API的調(diào)用。這樣,模型就直接化成了C/C++工程的一部分,一起編譯鏈接到固件中了。這樣做的優(yōu)勢是深度整合,效率高、代碼??;但進(jìn)行模型修改的同時(shí)需要重新生成固件,非常死板,比較適合較單一的系統(tǒng)。
另一種是在目標(biāo)平臺(tái)上運(yùn)行通用的模型執(zhí)行引擎——也叫Inference Engine (IE)。IE接收模型的操作與參數(shù),并調(diào)用目標(biāo)平臺(tái)NN庫中對(duì)應(yīng)的API。而轉(zhuǎn)換工具則把模型的參數(shù)和結(jié)構(gòu)轉(zhuǎn)換成IE能識(shí)別的方式,再由IE來貫徹執(zhí)行模型的操作。這樣,模型化成了一個(gè)文件或者是結(jié)構(gòu)體實(shí)例。系統(tǒng)需要調(diào)用IE并把模型文件作為數(shù)據(jù)送給它,由IE解析和執(zhí)行模型指定的操作。這樣,顯然更加靈活,模塊化。可以存儲(chǔ)多個(gè)模型文件,改模型無需重新生成固件,只是要承擔(dān)IE的資源開銷,在性能與體積上有所舍棄。
無論哪一種,神經(jīng)網(wǎng)絡(luò)底層庫都是關(guān)鍵的一環(huán)。在ARM Cortex-M系列MCU上,CMSIS-NN扮演這個(gè)角色,并且針對(duì)DSP和SIMD指令集高度優(yōu)化,和基線的標(biāo)準(zhǔn)C實(shí)現(xiàn)相比性能提高可達(dá)4.5倍。不過它僅提供了神經(jīng)網(wǎng)絡(luò)操作的API,需要另行生成上層代碼或提供執(zhí)行引擎才能使用,另外對(duì)神經(jīng)網(wǎng)絡(luò)建模方式的支持略有不足。而谷歌的TensorFlow-Lite自帶的NN庫則支持更豐富的神經(jīng)網(wǎng)絡(luò)構(gòu)建塊與連接方式,并且是通用的,但是并沒有針對(duì)Cortex-M優(yōu)化,性能遠(yuǎn)遠(yuǎn)不如CMSIS-NN。
目前筆者實(shí)現(xiàn)了把Keras模型轉(zhuǎn)換成調(diào)用CMSIS-NN的C代碼以及對(duì)應(yīng)的權(quán)重表,得以充分發(fā)揮CMSIS-NN在Cortex-M上高性能的優(yōu)點(diǎn)。把生成的C源文件加入到現(xiàn)有的工程中,即可應(yīng)用深度學(xué)習(xí)。
2 適用于MCU的深度學(xué)習(xí)建模方式
深度學(xué)習(xí)的基礎(chǔ)是構(gòu)建多層神經(jīng)網(wǎng)絡(luò)(NN)。神經(jīng)網(wǎng)絡(luò)作為深度學(xué)習(xí)的基礎(chǔ)技術(shù),模型表達(dá)能力強(qiáng),尤其是善于處理非結(jié)構(gòu)化的多媒體數(shù)據(jù)。對(duì)于開發(fā)者而言,神經(jīng)網(wǎng)絡(luò)相比眾多機(jī)器學(xué)習(xí)算法,需要的數(shù)學(xué)基礎(chǔ)更少,相對(duì)單純,容易掌握。這些最終使軟硬件開發(fā)資源也最為豐富。
搭建適合在MCU端使用的神經(jīng)網(wǎng)絡(luò)非常簡潔,如圖4所示:
一般只需要3種主運(yùn)算和對(duì)主運(yùn)算的3種后加工操作。使用這三種基本構(gòu)建塊并且適當(dāng)處理輸出后,形成神經(jīng)網(wǎng)絡(luò)的一級(jí)運(yùn)算,也稱為一個(gè)層。每個(gè)層就猶如電路中的一個(gè)基本元件,按串聯(lián)、并聯(lián)、混聯(lián)的方式搭建在一起,就能組成強(qiáng)大的神經(jīng)網(wǎng)絡(luò)。此外,在訓(xùn)練模型期間,還會(huì)加入一些輔助運(yùn)算,比如批正則化(batchnormalization)、隨機(jī)丟棄(dropout)等,以提高訓(xùn)練效率。在把模型轉(zhuǎn)換成可供部署的形式時(shí),會(huì)去掉或合并它們。
這其中,普通卷積層(CNN)是最“萬能”的。在設(shè)計(jì)一個(gè)新的模型時(shí),常??梢韵扔萌舾蓚€(gè)卷積層提取特征,如果需要分類,尾部再追加一個(gè)全連接層。如果MCU算力強(qiáng)大或存儲(chǔ)空間不足,可以把CNN拆分成逐通道卷積(DS-CNN)尾隨一個(gè) 1x1 CNN,以在相同參數(shù)下獲取更強(qiáng)的表達(dá)能力,或在相同表達(dá)能力下節(jié)省空間。反之對(duì)于算力較弱的MCU,則可適當(dāng)把CNN替換成全連接層(FC),它們雖然參數(shù)多,但算力需求通常遠(yuǎn)遠(yuǎn)小于CNN。
前面提到的層層堆積的方法,好比是穿糖葫蘆,它只是構(gòu)建神經(jīng)網(wǎng)絡(luò)最常用最簡單的一種,這是微型/小型網(wǎng)絡(luò)的首選,已能應(yīng)對(duì)大部分MCU上深度學(xué)習(xí)問題。如果把直筒結(jié)構(gòu)稍加改造,使某層的輸出還加到后續(xù)幾層后,就可以輕松創(chuàng)建容易訓(xùn)練的更深的網(wǎng)絡(luò),能勝任更復(fù)雜的問題,如人臉識(shí)別,以及分辨上百種以上的種類,像用于MobileNet和MobileFaceNet的反向殘差連接就是典型的實(shí)例。
早期的神經(jīng)網(wǎng)絡(luò)構(gòu)建塊中包含的參數(shù)較多,比如卷積核常用5x5,后面創(chuàng)新的結(jié)構(gòu)常常把單個(gè)構(gòu)建塊化整為零成一個(gè)小型的子網(wǎng)絡(luò),既減少了參數(shù)又改進(jìn)了性能。
盡管神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)很豐富,但整體上看仍然是直筒式的順序處理結(jié)構(gòu)。在搭建較深的神經(jīng)網(wǎng)絡(luò)時(shí),一些片段常常重復(fù)出現(xiàn),于是在設(shè)計(jì)網(wǎng)絡(luò)時(shí)可以像宏定義一般預(yù)制復(fù)合結(jié)構(gòu),再串在一起,這樣可以簡化設(shè)計(jì),并且靈活多用。
基于以上建模方式,我們在NXP i.MX RT1062上實(shí)踐了多種模型,表1列出了典型的幾種。
圖5展開介紹了10項(xiàng)物體分類所使用的NN結(jié)構(gòu)。
它是個(gè)小型直筒式結(jié)構(gòu),串了3個(gè)普通卷積層,以分級(jí)提取出1024個(gè)特征,再用一個(gè)全連接層來分類。卷積層用于從輸入的32x32 RGB圖片中分3次提取出特征來,每過一層都通過池化來減少特征,這體現(xiàn)了從前一層精練更高級(jí)特征的思想。最后的全連接層有十個(gè)輸出,每個(gè)輸出對(duì)應(yīng)了各類物體中每個(gè)特征的重要程度。全連接層的運(yùn)算通過矩陣乘向量的方式呈現(xiàn),最終得到10個(gè)數(shù),決定和每類物體的相似程度。整個(gè)網(wǎng)絡(luò)一共有87.3 k個(gè)參數(shù),對(duì)M7的乘累加算力需求約為13 MOPs。模型使用8位整數(shù)量化,在Cortex-M7上,還需要數(shù)據(jù)搬運(yùn)和8位轉(zhuǎn)16位,在無內(nèi)存訪問怠機(jī)的情況下,理論算力利用率約42%。在理論乘累加算力為1.2 GOPS的i.MX 1060上,按100% CPU時(shí)間全額投入,每次運(yùn)算需要約26 ms。
2.1 借助CNN實(shí)現(xiàn)語音口令檢測
我們再看一下深度學(xué)習(xí)在話音口令關(guān)鍵詞檢測——簡稱KWS中的應(yīng)用。為了重用圖像處理的神經(jīng)網(wǎng)絡(luò)技術(shù),常常先把時(shí)域信號(hào)分割變換成多個(gè)頻譜,再拼接成一個(gè)灰度圖像。鑒于這類圖像經(jīng)常出現(xiàn)比較長的水平線,在應(yīng)用卷積網(wǎng)絡(luò)時(shí)對(duì)卷積核的設(shè)計(jì)一般也采用較扁的矩形而不再是常見的正方形。順便一提,另一種循環(huán)神經(jīng)網(wǎng)絡(luò),簡稱RNN,在處理這種前后聯(lián)系比較豐富的事物時(shí)往往更加得心應(yīng)手,但是目前在MCU上還沒有優(yōu)化支持,而在簡單短口令的檢測上,CNN系建模方案的效率也能媲美RNN。
3 小結(jié)與未來展望
MCU自身的綜合能力和機(jī)器學(xué)習(xí)的優(yōu)化會(huì)不斷升級(jí)。比如廣泛用于MCU的ARM Cortex-M系列內(nèi)核,先后加入了SIMD與DSP擴(kuò)展,半精度浮點(diǎn)數(shù),它們都有助于加速機(jī)器學(xué)習(xí)應(yīng)用和提高效率;最新又發(fā)布的MVE(又稱Helium)技術(shù),加入了128位寬矢量運(yùn)算能力,最高可為機(jī)器學(xué)習(xí)再提速15倍!基于開源RISC-V指令集擴(kuò)展機(jī)器學(xué)習(xí)加速也正在異軍突起。在內(nèi)核周邊,MCU在存儲(chǔ)容量、主頻,以及多種數(shù)據(jù)輸入接口也在不斷升級(jí),這一切為在MCU上部署更多更先進(jìn)的智能應(yīng)用提供堅(jiān)實(shí)的支撐。
在基礎(chǔ)軟件方面,適用于MCU平臺(tái)的機(jī)器學(xué)習(xí)的庫也已經(jīng)歷了從無到有,目前正在從簡陋向完善發(fā)展。比如, CMSIS-NN目前還只支持CNN、DS-CNN、FC層,今后可能會(huì)支持多種RNN;另一方面,支持多種傳統(tǒng)機(jī)器學(xué)習(xí)算法的軟件包也一定正在路上。
在生態(tài)上,MCU上圖像分類、語音口令觸發(fā)、異常檢測這三大應(yīng)用場景的相關(guān)的示例正在不斷豐富,模型轉(zhuǎn)換與部署工具也在不斷完善,今后用戶會(huì)得到越來越多的參考資源與開發(fā)工具。
硬件、軟件和生態(tài)的發(fā)展,使MCU在工業(yè)、控制與物聯(lián)傳感領(lǐng)域中的智能化大顯身手的同時(shí),也會(huì)漸漸勝任更多實(shí)時(shí)圖像處理和語音數(shù)據(jù)智能應(yīng)用。智能物聯(lián)時(shí)代正滾滾而來,在功能安全(safety)與信息安全(security)的保障下,基于機(jī)器學(xué)習(xí)的邊緣輕型智能越發(fā)成為嵌入式系統(tǒng)創(chuàng)造新價(jià)值的關(guān)鍵,而MCU硬件和固件就責(zé)無旁貸地成為了承載智能物聯(lián)應(yīng)用的主力軍。
作者簡介
宋巖 :MCU高級(jí)系統(tǒng)工程師,有近15年MCU與嵌入式系統(tǒng)從業(yè)經(jīng)驗(yàn),近期專注于微控制器在人工智能、機(jī)器視覺以及高級(jí)語言開發(fā)等方面的開發(fā)資源與應(yīng)用。
本文來源于科技期刊《電子產(chǎn)品世界》2019年第5期第頁,歡迎您寫論文時(shí)引用,并注明出處
評(píng)論