如何在資源受限的RISC-V內(nèi)核上嵌入人工智能?
人工智能(AI)幾十年來一直是一個(gè)熱門的技術(shù)話題。根據(jù)Statista 和Gartner 的預(yù)測,人工智能的收入將在未來4 年內(nèi)增長4 倍,在2024 年后將超過1 000 億美元(1 美元約為人民幣6.4 元)。
本文引用地址:http://m.butianyuan.cn/article/202204/433078.htm傳統(tǒng)上,復(fù)雜的人工智能計(jì)算在云端數(shù)據(jù)中心運(yùn)行。在GPU 加速器和專門的系統(tǒng)級芯片(SoC)的幫助下,在臺式機(jī)上實(shí)現(xiàn)人工智能模型,可以減少云端訪問的要求。但在過去的幾年里,一個(gè)重要的轉(zhuǎn)變是AI 處理從云端轉(zhuǎn)到設(shè)備級。這主要?dú)w功于嵌入式設(shè)備/SoC 的性能不斷提高和安全考慮。這種轉(zhuǎn)變催生了嵌入式人工智能的概念——機(jī)器學(xué)習(xí)和深度學(xué)習(xí)在設(shè)備級嵌入式軟件中的應(yīng)用。
嵌入式人工智能使設(shè)備能夠在邊緣運(yùn)行簡單的人工智能模型,并立即重復(fù)使用計(jì)算結(jié)果。從安全角度以及從降低延遲、最小化數(shù)據(jù)傳輸時(shí)間/ 能耗成本和避免使用通信硬件等方面來看是有利的。這可能對關(guān)鍵的工業(yè)物聯(lián)網(wǎng)(IIoT)基礎(chǔ)設(shè)施特別重要,邊緣AI 算法可用于收集各種傳感器的數(shù)據(jù),并實(shí)時(shí)預(yù)測系統(tǒng)故障。
鑒于將人工智能計(jì)算轉(zhuǎn)移到邊緣的趨勢,在為物聯(lián)網(wǎng)/IIoT 應(yīng)用選擇SoC/MCU(微控制器)時(shí),能運(yùn)行人工智能/ 機(jī)器學(xué)習(xí)任務(wù)的能力成為一個(gè)“必備”的選項(xiàng)。同時(shí)對于其他的一些案例,如數(shù)據(jù)傳輸時(shí)間/ 能耗成本可能超過在設(shè)備層運(yùn)行一個(gè)簡單的AI 模型時(shí),引入邊緣人工智能也具有價(jià)值。例如,智能可穿戴設(shè)備、植入式傳感器、資產(chǎn)跟蹤、環(huán)境傳感器、無人機(jī)、音頻/AR/VR 耳機(jī)等應(yīng)用。
嵌入式設(shè)備通常受到資源限制:板上內(nèi)存小,指令集有限,特定的硬件模塊如FPU(Float Point Unit,浮點(diǎn)運(yùn)算單元)、DSP(Digital Signal Processing,數(shù)字信號處理)較少。這些限制使得即使在嵌入式平臺上運(yùn)行簡單的人工智能算法也很棘手。從軟件的角度來看,它使得通過專用的人工智能框架,如TensorFlow Lite forMicrocontrollers(TFLite-Micro)變得更加容易。從硬件的角度來看,使用矢量/ 圖形協(xié)處理器或SIMD 指令可能是一個(gè)解決方案;這兩者通常都是與昂貴的高性能SoC 一起交付。如果成本和功耗預(yù)算僅限于帶有(或甚至沒有)DSP 模塊的MCU,此時(shí)怎么辦?
用于微控制器的TensorFlow Lite框架
基于神經(jīng)網(wǎng)絡(luò)的算法可以提供可靠的結(jié)果,同時(shí)從頭去實(shí)現(xiàn)它們通常也相當(dāng)復(fù)雜,包括張量運(yùn)算和非線性浮點(diǎn)函數(shù)。但有幾個(gè)框架可以簡化開發(fā)者的繁瑣任務(wù)。TensorFlow Lite 是在2017 年推出的,針對的是移動(dòng)設(shè)備上的神經(jīng)網(wǎng)絡(luò)推理。而最終TensorFlow Lite for Microcontrollers 在2021 年從TensorFlow Lite 中分離出來,專門針對資源受限的嵌入式系統(tǒng),將TensorFlow Lite 的其余部分留給Android/iOS 應(yīng)用。
TFLite-Micro 采用了帶有靜態(tài)內(nèi)存規(guī)劃器的直譯器形式,支持方案提供商特有的優(yōu)化項(xiàng)。它解決了嵌入式系統(tǒng)的常見問題,如內(nèi)存小和功耗限制等,并考慮到了支持各種架構(gòu)/ 微架構(gòu)的需要。它在任何嵌入式平臺上開箱即用,支持最小的TensorFlow 操作集,如卷積、張量乘法、調(diào)整大小和切片,并仍然足以運(yùn)行豐富的人工智能應(yīng)用,如圖像分類、時(shí)間序列處理或關(guān)鍵詞檢測。Codasip 構(gòu)建了特定應(yīng)用的平臺,因此TFLite-Micro 對特定領(lǐng)域?qū)S脙?yōu)化項(xiàng)的支持,與Codasip Studio 工具完美吻合。
事實(shí)上,Codasip 處理器設(shè)計(jì)工具簡化了ASIP(專用指令集處理器)設(shè)計(jì)過程中最耗時(shí)的階段,包括:1)高級架構(gòu)描述和ISA 探索,2)自動(dòng)編譯器生成,3)剖析器(profiler)和調(diào)試分析工具,4)周期精確的(硬件級)仿真,5)綜合驗(yàn)證環(huán)境。
下面以Codasip 的支持TFLite Micro 的L31 RISC-V嵌入式內(nèi)核為例來進(jìn)行分析,來對標(biāo)準(zhǔn)RISC-V 和自定義擴(kuò)展都進(jìn)行了評估。客戶可以利用這些擴(kuò)展,使功率、性能和面積的權(quán)衡超出傳統(tǒng)設(shè)計(jì)的MCU 所能做到的性能。評估結(jié)果將顯示該范圍有多廣,并為進(jìn)一步的改進(jìn)提供建議。
未來許多客戶將開發(fā)他們自己的神經(jīng)網(wǎng)絡(luò),但基礎(chǔ)機(jī)制是相似的。因此可以使用標(biāo)準(zhǔn)軟件;在這個(gè)示例中,使用了著名的“MNIST 手寫體數(shù)字分類”。自卷積神經(jīng)網(wǎng)絡(luò)發(fā)明以來,這一直被認(rèn)為是一個(gè)基準(zhǔn)。
圖1 MNIST“手寫體數(shù)字識別”基準(zhǔn)意味著對灰度28x28圖像進(jìn)行智能標(biāo)簽分配
它是一個(gè)大小為28x28 像素的灰度圖像,包含一個(gè)手寫的數(shù)字和該圖像最可能輸出的數(shù)字(見圖1)。盡管任務(wù)表面上很簡單,但這包括了TFLite-Micro 支持的大量運(yùn)算符子集。通常用于解決它的神經(jīng)網(wǎng)絡(luò)架構(gòu)包含兩個(gè)卷積層和池化層、至少一個(gè)全連接層、向量化非線性函數(shù)、數(shù)據(jù)調(diào)整大小和規(guī)范化操作等(見圖2)。
圖2 用于手寫數(shù)字識別的卷積神經(jīng)網(wǎng)絡(luò)
為了探索這段代碼在L31 CPU 上的性能,CodasipStudio 的內(nèi)置剖析器提供了詳細(xì)的PPA(性能- 功耗-面積)預(yù)估,源代碼覆蓋率和單個(gè)指令的使用。這使得新的指令可以被快速試用并分析其性能優(yōu)勢。
表1 剖析器提供的代碼覆蓋率分析
表1 顯示了剖析器所提供的代碼覆蓋率分析。正如預(yù)期的那樣,對于圖像分類任務(wù)來說,大部分的時(shí)間(~84%)都花在了圖像卷積函數(shù)上。從這個(gè)信息開始,我們可以進(jìn)入相應(yīng)的‘ConvPerChannel’源代碼,對其進(jìn)行更詳細(xì)的探索。TFLite-Micro 中的卷積是以嵌套for-loop 的形式編寫的,索引各種卷積窗口尺寸以及訓(xùn)練數(shù)據(jù)批次。最深的for-loop 掃描了圖像輸入通道,根據(jù)分析信息顯示,CPU 在這里花費(fèi)的時(shí)間最多。
圖3 Codasip的內(nèi)置剖析工具允許我們找到應(yīng)用程序代碼中的“熱點(diǎn)”
源代碼(圖3)中標(biāo)明了在該處花費(fèi)的周期數(shù),給出了周期數(shù)的百分比和絕對數(shù)。反匯編顯示了這些“熱點(diǎn)”的CPU 指令。這些信息表明,哪里需要優(yōu)化?哪些指令可以被加入/ 替換以獲得更好的性能?例如,在TFLite 卷積的特殊情況下,大部分時(shí)間花在乘法+ 累加操作上(mul 后面是c.add),以及隨后的(向量)內(nèi)存加載(for-statement 后面的lb 指令)。此外,合并乘法和加法,以及用即時(shí)地址增量加載字節(jié),似乎是一個(gè)可以提高性能的定制方案。我們將在后面的自定義指令部分再來討論這個(gè)話題。
Codasip Studio 工具中提供的剖析器還可以預(yù)估ASIP 的功率和面積,提供設(shè)計(jì)中每個(gè)硬件塊的信息。這使設(shè)計(jì)者能夠在L31內(nèi)核的標(biāo)準(zhǔn)變體之間進(jìn)行選擇,并評估使用TFLite-Micro 進(jìn)行量化的好處。
圖4 包含了PPA 圖表,顯示了識別測試集的單一圖像所需的相對時(shí)鐘周期數(shù)、消耗的能量和利用的芯片面積。沒有浮點(diǎn)硬件的基本L31 配置是有效的,但性能相對較慢,因?yàn)镕P 操作必須在軟件中模擬。而通過在L31 中添加硬件浮點(diǎn)單元可以解決這個(gè)問題,并使總時(shí)間減少近85%,功耗減少42%,但代價(jià)是芯片面積擴(kuò)大(+207%)。
圖4 Codasip的L31 32位整數(shù)內(nèi)核、32位浮點(diǎn)內(nèi)核以及運(yùn)行手寫數(shù)字識別的量化TFLite模型的32位整數(shù)內(nèi)核之間的PPA比較。
此外還有一個(gè)解決方案:TFLite-Micro 支持神經(jīng)網(wǎng)絡(luò)參數(shù)和輸入數(shù)據(jù)的量化。這個(gè)功能是從最初的TensorFlow Lite 框架中提取的, 并提供了將任何TensorFlow 模型轉(zhuǎn)換為整數(shù)(有符號/ 無符號8/16 位)表示的能力,因此它可以直接在整數(shù)內(nèi)核上運(yùn)行。圖4顯示,在標(biāo)準(zhǔn)整數(shù)L31 內(nèi)核上運(yùn)行的int8 量化模型幾乎達(dá)到了浮點(diǎn)內(nèi)核的性能,運(yùn)行時(shí)間減少了80% 以上,功耗比初始水平進(jìn)一步提高了78%,而不需要增加內(nèi)核的復(fù)雜性和硅面積。
神經(jīng)網(wǎng)絡(luò)模型的量化總是在預(yù)測精度和算法復(fù)雜性之間進(jìn)行權(quán)衡。從浮點(diǎn)版本切換到int16 和int8 不可避免地會(huì)降低精度,而用戶有責(zé)任確保它不會(huì)降太多。量化(int8)和初始浮點(diǎn)模型都在包含10,000 張圖片的測試集上得到了驗(yàn)證,結(jié)果準(zhǔn)確率為98.91%(fp32)和98.89%(int8),這似乎是對資源、功率和性能增益的合理權(quán)衡。
自定義指令集的優(yōu)勢
在SoC 設(shè)計(jì)的框架內(nèi),“傳統(tǒng)”處理器(MCU、DSP、GPU 等)提供了一些特定的強(qiáng)大功能。為特定需求創(chuàng)建領(lǐng)域?qū)S锰幚砥?,在面積、功耗和性能方面有很大優(yōu)勢。一個(gè)優(yōu)化的指令集結(jié)構(gòu)(ISA)與最小的所需指令會(huì)產(chǎn)生一個(gè)更緊湊和高效的內(nèi)核,可在更少的周期內(nèi)執(zhí)行所需的任務(wù),從而也降低了功耗。
運(yùn)行TFLite 圖像分類任務(wù)的標(biāo)準(zhǔn)L31 內(nèi)核“熱點(diǎn)”識別提供了提示,即哪些指令可以合并或優(yōu)化以促進(jìn)特定的任務(wù)?為了優(yōu)化矢量存儲器的加載和卷積乘法和累加序列,增加了兩條自定義指令:mac3 將乘法和加法合并到一個(gè)時(shí)鐘周期,lb.pi 在加載指令后立即增加地址。這兩條指令目的在于減少頻繁重復(fù)指令序列所花費(fèi)的時(shí)鐘周期數(shù)。
Codasip 的CodAL 高級處理器描述語言提供了一種有效的方式來描述匯編編碼和程序員對指令功能的想法。這使得迭代嘗試新指令和重新編制代碼以衡量其有效性變得非??臁D5 是一個(gè)如何在CodAL 中定義新指令的例子。
通過對運(yùn)行相同圖像分類任務(wù)的定制L31 整數(shù)內(nèi)核進(jìn)行分析,表明新指令可以被廣泛使用。圖6 總結(jié)了指令集中最頻繁使用的前5 條指令;其中乘法累積和帶地址增量的字節(jié)加載包含其中。
圖6 指令集中最頻繁使用的前5條指令
利用定制的L31 內(nèi)核進(jìn)行的源代碼分析顯示,以前發(fā)現(xiàn)的“熱點(diǎn)”性能得到了改善。反匯編(圖7)顯示,它們是在新的定制指令的幫助下執(zhí)行的,最深的forloop中的凈周期數(shù)已經(jīng)大大減少。
圖7 自定義指令如何改變源代碼的CPU時(shí)間分布。反匯編顯示自定義指令在這里被廣泛使用,導(dǎo)致卷積乘法和字節(jié)數(shù)組加載的時(shí)間大大減少。
圖8 顯示了這些架構(gòu)/ 微架構(gòu)的定制是如何進(jìn)一步改善L31 內(nèi)核在圖像分類任務(wù)上的PPA(Power,Performance,and Area,功耗,性能和尺寸)指標(biāo)?兩張圖比較了定制的L31 的PPA 和之前在量化int8 圖像分類任務(wù)上的標(biāo)準(zhǔn)32 位整數(shù)內(nèi)核的參數(shù)。
圖8 Codasip的L31內(nèi)核32位整數(shù)標(biāo)準(zhǔn)核和定制核之間的PPA比較,顯示了在手寫數(shù)字識別任務(wù)上PPA的改善。
通過僅增加兩條新指令,算法優(yōu)化和從內(nèi)存加載數(shù)組的方法,與在標(biāo)準(zhǔn)內(nèi)核上運(yùn)行的量化模型相比,總運(yùn)行時(shí)間提高了10% 以上,功耗降低了8% 以上,而面積只增加了0.8%,這似乎是一個(gè)合理的定制成本。使用SIMD(Single Instruction Multiple Data,單指令多數(shù)據(jù)流)指令可能會(huì)進(jìn)一步提升性能,但很可能會(huì)大大增加面積。
對于許多人工智能公司來說,用于加速其設(shè)計(jì)的確切機(jī)制往往是企業(yè)的“秘密武器”。因此,Codasip 的處理器設(shè)計(jì)自動(dòng)化工具Studio 使客戶能夠靈活地定制機(jī)器學(xué)習(xí)(ML)特定的內(nèi)核并創(chuàng)建專有的加速器解決方案。
(本文來源于《電子產(chǎn)品世界》雜志2022年4月期)
評論