新聞中心

EEPW首頁 > 設計應用 > 在MCU上運用機器學習實現(xiàn)輕智能

在MCU上運用機器學習實現(xiàn)輕智能

—— (5月刊)在MCU上運用機器學習實現(xiàn)輕智能
作者:宋巖 時間:2019-04-28 來源:電子產(chǎn)品世界 收藏

  Enable light intelligence by using machine learning on s

本文引用地址:http://butianyuan.cn/article/201904/400009.htm

      作者/宋巖 恩智浦(中國)管理有限公司 高級系統(tǒng)工程師 (北 京  100022)

  摘要:簡要探討了人工的主要實現(xiàn)方式——,尤其是深度學習應用于的可行性與特點。結(jié)合自己的實踐,介紹了在這類資源受限的平臺上建模的要點、工作流程、配套工具、優(yōu)化方法,以及實踐的例子。筆者認為,在物聯(lián)時代,也就是AIoT時代的蓬勃發(fā)展下,與MCU都在飛速發(fā)展,它們的有機結(jié)合會與日俱增,大放異彩。

  關鍵詞:MCU;;

  雖然在現(xiàn)今的生產(chǎn)生活中,以機器學習和深度學習為主力的人工智能應用已無處不在,但是承載的計算平臺絕大多數(shù)是具備加速器的服務器、PC,以及智能手機,而在微控制器(MCU)等級的平臺上的運用卻寥寥無幾。究其原因,傳統(tǒng)MCU的定位使其在算力和存儲資源上捉襟見肘,硬件的限制也導致應用深度學習所需的配套軟件和工具幾近為0。

  但近年來MCU的資源有著突飛猛進地發(fā)展,有代表性的是NXP的i.MX RT1060系列,使用高達600 MHz并且?guī)SP擴展的Cortex-M7內(nèi)核,理論整數(shù)算力已達1.2 GOPS;片內(nèi)有1 MB快速內(nèi)存并且可擴展,已能勝任相當多的機器學習應用。

  同時,由于MCU具有價格低,實時性強等自身的特點,基于MCU的機器學習也要與MCU的應用結(jié)合才能相得益彰,一般來說,“輕”是最顯著的特征。在這樣的背景下,筆者摸索和實踐了在MCU上如何應用深度學習,撰文以分享和總結(jié)相關的工作。

  1 在MCU上部署機器學習

  1.1 物聯(lián)網(wǎng)環(huán)境下的智能應用分布

  在智能物聯(lián)環(huán)境下,嵌入式系統(tǒng)一般位于網(wǎng)絡的,因此在嵌入式系統(tǒng)中的智能也常常被稱為輕智能。不過,嵌入式系統(tǒng)也是一個很寬泛的概念,其智能應用在邊緣上的分布也各有特色,如圖1所示。

  最邊緣的是IoT節(jié)點與離線節(jié)點——也就是傳統(tǒng)的嵌入式系統(tǒng),它們通常使用MCU、DSP以及低功耗的MPU,運行最輕量級的智能模型,可以永遠在線。如果位于更復雜系統(tǒng)的前級處理,則完成初步的計算,視情況決定是否喚醒主系統(tǒng)。

  另一類可稱為富功能節(jié)點與邊緣門戶,它們使用更加強勁的處理器,或者是帶機器學習IP的MCU,能運行更加大型的模型,并常常作為IoT網(wǎng)關。對于復雜度很高的問題,比如語音識別,仍然能調(diào)用云端服務來完成。

  近年來,以i.MX RT (600 MHz) 和STM32H7 (400MHz)等為代表的高配置MCU逐漸豐富,模糊了節(jié)點與門戶的界限,使得產(chǎn)品設計得以更加一脈相承,并且能讓開發(fā)者以MCU簡單易用的方式上手。

1556603946474992.jpg

  1.2 MCU上機器學習應用的特點

  MCU強調(diào)降低功耗、節(jié)約成本、加快上市,以及實時響應。所以在MCU上一般都要精簡AI模型,在精度與算力上合理取舍,改進已有算法的性能。在一些分級響應的大型系統(tǒng)中,可以發(fā)揮MCU低功耗的優(yōu)勢,在本地跑輕量級的AI模型,擔任永遠在線的前級處理。例如 ,語音識別系統(tǒng)的喚醒詞檢測就可以由MCU來完成。又如,物體識別系統(tǒng)可以先由MCU快速處理,遇到識別困難時再喚醒主系統(tǒng)來判定。

  下面列舉了一些適合MCU上部署的AI,為嵌入式系統(tǒng)屬性加成的常見場景:

  在強化圖像分類性能方面,可用于智能電器、生產(chǎn)線次品檢測、智能家居;

  在強化音頻分類性能方面,主要用于識別口令關鍵字;在工業(yè)應用方面,可改進電機與傳動、電源轉(zhuǎn)換,以及自動控制算法;MCU上AI還適合做異常檢測,判斷部件損壞、過程穩(wěn)定性、異常情況的發(fā)生。

  1.3 MCU上機器學習應用的難點

  盡管MCU上的AI應用有自己的特色,但目前普及率還比較低。首要的難點就是算力弱,較專業(yè)的AI加速器可有成百上千倍的差距。拿AI模型常常需要的乘累加操作性能為例,即使是目前性能最高的MCU,i.MXRT1050/60主頻為600 MHz,其M7內(nèi)核單周期能處理2個16位整數(shù)乘累加,其int16算力也只有1.2 GOPS,而目前的AI加速器動輒就是1 TOPS以上的算力。

  因此,我們首先采用先進的模型結(jié)構(gòu),并謹慎合理地精簡模型規(guī)模,配合高度優(yōu)化的底層代碼,今后還要結(jié)合器件的特色充分利用異構(gòu)多計算單元。其次,MCU上缺少建模工具,這方面我們可以借助PC/服務器上的建模軟件來建模與訓練。再次,MCU上缺少集成和部署工具,這方面我們“自己動手,豐衣足食”,下文會詳細報告具體的工作。最后,MCU上缺少標準運行環(huán)境。這方面,我們通過把模型轉(zhuǎn)換成C代碼以及開發(fā)執(zhí)行引擎的方法來填補空白。

  1.4 部署機器學習模型的過程

  MCU的弱算力決定了通常不適合訓練模型。因此,整個工作分為在PC端的部分和設備端的部分(如圖2)。在PC端要完成建模與訓練、模型的轉(zhuǎn)換與量化,以及模型部署的上位機工作,比如把模型與工程合并,以及模型數(shù)據(jù)的下載等。在設備端則要完成模型部署的下位機部分,主要是把AI模型與其它模塊對接,采集模型輸入數(shù)據(jù)并運行模型。

  這里再詳細介紹一下模型的部署,這也是連接2個世界的關鍵環(huán)節(jié)。對于在上位機上訓練好的模型,一個關鍵的步驟就是轉(zhuǎn)換與量化。這是要根據(jù)目標計算平臺的硬件和軟件接口,把模型做格式的轉(zhuǎn)換、量化(參數(shù)由浮點轉(zhuǎn)成整數(shù)),并對接到目標平臺上的NN庫或執(zhí)行引擎的API,生成可以部署的形式,如圖3所示。

  主要有兩種方式。


1557132209120155.jpg

1557132209521197.jpg1557132209468092.jpg

  第一種是生成與模型相對應的C/C++代碼,它們包括訓練出來的權(quán)重——用數(shù)組表示;模型各層的定義——用宏定義表示;以及模型所執(zhí)行的操作——包裝成一個函數(shù),由它來把模型操作映射成對目標平臺NN庫API的調(diào)用。這樣,模型就直接化成了C/C++工程的一部分,一起編譯鏈接到固件中了。這樣做的優(yōu)勢是深度整合,效率高、代碼??;但進行模型修改的同時需要重新生成固件,非常死板,比較適合較單一的系統(tǒng)。

  另一種是在目標平臺上運行通用的模型執(zhí)行引擎——也叫Inference Engine (IE)。IE接收模型的操作與參數(shù),并調(diào)用目標平臺NN庫中對應的API。而轉(zhuǎn)換工具則把模型的參數(shù)和結(jié)構(gòu)轉(zhuǎn)換成IE能識別的方式,再由IE來貫徹執(zhí)行模型的操作。這樣,模型化成了一個文件或者是結(jié)構(gòu)體實例。系統(tǒng)需要調(diào)用IE并把模型文件作為數(shù)據(jù)送給它,由IE解析和執(zhí)行模型指定的操作。這樣,顯然更加靈活,模塊化??梢源鎯Χ鄠€模型文件,改模型無需重新生成固件,只是要承擔IE的資源開銷,在性能與體積上有所舍棄。

  無論哪一種,神經(jīng)網(wǎng)絡底層庫都是關鍵的一環(huán)。在ARM Cortex-M系列MCU上,CMSIS-NN扮演這個角色,并且針對DSP和SIMD指令集高度優(yōu)化,和基線的標準C實現(xiàn)相比性能提高可達4.5倍。不過它僅提供了神經(jīng)網(wǎng)絡操作的API,需要另行生成上層代碼或提供執(zhí)行引擎才能使用,另外對神經(jīng)網(wǎng)絡建模方式的支持略有不足。而谷歌的TensorFlow-Lite自帶的NN庫則支持更豐富的神經(jīng)網(wǎng)絡構(gòu)建塊與連接方式,并且是通用的,但是并沒有針對Cortex-M優(yōu)化,性能遠遠不如CMSIS-NN。

  目前筆者實現(xiàn)了把Keras模型轉(zhuǎn)換成調(diào)用CMSIS-NN的C代碼以及對應的權(quán)重表,得以充分發(fā)揮CMSIS-NN在Cortex-M上高性能的優(yōu)點。把生成的C源文件加入到現(xiàn)有的工程中,即可應用深度學習。

  2 適用于MCU的深度學習建模方式

  深度學習的基礎是構(gòu)建多層神經(jīng)網(wǎng)絡(NN)。神經(jīng)網(wǎng)絡作為深度學習的基礎技術,模型表達能力強,尤其是善于處理非結(jié)構(gòu)化的多媒體數(shù)據(jù)。對于開發(fā)者而言,神經(jīng)網(wǎng)絡相比眾多機器學習算法,需要的數(shù)學基礎更少,相對單純,容易掌握。這些最終使軟硬件開發(fā)資源也最為豐富。

  搭建適合在MCU端使用的神經(jīng)網(wǎng)絡非常簡潔,如圖4所示:

  一般只需要3種主運算和對主運算的3種后加工操作。使用這三種基本構(gòu)建塊并且適當處理輸出后,形成神經(jīng)網(wǎng)絡的一級運算,也稱為一個層。每個層就猶如電路中的一個基本元件,按串聯(lián)、并聯(lián)、混聯(lián)的方式搭建在一起,就能組成強大的神經(jīng)網(wǎng)絡。此外,在訓練模型期間,還會加入一些輔助運算,比如批正則化(batchnormalization)、隨機丟棄(dropout)等,以提高訓練效率。在把模型轉(zhuǎn)換成可供部署的形式時,會去掉或合并它們。

  這其中,普通卷積層(CNN)是最“萬能”的。在設計一個新的模型時,常??梢韵扔萌舾蓚€卷積層提取特征,如果需要分類,尾部再追加一個全連接層。如果MCU算力強大或存儲空間不足,可以把CNN拆分成逐通道卷積(DS-CNN)尾隨一個 1x1 CNN,以在相同參數(shù)下獲取更強的表達能力,或在相同表達能力下節(jié)省空間。反之對于算力較弱的MCU,則可適當把CNN替換成全連接層(FC),它們雖然參數(shù)多,但算力需求通常遠遠小于CNN。

  前面提到的層層堆積的方法,好比是穿糖葫蘆,它只是構(gòu)建神經(jīng)網(wǎng)絡最常用最簡單的一種,這是微型/小型網(wǎng)絡的首選,已能應對大部分MCU上深度學習問題。如果把直筒結(jié)構(gòu)稍加改造,使某層的輸出還加到后續(xù)幾層后,就可以輕松創(chuàng)建容易訓練的更深的網(wǎng)絡,能勝任更復雜的問題,如人臉識別,以及分辨上百種以上的種類,像用于MobileNet和MobileFaceNet的反向殘差連接就是典型的實例。

  早期的神經(jīng)網(wǎng)絡構(gòu)建塊中包含的參數(shù)較多,比如卷積核常用5x5,后面創(chuàng)新的結(jié)構(gòu)常常把單個構(gòu)建塊化整為零成一個小型的子網(wǎng)絡,既減少了參數(shù)又改進了性能。

1557132240936321.jpg

  盡管神經(jīng)網(wǎng)絡的結(jié)構(gòu)很豐富,但整體上看仍然是直筒式的順序處理結(jié)構(gòu)。在搭建較深的神經(jīng)網(wǎng)絡時,一些片段常常重復出現(xiàn),于是在設計網(wǎng)絡時可以像宏定義一般預制復合結(jié)構(gòu),再串在一起,這樣可以簡化設計,并且靈活多用。

  基于以上建模方式,我們在NXP i.MX RT1062上實踐了多種模型,表1列出了典型的幾種。

  圖5展開介紹了10項物體分類所使用的NN結(jié)構(gòu)。

  它是個小型直筒式結(jié)構(gòu),串了3個普通卷積層,以分級提取出1024個特征,再用一個全連接層來分類。卷積層用于從輸入的32x32 RGB圖片中分3次提取出特征來,每過一層都通過池化來減少特征,這體現(xiàn)了從前一層精練更高級特征的思想。最后的全連接層有十個輸出,每個輸出對應了各類物體中每個特征的重要程度。全連接層的運算通過矩陣乘向量的方式呈現(xiàn),最終得到10個數(shù),決定和每類物體的相似程度。整個網(wǎng)絡一共有87.3 k個參數(shù),對M7的乘累加算力需求約為13 MOPs。模型使用8位整數(shù)量化,在Cortex-M7上,還需要數(shù)據(jù)搬運和8位轉(zhuǎn)16位,在無內(nèi)存訪問怠機的情況下,理論算力利用率約42%。在理論乘累加算力為1.2 GOPS的i.MX 1060上,按100% CPU時間全額投入,每次運算需要約26 ms。

  2.1 借助CNN實現(xiàn)語音口令檢測

  我們再看一下深度學習在話音口令關鍵詞檢測——簡稱KWS中的應用。為了重用圖像處理的神經(jīng)網(wǎng)絡技術,常常先把時域信號分割變換成多個頻譜,再拼接成一個灰度圖像。鑒于這類圖像經(jīng)常出現(xiàn)比較長的水平線,在應用卷積網(wǎng)絡時對卷積核的設計一般也采用較扁的矩形而不再是常見的正方形。順便一提,另一種循環(huán)神經(jīng)網(wǎng)絡,簡稱RNN,在處理這種前后聯(lián)系比較豐富的事物時往往更加得心應手,但是目前在MCU上還沒有優(yōu)化支持,而在簡單短口令的檢測上,CNN系建模方案的效率也能媲美RNN。

  3 小結(jié)與未來展望

  MCU自身的綜合能力和機器學習的優(yōu)化會不斷升級。比如廣泛用于MCU的ARM Cortex-M系列內(nèi)核,先后加入了SIMD與DSP擴展,半精度浮點數(shù),它們都有助于加速機器學習應用和提高效率;最新又發(fā)布的MVE(又稱Helium)技術,加入了128位寬矢量運算能力,最高可為機器學習再提速15倍!基于開源RISC-V指令集擴展機器學習加速也正在異軍突起。在內(nèi)核周邊,MCU在存儲容量、主頻,以及多種數(shù)據(jù)輸入接口也在不斷升級,這一切為在MCU上部署更多更先進的智能應用提供堅實的支撐。

1557132254253094.jpg

  在基礎軟件方面,適用于MCU平臺的機器學習的庫也已經(jīng)歷了從無到有,目前正在從簡陋向完善發(fā)展。比如, CMSIS-NN目前還只支持CNN、DS-CNN、FC層,今后可能會支持多種RNN;另一方面,支持多種傳統(tǒng)機器學習算法的軟件包也一定正在路上。


  在生態(tài)上,MCU上圖像分類、語音口令觸發(fā)、異常檢測這三大應用場景的相關的示例正在不斷豐富,模型轉(zhuǎn)換與部署工具也在不斷完善,今后用戶會得到越來越多的參考資源與開發(fā)工具。

  硬件、軟件和生態(tài)的發(fā)展,使MCU在工業(yè)、控制與物聯(lián)傳感領域中的智能化大顯身手的同時,也會漸漸勝任更多實時圖像處理和語音數(shù)據(jù)智能應用。智能物聯(lián)時代正滾滾而來,在功能安全(safety)與信息安全(security)的保障下,基于機器學習的邊緣輕型智能越發(fā)成為嵌入式系統(tǒng)創(chuàng)造新價值的關鍵,而MCU硬件和固件就責無旁貸地成為了承載智能物聯(lián)應用的主力軍。

  作者簡介

  宋巖 :MCU高級系統(tǒng)工程師,有近15年MCU與嵌入式系統(tǒng)從業(yè)經(jīng)驗,近期專注于微控制器在人工智能、機器視覺以及高級語言開發(fā)等方面的開發(fā)資源與應用。

本文來源于科技期刊《電子產(chǎn)品世界》2019年第5期第頁,歡迎您寫論文時引用,并注明出處



評論


相關推薦

技術專區(qū)

關閉