Tvm一些基本技术
Tvm一些基本技術(shù)
一、總體流程:
TVM的工作流程:首先,將網(wǎng)絡(luò)表示成統(tǒng)一的表示形式(Intermediate Representation),并進(jìn)行一些可重用的圖優(yōu)化;然后,利用不同的后端生成對(duì)應(yīng)設(shè)備代碼,如圖1所示。
圖1 tvm 工作流程
首先,將不同的框架下的模型載入,并使用NNVM將模型轉(zhuǎn)換成中間表示的計(jì)算圖,并對(duì)圖進(jìn)行優(yōu)化,如算子融合、減枝、圖變換等;然后,TVM對(duì)張量運(yùn)算進(jìn)行優(yōu)化,TVM將代碼的調(diào)度和計(jì)算分開(kāi)(計(jì)算:定義需要進(jìn)行的運(yùn)算,調(diào)度:具體如何來(lái)進(jìn)行運(yùn)算);最后,使用不同的后端,來(lái)生成對(duì)應(yīng)設(shè)備代碼,如圖1所示,使用LLVM生成x86,ARM和Javescript/WASM系統(tǒng)代碼,OpenCL、Metal和CUDA生成對(duì)應(yīng)的GPU代碼,通過(guò)這種中間堆棧(IR Stack)表示的方式,實(shí)現(xiàn)端到端的深度學(xué)習(xí)模型優(yōu)化和部署,這種方式將實(shí)現(xiàn)op的復(fù)雜度轉(zhuǎn)移到了編譯規(guī)則的復(fù)雜度。
二、優(yōu)化計(jì)算圖
1、算子融合(operator Fusion)
算子融合,即將多個(gè)算子組合在一起放到同一個(gè)核中,通過(guò)算子融合的方式,不需要將中間結(jié)果保存到全局內(nèi)存,進(jìn)而減少執(zhí)行所需要的時(shí)間,已知的算子融合分為四種,如圖2所示:
圖2 算子融合示意圖
injective(單射性):一到一的映射,如:add / sqrt / exp / sum 等操作算子(operator);
reduction(簡(jiǎn)約):多到少的映射,如:sum / max / min等操作操作算子(operator);
complex-out-fusable:逐元素復(fù)用映射到輸出,如:conv2d / bn / relu等操作算子(operator);
opaque:不能被復(fù)用
這種算子組合太多了,專門針對(duì)這些組合手寫底層優(yōu)化不太現(xiàn)實(shí),需要做一些自動(dòng)代碼生成。
2、數(shù)據(jù)布局變換:
當(dāng)代計(jì)算架構(gòu)中,從內(nèi)存中載入數(shù)據(jù)的時(shí)間要遠(yuǎn)遠(yuǎn)大于進(jìn)行一次浮點(diǎn)運(yùn)算所耗費(fèi)的時(shí)間,要重復(fù)使用載入內(nèi)存或寄存器中的數(shù)據(jù)。
首先看一下3x3的卷積操作,如圖3所示:
圖3 無(wú)tile的3x3卷積操作示意圖
不采用tile的方式,每個(gè)線程載入一個(gè)3x3大小輸入得到一個(gè)輸出,16個(gè)線程需要進(jìn)行16x9次數(shù)據(jù)載入,如果采用tile方式,如圖4所示:
圖4 有tile的數(shù)據(jù)載入
采用tile方式時(shí),每個(gè)線程載入4x4大小輸入得到2x2大小的輸出,4個(gè)線程需要進(jìn)行4x16次數(shù)據(jù)載入。
三、優(yōu)化張量計(jì)算
張量表達(dá)語(yǔ)言(Tensor Expression Language):直接描述每一個(gè)單元如何計(jì)算。
這樣的tensor表示(數(shù)學(xué)公式表達(dá)),可以涵蓋幾乎所有的高層算子,可以很容易做代碼生成,因?yàn)閷?duì)應(yīng)的表達(dá)式已經(jīng)確定了。然后就是將tensor expression映射到不同硬件上:
這里涉及到的問(wèn)題有:算子張量化的問(wèn)題、cache問(wèn)題、數(shù)據(jù)類型問(wèn)題(float32,float16,、int8)
解決方案: 將所有手工優(yōu)化的可能(10億級(jí)別的)總結(jié)起來(lái),并將他們作為搜索空間的一部分,然后自動(dòng)進(jìn)行搜索,這里采用auto-tvm來(lái)自動(dòng)進(jìn)行搜素每個(gè)算子的最優(yōu)實(shí)現(xiàn)。
tvm的上限比手寫優(yōu)化做得更好
如果是機(jī)器和人同時(shí)去解決一個(gè)問(wèn)題的優(yōu)化,人通過(guò)不斷的去解決,可以做到比機(jī)器好一些,實(shí)際上,機(jī)器不一定要和人解決一樣的問(wèn)題,比如融合算子,其可能性太多,人可能沒(méi)有力氣去優(yōu)化這些融合算子,機(jī)器通過(guò)去解決這些人沒(méi)有解決的問(wèn)題,進(jìn)而達(dá)到更高的效率;反過(guò)來(lái),當(dāng)搜索空間越來(lái)越大,包含了人所有的搜索空間時(shí),這時(shí),哪怕直接和人的手寫優(yōu)化一一對(duì)應(yīng),機(jī)器也可以達(dá)到和人做的優(yōu)化差不多,甚至更好都有可能。
總之:
總結(jié)
- 上一篇: 北汽蓝谷和北汽新能源
- 下一篇: Tengine AIFramework框