STM32Cube.AI是意法半導(dǎo)體人工智慧生態(tài)系統(tǒng)的STM32Cube擴(kuò)充套件,可以自動(dòng)轉(zhuǎn)換預(yù)訓(xùn)練之神經(jīng)網(wǎng)路及將產(chǎn)生的最佳化函式庫整合到開發(fā)者專案中,以進(jìn)一步擴(kuò)充STM32CubeMX的能力。更提供多種方法在PC及 STM32 開發(fā)板驗(yàn)證神經(jīng)網(wǎng)路模型,並測量 STM32裝置上的效能,無需使用者手動(dòng)撰寫 C code。
本文介紹STM32Cube.AI進(jìn)階功能,涵蓋以下主題:
- Runtime支援:Cube.AI與TensorFlow Lite
- 量化支援
- Graph flow及記憶體設(shè)定最佳化
- Relocatable二進(jìn)位模型支援
Runtime支援:Cube.AI與TensorFlow Lite
STM32Cube.AI支援2種針對(duì)不同應(yīng)用需求的runtime—Cube.AI和TensorFlow Lite。Cube.AI 為預(yù)設(shè)執(zhí)行階段,是針對(duì)STM32高度最佳化的機(jī)器學(xué)習(xí)函式庫。TensorFlow Lite for Microcontroller由Google設(shè)計(jì),用於微控制器及其他裝置上執(zhí)行機(jī)器學(xué)習(xí)模型,只佔(zhàn)用幾千位元組的記憶體空間。它被廣泛用在基於MCU的應(yīng)用。STM32Cube.AI整合了一條特別路徑供STM32 IDE專案所用,並嵌入TensorFlow Lite for Microcontrollers執(zhí)行階段 (TFLm)及其相關(guān)的TFLite模型。對(duì)於希望擁有一個(gè)跨專案通用框架的開發(fā)人員,這可視為預(yù)設(shè)的 Cube.AI runtime替代方案。
雖然兩種runtime均為資源有限的MCU專案而設(shè)計(jì),但Cube.AI更針對(duì)STM32的獨(dú)特架構(gòu)進(jìn)一步最佳化。因此,TensorFlow Lite更注重跨平臺(tái)移植的需求,而Cube.AI 則注重運(yùn)算速度及記憶體佔(zhàn)用要求更高的應(yīng)用。
以下圖表顯示相同的預(yù)訓(xùn)練神經(jīng)網(wǎng)路模型中,兩種runtime之間的效能比較。
如表格所示,對(duì)於同一個(gè)模型,Cube.AI runtime相較TFLite runtime節(jié)省了大約20%的Flash,和約8%的RAM,執(zhí)行速度幾乎是TFLite runtime的2倍。
對(duì)於TFLite模型,使用者可在STM32Cube.AI的網(wǎng)路設(shè)定中選擇 2 種runtime。
量化支援
量化是一種廣泛使用的最佳化技術(shù),可將32位元的浮點(diǎn)數(shù)模型壓縮成更少位元的整數(shù)模型,進(jìn)而?少儲(chǔ)存大小及runtime的記憶體佔(zhàn)用峰值,並改善CPU/MCU的推論時(shí)間及功耗,而精度只會(huì)略降一些。量化後的模型可利用整數(shù)(而非浮點(diǎn)值)來執(zhí)行部分或是全部的tensor。它是各種最佳化技術(shù)的重要組成部分,如:拓?fù)鋵?dǎo)向、feature map reduction、剪枝、weights compression等,可應(yīng)用於像是MCU這類runtime資源有限的環(huán)境。
另外兩種經(jīng)典的量化方法:post-training quantization(PTQ)以及quantization aware training(QAT)。PTQ相對(duì)容易進(jìn)行,它容許使用有限的代表性資料集對(duì)預(yù)訓(xùn)練模型進(jìn)行量化。而QAT則是在訓(xùn)練過程中完成,模型精度通常更好。
STM32Cube.AI以 2種方式直接或間接支援這2種量化方法:
- 首先,可部署經(jīng)由PTQ或是QAT量化的TensorFlow Lite模型。在此情況下,量化由 TensorFlow Lite框架執(zhí)行,主要是通過「TFLite converter」程式匯出TensorFlow Lite檔案。
- 其次,命令行介面(CLI)亦整合了一個(gè)內(nèi)部PTQ程序,針對(duì)預(yù)訓(xùn)練的Keras模型提供不同的量化計(jì)劃。與採用「TFLite converter」程式的訓(xùn)練後量化相比,此內(nèi)部程序提供更多量化計(jì)劃,在執(zhí)行時(shí)間及精度方面提供不同的選擇。
下圖表顯示在 STM32 上部署量化模型相較原有浮點(diǎn)模型的優(yōu)勢。FD-MobileNet用作基準(zhǔn)測試模型,12 層、145k 參數(shù)、24M MACC運(yùn)算及輸入維度224x224x3。
從表中可見,量化模型可節(jié)省約4倍的Flash和RAM,執(zhí)行速度快約3倍,而精度僅降低 0.7%。
如果已安裝X-Cube-AI軟體套件,使用者可以在此路徑找到使用Cube.AI CLI進(jìn)行量化的教學(xué):C:\Users\username\STM32Cube\Repository\Packs\STMicroelectronics\X-CUBE-AI\7.1.0\Documentation\quantization.html. 文末亦附有「Quantize a MNIST model」範(fàn)例。
Graph flow及記憶體配置最佳化
除了量化技術(shù)外,STM32Cube.AI更追求使用其C Code產(chǎn)生器之最佳化引擎,針對(duì)推論時(shí)間最佳化記憶體使用(RAM和ROM)。它基於不需要資料集的方式,意味著壓縮及最佳化演算法無需訓(xùn)練、驗(yàn)證或測試資料集。
第一種方法是weigh/bias壓縮,當(dāng)中應(yīng)用 k-means 聚類演算法。此壓縮算法只適用於dense 層(完全連接層)。此方法的優(yōu)勢是獲得快速的壓縮過程,但結(jié)果並非無損,全域精度可能會(huì)受影響。為此,STM32Cube.AI提供了Validation process作為改善措施,以評(píng)估壓縮過程中所造成的誤差。
如下圖所示,壓縮功能可以在STM32Cube.AI網(wǎng)路設(shè)定中使用:
第二種方法是運(yùn)算融合。將各層合併,再以最佳化資料的位置及相關(guān)的運(yùn)算核心。有些層(例如「Dropout」、「Reshape」)在轉(zhuǎn)換或最佳化的過程中被移除,有些層(例如非線性及卷積層後的「Pooling」)則融入前一層。轉(zhuǎn)換後網(wǎng)路的層數(shù)通常低於原始網(wǎng)路,更減少記憶體中的資料傳輸量。
最後一種方法為最佳化activation memory。定義了一個(gè) R/W 區(qū)塊,用於儲(chǔ)存暫時(shí)隱藏層的值(activation運(yùn)算子的輸出)。它可被視為推論函數(shù)所用的scratch buffer。Activation memory可以在不同層上被重複使用。因此,activation buffer的大小由兩個(gè)連續(xù)層的最大記憶體需求所定義。
Relocatable二進(jìn)位模型支援
Non-relocatable方法(或所謂的「靜態(tài)」方法)指定神經(jīng)網(wǎng)路的 C檔被編譯後,與終端使用者應(yīng)用的stack連結(jié)在一起。如下圖所示,所有物件(包括神經(jīng)網(wǎng)路及使用者應(yīng)用)根據(jù)不同資料類型連結(jié)到不同的區(qū)段。在此情況下,當(dāng)使用者希望更新函數(shù)的特定部分,整個(gè)韌體都需要更新。
相對(duì)地,relocatable二進(jìn)位模型指定一個(gè)二進(jìn)位物件,該物件可在STM32記憶體子系統(tǒng)內(nèi)任何地方安裝和執(zhí)行。它包含被編譯後的神經(jīng)網(wǎng)路 C檔,亦包括所需的forward kernel函式以及weights。主要目的是提供更靈活的更新 AI應(yīng)用方式,即無需重新產(chǎn)生和燒錄整個(gè)韌體。
產(chǎn)生的二進(jìn)位物件是一個(gè)輕量plug-in,可從任何位址執(zhí)行(與位置無關(guān)的程式),其資料可儲(chǔ)存在記憶體的任何地方(與位置無關(guān)的資料)。利用STM32Cube.AI簡單高效的AI relocatable runtime,可將其實(shí)體化並加以利用。複雜及消耗資源的ArmR CortexR -M MCU動(dòng)態(tài)連結(jié)器不會(huì)嵌入STM32韌體,生成的物件是一個(gè)獨(dú)立實(shí)體,在runtime不需要外部symbols或函式。
下圖左側(cè)是神經(jīng)網(wǎng)路的relocatable二進(jìn)位物件,該物件是獨(dú)立的,並將放置於終端使用者應(yīng)用的單獨(dú)區(qū)域(右側(cè)部分)。它可由STM32Cube.AI的relocatable runtime實(shí)體化及動(dòng)態(tài)連結(jié)。因此,使用者在更改AI模型時(shí),只需更新此部分的binary。也可以進(jìn)一步選擇產(chǎn)生神經(jīng)網(wǎng)路 weights作為一個(gè)獨(dú)立的物件,以增加靈活性。
如下圖所示,relocatable network可以在STM32Cube.AI的進(jìn)階設(shè)定中啟用:
最後,作為 意法半導(dǎo)體AI生態(tài)系統(tǒng)的核心工具,STM32Cube.AI提供眾多基本或進(jìn)階功能,幫助使用者輕鬆建立高度最佳化和靈活的AI應(yīng)用。