EMLL高性能端側(cè)機(jī)器學(xué)習(xí)計(jì)算庫(kù)
EMLL(Edge ML Library)為加速終端側(cè)設(shè)備上機(jī)器學(xué)習(xí)的推理而設(shè)計(jì),提供基于端側(cè)處理器的高性能機(jī)器學(xué)習(xí)計(jì)算函數(shù)庫(kù)。EMLL支持fp32、fp16、int8等數(shù)據(jù)類型,已在有道詞典筆、翻譯王和超級(jí)詞典等硬件產(chǎn)品的機(jī)器翻譯和語(yǔ)音識(shí)別引擎中應(yīng)用,大幅降低了推理延遲。
特點(diǎn)
高性能
EMLL實(shí)現(xiàn)的矩陣乘法函數(shù),為端側(cè)人工智能中常見的扁平矩陣作了專門的優(yōu)化,為各常見ARM處理器作了特定的優(yōu)化。對(duì)于cortex-A35/A53/A55處理器,本庫(kù)針對(duì)它們的流水線特點(diǎn),使用了匯編級(jí)別的優(yōu)化。
下面是單精度矩陣乘法的測(cè)試結(jié)果:
矩陣乘法的通式為 C[MxN] = A[MxK] B[KxN];所列數(shù)據(jù)為全行主序和全列主序的最好性能。
易用性
EMLL使用的函數(shù)接口在參數(shù)設(shè)計(jì)上力求簡(jiǎn)潔直接,矩陣乘法去掉了不常用的LD*參數(shù),矩陣和向量的傳遞通過(guò)指針和整數(shù)維度分別傳遞。本庫(kù)的構(gòu)建和運(yùn)行不依賴第三方計(jì)算庫(kù)。
擴(kuò)展性
對(duì)于矩陣乘法和量化函數(shù),EMLL 庫(kù)提取了它們和架構(gòu)無(wú)關(guān)的代碼作為通用的宏,這些宏可以在支持新的CPU架構(gòu)時(shí)大大節(jié)省所需的代碼量。
EMLL 應(yīng)用接口
EMLL提供基于 C 的接口,詳情請(qǐng)見 Usage_ZH.md。
| 函數(shù)類型 | 函數(shù)名稱 | 函數(shù)參數(shù) |
|---|---|---|
| 矩陣乘法 | data_type + "gemm" | 源矩陣排列順序,各矩陣地址,M,N,K,beta,并行線程數(shù) |
| 全連接層(單精度) | "fc" | src/weight/bias/output的地址,M,K,N,源矩陣排列順序,(并行線程數(shù)) |
| 量化 | "quantize_" + "symmetric"/"asymmetric" + input_type + output_type | 輸入數(shù)組,輸出數(shù)組,(輸出零點(diǎn)值),縮放值,數(shù)組大小,輸入范圍 |
| 重量化 | "requantize_" + "symmetric/asymmetric" + "_XtoY" | 輸入數(shù)組,輸出數(shù)組,(輸出零點(diǎn)值),輸出縮放值,數(shù)組大小,輸入范圍 |
| 偏置 | "bias" + data_type | 被偏置的矩陣,標(biāo)量偏置,平行于主方向的向量偏置,平行于次方向的向量偏置,矩陣大小 |
各函數(shù)支持的數(shù)據(jù)類型
| 處理器 | 矩陣乘法 | 偏置 | 量化 | 重量化 |
|---|---|---|---|---|
| ARMv7a 32-bit | fp32,(u)int8 | fp32,int32 | fp32 -> (u)int16/(u)int8 | int32 -> (u)int16/(u)int8,int16 -> (u)int8 |
| ARMv8a 64-bit | fp32,fp16,(u)int8 | fp32,int32 | fp32 -> (u)int16/(u)int8 | int32 -> (u)int16/(u)int8,int16 -> (u)int8 |
EMLL 支持在 Linux 和安卓系統(tǒng)上運(yùn)行。
EMLL 支持用 GCC 和 Clang 編譯。
