前言
AI芯片(這里只談FPGA芯片用于神經(jīng)網(wǎng)絡(luò)加速)的優(yōu)化主要有三個(gè)方面:算法優(yōu)化配名,編譯器優(yōu)化以及硬件優(yōu)化持灰。算法優(yōu)化減少的是神經(jīng)網(wǎng)絡(luò)的算力竞川,它確定了神經(jīng)網(wǎng)絡(luò)部署實(shí)現(xiàn)效率的上限膀曾。編譯器優(yōu)化和硬件優(yōu)化在確定了算力的基礎(chǔ)上抵知,盡量最大化硬件的計(jì)算和帶寬性能墙基。經(jīng)歷了一年多的理論學(xué)習(xí),開始第一次神經(jīng)網(wǎng)絡(luò)算法優(yōu)化的嘗試刷喜。之所以從一個(gè)FPGA開發(fā)者轉(zhuǎn)向算法的學(xué)習(xí)残制,有幾個(gè)原因:
第一是神經(jīng)網(wǎng)絡(luò)在AI芯片上的部署離不開算法的優(yōu)化。一個(gè)浮點(diǎn)數(shù)的計(jì)算(加法或者乘法)和定點(diǎn)數(shù)的計(jì)算消耗的資源差距很大掖疮,對(duì)于FPGA這樣邏輯資源有限的芯片而言初茶,定點(diǎn)計(jì)算更加友好,而且能夠提升幾倍于浮點(diǎn)計(jì)算的性能浊闪。
第二是神經(jīng)網(wǎng)絡(luò)量化壓縮需要密切的結(jié)合FPGA硬件的特點(diǎn)恼布,需要考慮到FPGA的存儲(chǔ)資源,計(jì)算符號(hào)是否能夠被FPGA友好的實(shí)現(xiàn)等搁宾。在AI加速器項(xiàng)目中桥氏,算法和FPGA都有各自的開發(fā)者,F(xiàn)PGA會(huì)對(duì)算法組提出要求猛铅,比如激活函數(shù)量化字支,normalization如何做等,然后算法組在這些特定要求下去進(jìn)行算法優(yōu)化奸忽。如果一個(gè)人對(duì)FPGA和算法都比較熟悉的話堕伪,那么就會(huì)更容易發(fā)現(xiàn)算法優(yōu)化的點(diǎn)。
第三是FPGA開發(fā)方式的趨勢(shì)是多樣化栗菜。使用RTL語(yǔ)言仍然是主要的開發(fā)方法欠雌,需要一個(gè)人有一定的數(shù)字電路基礎(chǔ)。這種開發(fā)方式最底層疙筹,所以最靈活富俄,可以更好的去調(diào)優(yōu)禁炒。但是同時(shí),F(xiàn)PGA一直渴望去突破固有的開發(fā)方式霍比,讓一個(gè)不懂得硬件的軟件開發(fā)人員也可以很容易的上手幕袱,同時(shí)能夠縮短開發(fā)周期,比如HLS悠瞬。我相信们豌,隨著HLS的發(fā)展和FPGA芯片的演進(jìn),使用這種方式的開發(fā)者會(huì)越來(lái)越多浅妆。在那些算法復(fù)雜望迎,更新較快的項(xiàng)目中,HLS更有優(yōu)勢(shì)凌外,而在一些對(duì)資源辩尊,時(shí)序,功耗要求更高的項(xiàng)目中康辑,RTL更有優(yōu)勢(shì)摄欲。當(dāng)硬件平臺(tái)逐漸軟件化后,必然會(huì)對(duì)FPGA開發(fā)者的算法能力提出更高的要求晾捏。
Transformer網(wǎng)絡(luò)結(jié)構(gòu)
Google在《Attention is all your need》的文章中蒿涎,提出了使用全attention結(jié)構(gòu)替代LSTM的transformer模型,在翻譯任務(wù)上取得了更好的成績(jī)惦辛。這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)計(jì)算量大劳秋,計(jì)算符號(hào)相對(duì)簡(jiǎn)單,有一定的應(yīng)用胖齐,所以適合用于網(wǎng)絡(luò)加速的展示玻淑。結(jié)構(gòu)整體模型如下:
1 embedding
包含了input和output的embedding層,完成詞匯到網(wǎng)絡(luò)輸入向量的轉(zhuǎn)化呀伙,embedding的矩陣大小取決于詞匯量的多少补履,對(duì)于翻譯來(lái)講,通常都是巨大的剿另,所以其不適合放在FPGA上進(jìn)行加速箫锤,沒有量化的必要。Input和output以及softmax前的linear層都共享相同的參數(shù)雨女,這樣做的目的谚攒,是因?yàn)楣蚕韎nput和output權(quán)重能夠降低word level perplexity,當(dāng)然也降低了參數(shù)存儲(chǔ)量氛堕。最后的linear使用embedding的權(quán)重是為了將網(wǎng)絡(luò)向量轉(zhuǎn)化為詞語(yǔ)出現(xiàn)的logits馏臭。
2 positional encoding
Transformer是沒有循環(huán)網(wǎng)絡(luò),為了獲取詞匯位置關(guān)系信息讼稚,對(duì)詞匯進(jìn)行位置編碼括儒。其實(shí)就是給每個(gè)詞匯加上位置偏移绕沈,位置偏移函數(shù)選擇了sin和cos函數(shù):
Pos是詞匯位置,i是詞匯向量的維度位置帮寻。
3 encoder
由多層的multi-head attention和linear組成乍狐,multi-headattention和linear之間由norm和add,add是一個(gè)residual連接规婆。
Multi-head attention結(jié)構(gòu)如下:
Q澜躺,K蝉稳,V分別是query抒蚜,key和value,這是attention機(jī)制中抽象出來(lái)的三個(gè)重要變量耘戚,通過(guò)計(jì)算q和k的相似度嗡髓,得到每個(gè)k對(duì)應(yīng)的v的權(quán)重系數(shù),然后對(duì)value進(jìn)行加權(quán)求和就得到了attention值收津。這個(gè)是attention機(jī)制的本質(zhì)思想饿这。Transformer中使用softmax函數(shù)來(lái)描述相似度,當(dāng)然還有很多其它方法來(lái)描述撞秋。
這里添加了一個(gè)scale1/squart(dk)长捧,這其實(shí)是一個(gè)參數(shù)的調(diào)節(jié),防止矩陣乘法得到結(jié)果太大而導(dǎo)致softmax函數(shù)的梯度太小吻贿。
這里還要注意transformer網(wǎng)絡(luò)沒有對(duì)Q串结,K,V直接進(jìn)行單一的attention計(jì)算舅列,而是對(duì)這三個(gè)變量進(jìn)行了拆分肌割,平行計(jì)算拆分后的變量,得到的attention值最后在拼接在一起帐要。
4 decoder
Decoder和encoder也有類似的結(jié)構(gòu)把敞,不同的是,在decoder中由三層:mask-multi-head attention榨惠,multi-head attention以及FC構(gòu)成奋早。帶mask的multi-head是為了屏蔽target句子詞之后的詞,因?yàn)閷?duì)句子的翻譯應(yīng)該是由前向后進(jìn)行的赠橙,后邊的詞語(yǔ)不應(yīng)該出現(xiàn)在前邊詞語(yǔ)的預(yù)測(cè)之中耽装。
量化方法
量化實(shí)際是一個(gè)仿射變換:
其中s是scale,q是量化后的數(shù)據(jù)简烤,z是偏移剂邮,如果采用對(duì)稱變換,令z為0横侦,那么就有:
去除中心z挥萌,可以消除矩陣計(jì)算中的交叉項(xiàng)绰姻。接下來(lái)就是如何獲得q和s。q和s通過(guò)如下方式獲得:
Clip操作是在最小值n和最大值p之間獲得x/s的向下整數(shù)值引瀑,如果x/s向下整數(shù)值超過(guò)n或者p就取n和p狂芋。
S的值通過(guò)訓(xùn)練獲得,為了保證能夠很好的在FPGA上計(jì)算憨栽,s的值最好可以取得2的冪次帜矾。
由于s和x都是需要訓(xùn)練的參數(shù),所以我們需要求得他們的梯度值屑柔,梯度值比較簡(jiǎn)單屡萤,對(duì)q(x, s)的x和s進(jìn)行求導(dǎo),有:
對(duì)x的梯度使用的是hinton提出的strait-through estimator掸宛,這樣做是因?yàn)榭梢韵炕氲脑肼曀缆剑斓挠?xùn)練。
@