?文章來源地址http://www.zghlxwxcb.cn/news/detail-811527.html
神經(jīng)網(wǎng)絡(luò)研發(fā)加速器
神經(jīng)網(wǎng)絡(luò)編譯器組成:編譯器、圖表示、圖優(yōu)化、計(jì)算優(yōu)化、代碼生成。
?文章來源:http://www.zghlxwxcb.cn/news/detail-811527.html
神經(jīng)網(wǎng)絡(luò)編譯器
問題: 如何將高級(jí)別的神經(jīng)網(wǎng)絡(luò)模型有效轉(zhuǎn)換為在多種硬件上運(yùn)行的優(yōu)化代碼?
ONNX的角色:
- 統(tǒng)一格式:ONNX提供了一個(gè)標(biāo)準(zhǔn)化的格式來表示不同深度學(xué)習(xí)框架中的模型。它使模型可以在不同的框架和工具之間輕松轉(zhuǎn)換,從而增強(qiáng)了模型的可移植性和互操作性。
- 模型交換:ONNX使得開發(fā)者可以選擇最適合他們需求的工具和框架來訓(xùn)練模型,并且能夠輕松地將這些模型轉(zhuǎn)換為ONNX格式,用于部署。
神經(jīng)網(wǎng)絡(luò)編譯器的角色:
- 優(yōu)化和轉(zhuǎn)換:神經(jīng)網(wǎng)絡(luò)編譯器接收特定格式(如ONNX)的深度學(xué)習(xí)模型,并將其編譯和優(yōu)化以在特定硬件上運(yùn)行。這包括轉(zhuǎn)換模型為硬件特定的指令集,進(jìn)行圖優(yōu)化、算子融合等。
- 跨平臺(tái)部署:編譯器使得模型不僅可以在不同的框架中移植,還可以在不同的硬件平臺(tái)上高效運(yùn)行,如CPU、GPU、FPGA或?qū)S肁I加速器。
協(xié)同工作流程:
- 模型訓(xùn)練:
- 開始于:深度學(xué)習(xí)模型首先在特定的框架(如TensorFlow, PyTorch, MXNet等)中進(jìn)行訓(xùn)練。
- 輸出:訓(xùn)練完成后的模型通常以該框架的特定格式存儲(chǔ)。
- 模型轉(zhuǎn)換(使用ONNX):
- 轉(zhuǎn)換工具:使用ONNX提供的工具將模型從原始框架轉(zhuǎn)換成ONNX格式。這一步驟涉及將模型的結(jié)構(gòu)和權(quán)重導(dǎo)出到ONNX定義的統(tǒng)一格式中。
- 輸出:轉(zhuǎn)換后的模型現(xiàn)在在一個(gè)標(biāo)準(zhǔn)化的ONNX格式中,使得它可以跨不同的深度學(xué)習(xí)框架和工具共享。
- 模型優(yōu)化和編譯(使用神經(jīng)網(wǎng)絡(luò)編譯器):
- 編譯器輸入:編譯器接收ONNX格式的模型。
- 優(yōu)化過程:編譯器對(duì)模型進(jìn)行一系列優(yōu)化,如算子融合、圖優(yōu)化、消除冗余計(jì)算等,以提高模型在目標(biāo)硬件上的運(yùn)行效率。
- 硬件特定優(yōu)化:編譯器還會(huì)針對(duì)特定的目標(biāo)硬件(如CPU, GPU, FPGA等)進(jìn)行優(yōu)化,生成適合該硬件的低級(jí)代碼。
- 部署和執(zhí)行:
- 部署:優(yōu)化后的模型被部署到目標(biāo)硬件上。
- 執(zhí)行:模型在目標(biāo)設(shè)備上執(zhí)行,進(jìn)行推理任務(wù),如圖像識(shí)別、語(yǔ)音識(shí)別等。
總結(jié):
- ONNX的作用:提供了一個(gè)中間橋梁,允許不同框架中訓(xùn)練的模型被統(tǒng)一表示和共享。
- 神經(jīng)網(wǎng)絡(luò)編譯器的作用:進(jìn)一步優(yōu)化ONNX格式的模型,確保它們?cè)谔囟ㄓ布细咝н\(yùn)行。
?
【圖表示】:
ONNX 兩個(gè)主要的 Protobuf 協(xié)議對(duì)象:TensorProto、AttributeProto。
-
TensorProto:
- 這個(gè)結(jié)構(gòu)用于定義神經(jīng)網(wǎng)絡(luò)中的張量(多維數(shù)組),它包含張量的維度(dims)、數(shù)據(jù)類型(data_type)、數(shù)據(jù)本身(float_data, int32_data, string_data, int64_data, raw_data等),以及數(shù)據(jù)存儲(chǔ)順序(通常為行主序)。
- TensorProto可以包含任何類型的數(shù)據(jù),包括原始的字節(jié)數(shù)據(jù),這在存儲(chǔ)復(fù)雜的或非標(biāo)準(zhǔn)格式的張量時(shí)非常有用。
-
AttributeProto:
- 用于定義圖中節(jié)點(diǎn)屬性的結(jié)構(gòu),它可以包含單個(gè)的數(shù)據(jù)值(如浮點(diǎn)數(shù)、整數(shù)、字符串、圖、張量)或這些數(shù)據(jù)類型的數(shù)組。
- 每個(gè)屬性都有一個(gè)名字(name)和一個(gè)類型(AttributeType),類型決定了屬性值可以是哪種數(shù)據(jù)。
這些協(xié)議對(duì)象是ONNX標(biāo)準(zhǔn)的一部分,使得ONNX能夠以一種跨平臺(tái)、跨語(yǔ)言的方式精確地表示神經(jīng)網(wǎng)絡(luò)模型的結(jié)構(gòu)和權(quán)重。
它們使得模型可以從一個(gè)框架轉(zhuǎn)換并在另一個(gè)框架中使用,這對(duì)于深度學(xué)習(xí)模型的共享和部署至關(guān)重要。
【圖優(yōu)化】:
- 節(jié)點(diǎn)融合: 將多個(gè)操作符(Op)融合為單個(gè)復(fù)合操作符,以減少內(nèi)存訪問次數(shù)和計(jì)算開銷。例如,將卷積、批量歸一化和激活函數(shù)合并為一個(gè)操作。
- 常量折疊: 在編譯時(shí)預(yù)計(jì)算那些以常量輸入進(jìn)行的操作,減少運(yùn)行時(shí)的計(jì)算量。
-
死代碼消除: 移除那些不會(huì)影響最終輸出的操作,比如未使用的變量或操作。
-
公共子表達(dá)式消除: 檢測(cè)并合并計(jì)算圖中重復(fù)的表達(dá)式,以節(jié)省計(jì)算資源。
-
內(nèi)存優(yōu)化: 優(yōu)化數(shù)據(jù)的存儲(chǔ)和訪問方式,減少內(nèi)存使用量,例如通過就地操作(in-place operations)來減少不必要的數(shù)據(jù)復(fù)制。
-
層次融合: 類似節(jié)點(diǎn)融合,但在更高的層次上,比如將多層網(wǎng)絡(luò)結(jié)構(gòu)融合以減少中間數(shù)據(jù)的存儲(chǔ)和傳遞。
-
操作調(diào)度: 優(yōu)化操作的執(zhí)行順序,以提高硬件的使用效率,減少等待時(shí)間。
-
數(shù)據(jù)布局轉(zhuǎn)換: 改變數(shù)據(jù)在內(nèi)存中的排列方式(如NCHW到NHWC),以適配硬件特性,提高內(nèi)存訪問效率。
-
算子融合: 把能夠一起執(zhí)行的多個(gè)算子合并為一個(gè)算子,以減少內(nèi)存訪問和改善緩存使用。
-
精度優(yōu)化: 根據(jù)需要將數(shù)據(jù)類型從高精度(如float64)降低到低精度(如float16或INT8),以加快計(jì)算速度并減少內(nèi)存使用,特別是在支持低精度計(jì)算的硬件上。
所有這些優(yōu)化都是為了減少計(jì)算量、提高執(zhí)行速度、減少內(nèi)存占用,并最大化硬件利用率。
【計(jì)算優(yōu)化】:
-
向量化(Vectorization):
- 利用SIMD指令集對(duì)操作進(jìn)行向量化處理,同時(shí)處理多個(gè)數(shù)據(jù)點(diǎn),提高了數(shù)據(jù)處理速率。
-
首先,三個(gè)獨(dú)立的數(shù)據(jù)向量(A0, A1, A2, A3),(B0, B1, B2, B3),和(C0, C1, C2, C3)被加載到SIMD寄存器中。這通常使用如
_mm_loadu_ps
這樣的指令完成,它可以從非對(duì)齊的內(nèi)存地址加載多個(gè)浮點(diǎn)數(shù)到一個(gè)SIMD寄存器。 -
接下來,使用SIMD加法指令(如
_mm_add_ps
)對(duì)這些向量進(jìn)行逐元素加法操作。這樣,每個(gè)數(shù)據(jù)向量中相應(yīng)的元素將被加在一起。 -
然后,使用SIMD水平加法指令(如
_mm_hadd_ps
),對(duì)加法的結(jié)果進(jìn)行進(jìn)一步的組合。水平加法將一個(gè)SIMD寄存器中的相鄰元素加在一起。 -
最后,使用如
_mm_store_ss
這樣的指令,將計(jì)算的結(jié)果存回內(nèi)存中。
-
并行化(Parallelization):
- 分布計(jì)算工作負(fù)載,利用多核CPU、GPU的多個(gè)計(jì)算單元,或者其他硬件加速器(如FPGA、TPU)的并行處理能力。
- 利用緩存,所需的數(shù)據(jù)可以被連續(xù)地加載到緩存中,而不是隨機(jī)地從內(nèi)存中讀取,提取加速
-
循環(huán)展開(Loop Unrolling):
- 展開循環(huán)結(jié)構(gòu)以減少循環(huán)控制的開銷,并可能使編譯器能夠進(jìn)一步優(yōu)化。
-
內(nèi)存訪問優(yōu)化:
- 通過優(yōu)化數(shù)據(jù)存儲(chǔ)模式和訪問模式來減少緩存未命中和內(nèi)存延遲。
-
算術(shù)強(qiáng)度提升(Increase Arithmetic Intensity):
- 通過減少內(nèi)存操作和增加計(jì)算操作的比例,提高計(jì)算與內(nèi)存?zhèn)鬏數(shù)谋嚷省?/li>
-
算子融合(Operator Fusion):
- 將多個(gè)操作融合為一個(gè)復(fù)合操作,以減少內(nèi)存訪問次數(shù)和提高緩存利用率。
-
內(nèi)核融合(Kernel Fusion):
- 在GPU編程中,將多個(gè)內(nèi)核操作融合成單個(gè)內(nèi)核,減少GPU內(nèi)核啟動(dòng)的開銷。
-
延遲執(zhí)行(Lazy Evaluation):
- 操作只在必要時(shí)執(zhí)行,避免不必要的計(jì)算,節(jié)省資源。
-
精確度與混合精度訓(xùn)練(Precision and Mixed-Precision Training):
- 適當(dāng)降低計(jì)算的精度來加快速度,如使用半精度浮點(diǎn)數(shù)(float16)代替全精度(float32)。
-
特定硬件優(yōu)化:
- 根據(jù)目標(biāo)硬件的特定特性(如GPU的共享內(nèi)存大小、CPU的緩存行大?。┻M(jìn)行優(yōu)化。
-
編譯時(shí)優(yōu)化(Compile-time Optimizations):
- 利用編譯器的高級(jí)優(yōu)化,如去除冗余計(jì)算、優(yōu)化分支預(yù)測(cè)等。
-
動(dòng)態(tài)張量重用(Dynamic Tensor Rematerialization):
- 在運(yùn)行時(shí)動(dòng)態(tài)決定數(shù)據(jù)結(jié)構(gòu)的生命周期,以減少內(nèi)存占用。
-
消除重復(fù)計(jì)算:對(duì)于一個(gè)均值池化,那么橘色部分就是重復(fù)計(jì)算的,可以通過優(yōu)化消除重復(fù)計(jì)算
?
各自實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)編譯器
神經(jīng)網(wǎng)絡(luò)編譯器組成:編譯器、圖表示、圖優(yōu)化、計(jì)算優(yōu)化、代碼生成。
所以,就有了 — 各自實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)編譯器。
- TVM 神經(jīng)網(wǎng)絡(luò)編譯器
- NCNN 神經(jīng)網(wǎng)絡(luò)推理框架
- MNN 移動(dòng)神經(jīng)網(wǎng)絡(luò)引擎
介紹:
-
TVM:https://tvm.apache.org/docs/install/index.html
是一個(gè)開源的神經(jīng)網(wǎng)絡(luò)編譯器框架,它可以將各種深度學(xué)習(xí)模型(如TensorFlow、PyTorch、MXNet等的模型)編譯成優(yōu)化的代碼,以在多種硬件上運(yùn)行,包括CPU、GPU、FPGA等。
TVM特別強(qiáng)調(diào)自動(dòng)化的性能優(yōu)化,使用了一種叫做AutoTVM的系統(tǒng)自動(dòng)調(diào)整模型參數(shù)以適應(yīng)不同的硬件配置。
-
NCNN:https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-linux
由騰訊優(yōu)化的一個(gè)輕量級(jí)深度學(xué)習(xí)框架,專門用于移動(dòng)設(shè)備和邊緣計(jì)算設(shè)備。
它不依賴于第三方庫(kù),非常適合于移動(dòng)應(yīng)用。
NCNN特別關(guān)注于在低功耗設(shè)備上的高性能運(yùn)行,它通過優(yōu)化網(wǎng)絡(luò)的內(nèi)存使用和計(jì)算速度,使得模型在移動(dòng)設(shè)備上能夠快速且有效地執(zhí)行。
-
MNN:https://www.yuque.com/mnn/cn
由阿里巴巴開源的深度學(xué)習(xí)框架,旨在幫助開發(fā)者在端側(cè)設(shè)備上部署AI模型。
MNN的主要特點(diǎn)是支持多平臺(tái)和多后端,能夠在各種設(shè)備上運(yùn)行,如iOS和Android手機(jī)、服務(wù)器和IoT設(shè)備。
它通過優(yōu)化計(jì)算圖,減少內(nèi)存占用,并提供多種量化方案以適應(yīng)不同的應(yīng)用需求。
他們的結(jié)構(gòu)就不一一拆解了。
?
神經(jīng)網(wǎng)絡(luò)加速與壓縮(算法層面)
- 矩陣低秩分解
- 概念:將神經(jīng)網(wǎng)絡(luò)的參數(shù)(例如,全連接層的二維矩陣、卷積層的四維矩陣)通過矩陣分解和低秩近似,分解為多個(gè)計(jì)算總量更小的小矩陣。
- 目的:加速網(wǎng)絡(luò)計(jì)算過程。
- 方法:例如SVD分解、Tucker分解。
-
影響:分解為多層可能增加數(shù)據(jù)讀取次數(shù),影響速度。
?
- 剪枝
- 類型:包括非結(jié)構(gòu)化剪枝和結(jié)構(gòu)化剪枝,以及自動(dòng)化剪枝。
- 非結(jié)構(gòu)化剪枝:去除權(quán)重矩陣中不重要的元素,形成稀疏矩陣,通過稀疏存儲(chǔ)減少模型大小。
- 結(jié)構(gòu)化剪枝:刪除整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的一部分(如通道、過濾器、層),在現(xiàn)有框架上實(shí)現(xiàn)加速。
-
自動(dòng)化剪枝:自動(dòng)確定剪枝結(jié)構(gòu),如AMC(自動(dòng)化模型壓縮)和MetaPruning。
?
- 量化
- 概念:將網(wǎng)絡(luò)參數(shù)和激活值從高精度(如FP32)轉(zhuǎn)化為低精度(如INT8),以加快推理速度。
-
挑戰(zhàn):量化可能導(dǎo)致精度損失,需精心設(shè)計(jì),如數(shù)值對(duì)齊、對(duì)稱和非對(duì)稱量化等。
?
- 知識(shí)蒸餾
- 概念:從大型模型(教師網(wǎng)絡(luò))到小型模型(學(xué)生網(wǎng)絡(luò))的知識(shí)遷移。
- 目的:保持小模型在減少計(jì)算量的同時(shí)獲得較高性能。
-
發(fā)展:許多方法被提出,如FitNet、Attention Transfer,以及無數(shù)據(jù)網(wǎng)絡(luò)壓縮。
?
- 輕量化模型設(shè)計(jì)
- 目標(biāo):設(shè)計(jì)高效、輕量的網(wǎng)絡(luò),替代傳統(tǒng)大型網(wǎng)絡(luò)。
- 方法:使用高效操作,如深度可分離卷積,減少參數(shù)量。
- 代表模型:Google的MobileNet系列,曠視的ShuffleNet。
從結(jié)構(gòu)調(diào)整到參數(shù)精度的多個(gè)層面。
目標(biāo)是在保持模型性能的同時(shí),減少模型的計(jì)算負(fù)擔(dān)和存儲(chǔ)需求,特別適用于資源受限的環(huán)境,如移動(dòng)設(shè)備和邊緣計(jì)算平臺(tái)。
每種技術(shù)都有其獨(dú)特的優(yōu)點(diǎn)和適用場(chǎng)景,在實(shí)際應(yīng)用中往往需要結(jié)合多種技術(shù)來達(dá)到最佳效果。
?
知識(shí)蒸餾
?
低秩分解
?
輕量化網(wǎng)絡(luò)
?
剪枝
?
量化
?
通用芯片 CPU 加速
?
x86 加速
?
arm 加速
?
卷積優(yōu)化
?
神經(jīng)網(wǎng)絡(luò)加速庫(kù)
?
專用芯片 GPU 加速
?
dsp加速
?
faga加速
?
npu加速
?
K210人工智能微控制器
?
神經(jīng)網(wǎng)絡(luò)加速庫(kù): Vulkan圖形計(jì)算
到了這里,關(guān)于AI芯片:神經(jīng)網(wǎng)絡(luò)研發(fā)加速器、神經(jīng)網(wǎng)絡(luò)壓縮簡(jiǎn)化、通用芯片 CPU 加速、專用芯片 GPU 加速的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!