隨著人工智能(AI)技術(shù)在各個(gè)行業(yè)的普及,將AI技術(shù)和嵌入式系統(tǒng)相結(jié)合,構(gòu)建AI嵌入式系統(tǒng)成為當(dāng)前技術(shù)熱點(diǎn)之一。本書介紹AI領(lǐng)域多種機(jī)器學(xué)習(xí)算法在嵌入式系統(tǒng)上的底層實(shí)現(xiàn)和優(yōu)化技術(shù),F(xiàn)在很多機(jī)器學(xué)習(xí)算法基于海量存儲(chǔ)和運(yùn)算,對(duì)功耗、體積、計(jì)算能力和存儲(chǔ)容量有較高要求,而不同領(lǐng)域的嵌入式系統(tǒng)受限于各自的應(yīng)用需求,難以滿足所有條件。目前在嵌入式系統(tǒng)中實(shí)現(xiàn)復(fù)雜機(jī)器學(xué)習(xí)算法有多條途徑,包括基于通用GPU多處理器架構(gòu)的方案、基于專用運(yùn)算加速引擎的定制化方案,以及基于現(xiàn)有處理器對(duì)算法進(jìn)行深度優(yōu)化的方案等。這些技術(shù)方案各有優(yōu)缺點(diǎn),并且在不同領(lǐng)域得到了應(yīng)用。基于GPU的通用多處理器架構(gòu)的方案通用性強(qiáng)、算力高,但代價(jià)是硬件成本高、功耗大;趯S眠\(yùn)算加速引擎的定制化方案運(yùn)算效率高,功耗可控,但運(yùn)算結(jié)構(gòu)相對(duì)固定,靈活性差。基于現(xiàn)有處理器對(duì)算法進(jìn)行深度優(yōu)化的方案成本低,不需要專用或者定制化硬件,通用性強(qiáng),但代價(jià)是需要手動(dòng)對(duì)各案例逐個(gè)進(jìn)行優(yōu)化,開發(fā)難度高。本書中關(guān)注的是基于現(xiàn)有的嵌入式處理器系統(tǒng)和架構(gòu),通過不同層次的優(yōu)化實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法。雖然書中所介紹的方法以通用嵌入式處理器為例,但也能夠應(yīng)用于GPU或者硬件加速引擎架構(gòu),比如基于變換域的快速卷積算法在GPU的底層運(yùn)算庫(kù)中得到應(yīng)用,基于加減圖的常數(shù)乘法運(yùn)算能夠方便地在芯片硬件設(shè)計(jì)中實(shí)現(xiàn)。
機(jī)器學(xué)習(xí)涉及多個(gè)不同領(lǐng)域的算法,其中包括基于統(tǒng)計(jì)學(xué)習(xí)的方法和基于神經(jīng)網(wǎng)絡(luò)的方法;诮y(tǒng)計(jì)學(xué)習(xí)的算法理論模型設(shè)計(jì)精巧,泛化性能好,運(yùn)算量相對(duì)較低,容易在存儲(chǔ)量和運(yùn)算量受限的嵌入式系統(tǒng)中實(shí)現(xiàn),但它依賴較強(qiáng)的概率假設(shè),模型上的偏差限制了它在實(shí)際應(yīng)用中的性能。近年來,隨著GPU算力的增加以及海量標(biāo)注數(shù)據(jù)的積累,基于神經(jīng)網(wǎng)絡(luò)的灰盒式機(jī)器學(xué)習(xí)算法得到應(yīng)用,神經(jīng)網(wǎng)絡(luò)訓(xùn)練使用反向梯度傳播算法,能夠自動(dòng)地從訓(xùn)練數(shù)據(jù)中學(xué)到特征提取方法,擺脫人工特征設(shè)計(jì)的效率約束。很多現(xiàn)有神經(jīng)網(wǎng)絡(luò)性能優(yōu)越,但龐大的參數(shù)存儲(chǔ)量限制了其在嵌入式系統(tǒng)上的實(shí)現(xiàn)。近年來的研究發(fā)現(xiàn),很多神經(jīng)網(wǎng)絡(luò)架構(gòu)中存在大量冗余的運(yùn)算和參數(shù),通過運(yùn)算的簡(jiǎn)化和架構(gòu)裁剪能夠大大降低神經(jīng)網(wǎng)絡(luò)對(duì)計(jì)算性能和內(nèi)存的需求,使得在嵌入式系統(tǒng)上實(shí)現(xiàn)它成為可能。本書中討論的內(nèi)容覆蓋基于統(tǒng)計(jì)學(xué)習(xí)和基于神經(jīng)網(wǎng)絡(luò)的機(jī)器學(xué)習(xí)算法在嵌入式系統(tǒng)上的實(shí)現(xiàn),通過算法和例程介紹具體的優(yōu)化手段。
書中給出了通過詳細(xì)的手工優(yōu)化步驟以說明嵌入式機(jī)器學(xué)習(xí)算法的優(yōu)化過程,但隨著機(jī)器學(xué)習(xí)算法復(fù)雜度的增加和規(guī)模的擴(kuò)大,手動(dòng)優(yōu)化效率顯得較低。對(duì)部分優(yōu)化過程,我們給出了軟件輔助優(yōu)化的介紹,比如通過軟件自動(dòng)搜索加減圖實(shí)現(xiàn)多常數(shù)乘法,使用軟件控制神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程,消除網(wǎng)絡(luò)參數(shù)和架構(gòu)上的冗余,以及通過軟件自動(dòng)從訓(xùn)練得到的模型中提取參數(shù)并自動(dòng)生成C語(yǔ)言源代碼。讀者可以基于這些代碼進(jìn)一步拓展,構(gòu)建自動(dòng)化的嵌入式機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)工具。在撰寫本書期間,出現(xiàn)了多種嵌入式機(jī)器學(xué)習(xí)算法框架和算法部署工具,大大提高了機(jī)器學(xué)習(xí)算法在嵌入式系統(tǒng)中的部署效率。從長(zhǎng)遠(yuǎn)看,使用更高層的機(jī)器學(xué)習(xí)算法來訓(xùn)練和優(yōu)化當(dāng)前機(jī)器學(xué)習(xí)算法會(huì)是研究趨勢(shì)。
書中介紹的部分底層算法代碼以Python語(yǔ)言形式給出,這考慮了Python語(yǔ)言的表達(dá)能力和程序簡(jiǎn)潔性,在實(shí)際應(yīng)用中需要讀者在理解算法原理的基礎(chǔ)上改成C程序?qū)崿F(xiàn)。另外,書中列舉的機(jī)器學(xué)習(xí)問題集中在基本的手寫識(shí)別數(shù)據(jù)或者簡(jiǎn)單圖像分類問題上,選擇這些機(jī)器學(xué)習(xí)問題,是考慮到它們的訓(xùn)練速度快,模型構(gòu)建代碼量小,能夠在有限篇幅內(nèi)解釋清楚,但所介紹的方法能夠應(yīng)用于更復(fù)雜的機(jī)器學(xué)習(xí)算法和模型。
機(jī)器學(xué)習(xí)涉及建模、訓(xùn)練和推理這幾個(gè)部分,本書的重點(diǎn)在于嵌入式系統(tǒng)中的機(jī)器學(xué)習(xí)算法推理過程的實(shí)現(xiàn),對(duì)機(jī)器學(xué)習(xí)本身的理論模型介紹相對(duì)較少,因此需要讀者在閱讀之前了解基本的機(jī)器學(xué)習(xí)算法知識(shí)。另外,要掌握本書介紹的近似算法,需要讀者提前了解一些線性代數(shù)的知識(shí)。
本書的撰寫工作得到了Arm中國(guó)大學(xué)計(jì)劃的幫助和支持,在此表示感謝!
應(yīng)忍冬
2021年6月于上海
前言
第1章 緒論 1
1.1 AI嵌入式系統(tǒng)的概念與特點(diǎn) 1
1.2 機(jī)器學(xué)習(xí)在嵌入式系統(tǒng)中的實(shí)現(xiàn) 4
1.3 本書內(nèi)容概述 6
第2章 嵌入式軟件編程模式和優(yōu)化 8
2.1 嵌入式軟件編程模式 8
2.1.1 基于周期調(diào)用的運(yùn)行模式 9
2.1.2 基于中斷的前后臺(tái)運(yùn)行模式 12
2.1.3 基于事件隊(duì)列的運(yùn)行模式 14
2.1.4 帶時(shí)間信息的事件隊(duì)列運(yùn)行模式 16
2.1.5 計(jì)算圖運(yùn)行模式 17
2.2 通用軟件優(yōu)化方法 20
2.2.1 循環(huán)結(jié)構(gòu)優(yōu)化 21
2.2.2 時(shí)間空間平衡 23
2.2.3 運(yùn)算精度和性能平衡 25
2.2.4 底層運(yùn)算的快速實(shí)現(xiàn)算法 28
2.2.5 內(nèi)存使用優(yōu)化 30
2.3 小結(jié) 34
參考文獻(xiàn) 34
第3章 機(jī)器學(xué)習(xí)算法概述 35
3.1 高斯樸素貝葉斯分類器 35
3.1.1 原理概述 35
3.1.2 模型訓(xùn)練和推理 36
3.2 感知器 38
3.2.1 原理概述 38
3.2.2 模型訓(xùn)練和推理 39
3.3 SVM分類器 40
3.3.1 原理概述 40
3.3.2 模型訓(xùn)練和推理 42
3.4 決策樹 43
3.4.1 原理概述 43
3.4.2 模型訓(xùn)練和推理 44
3.4.3 決策樹分類器的代碼實(shí)現(xiàn) 45
3.5 線性數(shù)據(jù)降維 47
3.5.1 原理概述 47
3.5.2 模型訓(xùn)練和推理 47
3.6 神經(jīng)網(wǎng)絡(luò) 48
3.6.1 原理概述 48
3.6.2 模型訓(xùn)練和推理 50
3.7 小結(jié) 54
參考文獻(xiàn) 54
第4章 數(shù)值的表示和運(yùn)算 55
4.1 浮點(diǎn)數(shù) 55
4.1.1 單精度和雙精度浮點(diǎn)數(shù) 55
4.1.2 16位浮點(diǎn)數(shù) 57
4.2 定點(diǎn)數(shù) 61
4.2.1 定點(diǎn)數(shù)的二進(jìn)制表示形式 61
4.2.2 定點(diǎn)數(shù)的運(yùn)算 64
4.2.3 給定算法的定點(diǎn)化方法 71
4.3 仿射映射量化 78
4.3.1 量化數(shù)據(jù)表示 78
4.3.2 量化數(shù)據(jù)運(yùn)算 83
4.3.3 基于量化數(shù)據(jù)的矩陣運(yùn)算 84
4.4 常數(shù)整數(shù)乘法優(yōu)化 88
4.4.1 基于正則有符號(hào)數(shù)的常數(shù)整數(shù)乘法優(yōu)化 89
4.4.2 基于運(yùn)算圖的常數(shù)整數(shù)乘法優(yōu)化 92
4.4.3 多常數(shù)整數(shù)乘法優(yōu)化 97
4.4.4 浮點(diǎn)數(shù)和整數(shù)常數(shù)乘法優(yōu)化 101
4.4.5 常數(shù)整數(shù)乘法優(yōu)化的應(yīng)用 103
4.5 小結(jié) 108
參考文獻(xiàn) 108
第5章 卷積運(yùn)算優(yōu)化 109
5.1 卷積運(yùn)算的定義 109
5.1.1 一維線性卷積 110
5.1.2 一維循環(huán)卷積 111
5.1.3 二維線性卷積 112
5.1.4 二維循環(huán)卷積 113
5.2 快速卷積算法 114
5.2.1 一維循環(huán)卷積頻域快速算法 114
5.2.2 短序列一維線性卷積快速算法 117
5.2.3 長(zhǎng)序列一維線性卷積的構(gòu)建 124
5.2.4 快速FIR濾波器算法 129
5.2.5 二維快速卷積算法 140
5.3 近似卷積算法 152
5.3.1 基于卷積核低秩分解的二維快速卷積 153
5.3.2 矩形卷積核近似卷積 154
5.3.3 分段線性卷積核近似 160
5.3.4 卷積核的分段近似 164
5.3.5 基于IIR濾波器的近似卷積 168
5.3.6 基于卷積核低秩近似的二維近似快速卷積 172
5.3.7 基于二維矩形卷積核的近似快速卷積 173
5.4 小結(jié) 176
參考文獻(xiàn) 177
第6章 矩陣乘法優(yōu)化 178
6.1 機(jī)器學(xué)習(xí)算法中的矩陣乘法 178
6.2 Strassen矩陣相乘算法 180
6.3 Winograd矩陣相乘算法 184
6.4 低秩矩陣乘法 187
6.5 循環(huán)矩陣乘法 188
6.6 近似矩陣乘法 190
6.6.1 基于矩陣低秩近似的矩陣乘法 191
6.6.2 基于數(shù)據(jù)統(tǒng)計(jì)相關(guān)性的近似矩陣乘法 192
6.6.3 基于向量量化的近似矩陣乘法 194
6.7 小結(jié) 202
參考文獻(xiàn) 203
第7章 神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)與優(yōu)化 204
7.1 神經(jīng)網(wǎng)絡(luò)基本運(yùn)算及軟件實(shí)現(xiàn) 205
7.1.1 全連接層運(yùn)算 205
7.1.2 卷積層運(yùn)算 207
7.1.3 BN層運(yùn)算 213
7.1.4 激活層運(yùn)算 214
7.1.5 池化層運(yùn)算 216
7.1.6 神經(jīng)網(wǎng)絡(luò)示例 217
7.2 神經(jīng)網(wǎng)絡(luò)的權(quán)重系數(shù)優(yōu)化 221
7.2.1 權(quán)重系數(shù)二值化 222
7.2.2 權(quán)重系數(shù)的定點(diǎn)數(shù)量化 224
7.2.3 權(quán)重系數(shù)量化和神經(jīng)網(wǎng)絡(luò)訓(xùn)練結(jié)合 226
7.3 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化 233
7.3.1 剪枝優(yōu)化 233
7.3.2 卷積結(jié)構(gòu)優(yōu)化 245
7.3.3 知識(shí)蒸餾 251
7.4 小結(jié) 255
參考文獻(xiàn) 255
第8章 ARM平臺(tái)上的機(jī)器學(xué)習(xí)編程 257
8.1 CMSIS軟件框架概述 258
8.2 CMSIS-DSP軟件框架和編程 261
8.2.1 矩陣運(yùn)算 263
8.2.2 高斯樸素貝葉斯算法實(shí)現(xiàn) 267
8.2.3 SVM算法實(shí)現(xiàn) 271
8.2.4 數(shù)據(jù)降維 275
8.3 基于CMSIS-NN的神經(jīng)網(wǎng)絡(luò)編程 277
8.3.1 基于卷積神經(jīng)網(wǎng)絡(luò)的手寫數(shù)字識(shí)別算法 277
8.3.2 CMSIS-NN的卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn) 278
8.3.3 卷積神經(jīng)網(wǎng)絡(luò)的定點(diǎn)化 282
8.3.4 數(shù)據(jù)存儲(chǔ)和格式轉(zhuǎn)換 287
8.4 ARM Compute Library軟件框架和編程 288
8.4.1 基于ACL庫(kù)的圖像處理編程 289
8.4.2 基于ACL庫(kù)的神經(jīng)網(wǎng)絡(luò)編程 292
8.5 ARM NN軟件框架和編程 306
8.5.1 基于ARM NN運(yùn)行神經(jīng)網(wǎng)絡(luò)模型 307
8.5.2 基于ONNX格式的機(jī)器學(xué)習(xí)模型構(gòu)建 310
8.6 ARM的SIMD指令編程 316
8.6.1 NEON編程的基本概念和數(shù)據(jù)寄存器 317
8.6.2 基于C語(yǔ)言的NEON編程 319
8.7 小結(jié) 330
附錄A 補(bǔ)充數(shù)據(jù)和列表 332
附錄B 技術(shù)術(shù)語(yǔ)表 338