此為初稿,後續将繼續完善。
目錄
- 前言
- 一、移動端機器學習
-
- 移動平台包含的範圍
- 邊緣計算
-
- 基本概念
- 本質
- 面臨的挑戰
- 邊緣計算應用
- 移動平台化
- 資料預處理
- 二、移動端開發核心學習路徑
- 三、ARM體系結構
-
- 概述
- 執行模式
- 性能優化模式
- 基礎資料類型
- AArch64向量格式
- AArch32向量格式
- Neon指令集
- Neon指令集處理模式
- ARM記憶體模式
- ARM加速方法
- 四、優化以及案例分析
-
- Tensoflow Lite案例
-
- Tensoflow Lite建構
- 案例
前言
移動平台開發的基礎原理與架構設計
基礎 AI 與移動平台開發核心學習路徑
掌握核心模型裁剪與優化的工程方法
基于優化的TensorFlow Lite的落地案例
行動電話
平闆電腦
可穿戴裝置
智能手環、智能手環、智能眼鏡、智能腰帶
嵌入式裝置:樹莓派
邊緣計算節點
- 在邊緣測發起應用
- 就近提供服務
- 更快響應使用者
- 實時、智能、安全與隐私
- 在本地完成計算而不交給雲端處理
- 確定處理穩定,降低雲端的工作負載
- 傳輸帶寬
-
硬體性能與軟體優化
5G
萬物互聯,參數了邊緣計算。邊緣測
- 消防與安全監控
- 環境控制
- 油、氣遠端監測
- 交通管理
- 自動駕駛
Machine learing on the go
雲計算與邊緣計算的差別
移動平台
記憶體 體系結構
計算問題
模型檔案巨大,臨時記憶體空間,計算過程中占據的記憶體空間。
tf pytoch
指令集加速
減小模型體積
TF-Lite 前向引擎,在移動平台。
速度越快,加劇負載。普遍性的優化。特定性的場景優化有時無能為力。
移動深度學習架構開發。
國内:
騰訊 NCNN
百度 PaddleLite
不能完全依賴架構
稀疏量化
有時犧牲精度,追求速度,平衡點。
總結:
在移動就是在移動平台運作。
雲端: ws
實時本地運作技術, 尤為關鍵。自動駕駛,
降低功耗,提高性能和效率。
ARM體系結構、Neon指令集、Neon Intrinsics、線性倒數優化問題、卷積、池化、ARM Linux開發基地、ARM工具鍊、主流前向引擎和架構、架構、代碼結構等、ARM記憶體模型、指令加速。
缺失值處理、去噪聲、平滑、去均值、歸一化、标準化、使用和掌握實時處理系統、程式設計實戰等
- ARM體系結構時一種精簡指令集計算(Reduced Instruction Set Commpution, RISC)體系結構。
- 内置大量通用寄存器。
- 體系結構設計采用了加載/存儲模式,也就是所有的資料處理都是在寄存器中完成的,無法直接處理記憶體。
- 尋址模式簡單,所有的加載/存儲位址都來自寄存器内容和指令字段。
- ARM體系結構充分考慮了實作規模、架構性能和低功耗,這些特定使得其非常适用于具有不同要求的場景。
X86 複雜指令集計算。
- AArch64,也就是64位執行模式,一般體系結構稱之為aarch64。這種執行模式是ARMv8的新執行模型。
- AArch32,也就是32執行模式,一般體系結構稱之為arm,這種執行模式是ARM v7a架構,同時也支援AArch64模式帶來的一些增強特性。
- SIMD指令
- 浮點指令集
v8向下相容
CPU下的SIMD指令:單指令,多資料。
類似于pc和伺服器端采用的:Gpu計算采用的模式
- 整形:位元組(Byte, 8位);半字(Halfword, 16位);字(word, 32位);雙字(Doubleword, 64位);4字(Quadword, 128位)
- 浮點類型:半精度(16位);單精度(32位);雙精度(64位);32位和64位的定點數表示
在AArch64狀态下,使用Vn表示SIMD和浮點數寄存器,其中n的取值範圍是0~31,也就是一共32個寄存器。引用寄存器的方式為Vn*CM,SIMD和浮點寄存器提供了3種具體的資料格式,分别是:
- 單元素标量,也就是整個寄存器的最低部分。
-
64位向量
位元組(Byte, 8位);半字(Halfword, 16位);字(word, 32位)
引用方式,Vn{.2S, .4H, .8B}
-
128位向量
位元組(Byte, 8位);半字(Halfword, 16位);字(word, 32位);雙字(Doubleword, 64位)
引用方式:Vn{.2D, .4S, .8h, 16B}
- 32位模式的ARM使用的向量寄存器類型描述方式與64位不同
- 64位在寄存器引用種說明了向量資料類型
-
32位模式則選擇在指令中說明具體向量資料類型
比如向量乘法指令是VMUL,資料類型說明符是.F32,那麼針對這種資料類型的向量指派指令就是VMUL.F32。
- 資料類型說明符
- Neon是由ARM提出的一種壓縮SIMD技術
- Neon指令将寄存器看出相同資料類型的向量,并且支援多種資料類型
- Neon指令可以對所有支援的寄存器執行相同的操作
- 不同的資料類型支援不同的數量的操作指令
- 在新的ARM v8.2-A和ARM v8-A/R體系結構中,Neon甚至還能支援多指令并行,使得整體運算效率更上一層樓。
- ARM支援的資料類型表
- 單指令單資料
- 每個指令指定單個資料源,處理多個資料時需要多條指令
- 速度慢
- 單指令多資料(向量模式)
- 使用同一條指令處理多個資料源(如果控制器寄存器的長度為N,那麼一條向量可以執行N個運算)
- 多次運算操作時依次執行而不是同時執行的
- 速度快于單指令單資料
- 單指令多資料(組合資料模式)
- 将一個寄存器分為N個D位的獨立運算部分;
- 各個部分獨立運算(比如64位寄存器拆分為4個16位資料);
- N個部分運算不會互相産生影響;
- 速度最快,目前的主流模式。
ARMv8定義了多層次的存儲系統
- 在主存和CPU之間設計了多層次的緩存(Cache),以平衡存儲器大小和記憶體通路言辭
- ARM隻是一個标準,各個廠家的具有實作可以不同
- 記憶體
- 記憶體對齊:通路非對齊記憶體的指令一般會消耗比較多的指令周期,是以在涉及大量資料計算時必須確定資料存儲、資料通路盡量保持記憶體對齊。
- 緩存預加載:使用指令将自己後續一段時間希望使用的記憶體位址告知硬體的存儲管理器,但處理器可以自行決定如何處理,是以具有不确定性。
-
- 開源庫:如OpenBLAS, Eigen等
- 編譯器的自動向量化特性
- Compiler intrinsics: ARM提供的編譯器内聯函數,可讀性較好,編譯器可以再次自動優化
- 彙編指令:可讀性與維護性較差,AArch64不支援内聯彙編,一般建議采用Compiler instinsics
Tensoflow Lite建構基于Bazel
- 多語言支援:Bazel支援Java、Objective-C和C/C++,可以擴充支援任務語言
- 進階别的建構語言:通過BUILD的DSL支援建構,可以簡單描述複雜的建構任務
- 多平台支援:支援多平台建構
- 伸縮性:可以靈活采用多台伺服器并行處理建構
- BUILD檔案裁剪
- CPU體系結構
- 系統平台
- 裁剪操作
- 位置:kernel/mutable_op_resolver
- 處理内置函數:AddBuiltin
- 處理自定義函數:AddCustom
- 可以根據情況自行裁剪操作符
- 操作符擴充與優化
build可以删除不需要的平台支援,得到tf-lite的二進制檔案會小的多,删除不需要的操作符。
删除操作符注冊資訊和源代碼,這樣可以大幅減小tf-lite編譯出來的檔案。
直接找到addBuilitin和AddCustom,然後針對某些操作進行改進,用到arm指令集的優化,做針對性的優化。
圖像分類