整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Decoder詳解

          Decoder詳解

          Burp Decoder是Burp Suite中一款編碼解碼工具,將原始數(shù)據(jù)轉(zhuǎn)換成各種編碼和散列。

          模塊說明

          輸入域:輸入需要解碼的原始數(shù)據(jù)。

          輸出域:對輸入域進行解碼的結(jié)果進行顯示。

          Decode as 解碼

          Encode as 編碼

          Hash 散列

          編碼解碼類型:URL、HTML、Base64、ASCII、16進制、8進制、2進制、GZIP。

          Hash:SHA、SHA-224、SHA-224、SHA-256、SHA-384、SHA-512、MD2、MD5。

          可以進行多次編碼解碼

          Smart decoding進行智能解碼。

          鍵詞:TransformerDecoder解碼器注意力機制

          前言

          在之前系列的篇章中已經(jīng)介紹了Transformer的Encoder編碼器網(wǎng)絡結(jié)構(gòu),要點知識包括

          1. Transformer系列:Multi-Head Attention網(wǎng)絡結(jié)構(gòu)和代碼解析
          2. Transformer系列:殘差連接原理詳細解析和代碼論證
          3. Transformer系列:快速通俗理解sin-cos的位置編碼

          從本節(jié)開始本系列將對Transformer的Decoder解碼器部分進行深入分析,解碼器也是采用Self Attention作為模型基座,但是解碼器不僅要關注自身輸入的表征,還要聯(lián)合編碼器的結(jié)果做交互,同時對接預測任務,因此解碼器相比于編碼器要更加復雜。


          內(nèi)容摘要

          • Encoder-Decoder框架簡介
          • shifted right移位訓練
          • 解碼器的并行訓練和串行預測
          • 解碼器自注意力層和掩碼
          • 解碼器交互注意力層和掩碼
          • 解碼器輸出和損失函數(shù)

          Encoder-Decoder框架簡介

          理解Transformer的解碼器首先要了解Encoder-Decoder框架。在原論文中Transformer用于解決機器翻譯任務,機器翻譯這種Seq2Seq問題通常以Encoder-Decoder框架來解決,Transformer的網(wǎng)絡結(jié)構(gòu)也是基于encoder-decoder框架設計的。這種框架的模型分為兩部分編碼器Encoder和解碼器Decoder,編碼器負責將原文本數(shù)據(jù)編碼為中間狀態(tài)向量,該狀態(tài)向量傳遞給解碼器生成輸出。示意圖如下

          Encoder-Decoder框架

          以機器翻譯場景為例,期望將某種語言的句子X翻譯成另一種語言的句子Y,句子被表征為每個位置的字符id輸入,則給定X=(x1,x2,x3,x4...)輸入給模型,期望模型預測出Y=(y1,y2,y3,y4...),模型架構(gòu)如下

          機器翻譯場景的Encoder-Decoder

          編碼器會對完整的輸入句子通過各種復雜非線性變換生成State,代表原始輸入被編碼器編碼之后形成的中間語義狀態(tài),形如公式

          編碼器輸出中間語義向量

          而解碼器層需要融合解碼器產(chǎn)出的中間狀態(tài)State,和解碼器已經(jīng)生成出的信息Y1,Y2...Yi-1,來生成i時刻需要生成的單詞Yi。

          解碼器融合解碼器語義和歷史解碼信息

          解碼器是從第一個單詞開始,逐位預測下一個單詞,最終實現(xiàn)了從X翻譯到Y(jié)的任務。

          在實際網(wǎng)絡中會在解碼器中增加注意力機制,如果不添加注意力則對于任何位置Yi的預測中間狀態(tài)state都是一樣的,顯然源文本中每個位置的字符應該和目標翻譯文本各位置字符存在一定的對照關系,因此源文本的編碼器state向量應該在每個位置對于當下要預測的Yi有不一樣的權(quán)重分配,公式如下

          帶有注意力機制的Decoder

          注意力機制工作的方式是將當下需要預測的單詞位置的隱向量,和編碼器輸出的每個輸入位置的狀態(tài)向量,一一通過一個對齊函數(shù)(Attention)來計算目標單詞和輸入中某單詞對齊的可能性大小,可能性越大賦予更大的權(quán)重,代表當下預測單詞應該更加關注源文本中其對照單詞的信息,最終中間狀態(tài)向量state會給該對照單詞位置處的分量給予更多的權(quán)重,從而更好地預測出該位置的目標單詞。帶有注意力機制的Encoder-Decoder示意圖如下

          帶有注意力機制的Encoder-Decoder


          shifted right移位訓練

          Transformer通過逐位依次預測完成Seq2Seq的任務。Transformer解碼器結(jié)構(gòu)如下

          Transformer的解碼器

          右側(cè)部分為Decoder解碼器,將期望預測的目標文本添加start和end標識位置,底部將目標文本作為輸入,頂部將目標文本右移一格(shifted right)作為預測輸出,編碼器的輸出和輸出是錯位設計的,以編碼器輸入為“I love you”,解碼器輸出為“我愛你”為例,在訓練過程中編碼器的輸入和預測目標分別為

          錯位訓練

          每次總是以前面已經(jīng)出現(xiàn)的單詞加上編碼器的中間狀態(tài),來預測下一個單詞,比如紅色陰影部分使用"<start>+我"來預測下一個單詞“愛”,以此類推該條樣本可以分為預測“我”,“愛”,“你”,“end”四個任務,Decoder的目標是輸出“我”,“愛”,“你”,“end”四個位置的embedding,這四個任務的預測準確度作為整條樣本的預測目標。

          從輸入輸出的角度來看,"<start>"位置經(jīng)過Decoder輸出的向量embedding服務于“我”,"我"位置經(jīng)過Decoder輸出的向量embedding服務于“愛”,以此類推,當前詞的Decoder結(jié)果用于預測它右邊那個詞的概率,這就是shifted right的體現(xiàn),理解這點很重要。

          理解shifted right錯位訓練


          解碼器的并行訓練和串行預測

          shifted right移位訓練僅僅解決了預測目標的問題,移位訓練實施起來比一般的分類任務要復雜,分為訓練和預測兩種場景。

          在訓練場景下答案數(shù)據(jù)集會提前給到,令一個批次數(shù)量為B,文本長度為L,輸出embedding長度為D,我們只需要將前L-1的文本作為Decoder的輸入,將后L-1的文本作為Decoder的預測目標即可,永遠用前一個詞的embedding來預測后一個詞的概率分布,此時輸入是[B,L-1,D],輸出也是[B,L-1,D],再加上Transformer這種Self Attention天然地支持所有詞并行輸入訓練,因此在訓練場景可以將答案文本全局移位,然后全部一齊輸入訓練,考驗模型在前詞和更早之前的詞確定的前提下,對后面一個詞的預測能力,將一個完成的句子拆成一個個單詞的預測任務。

          在預測場景下不存在答案文本,只能從<start>位置開始逐位預測,因此預測場景的解碼器必定是串行的。將新預測的單詞和歷史預測單詞合并作為解碼器的輸入來預測下一個新單詞,重復這個過程直到預測結(jié)果為<end>截止,預測階段輸入文本是一個一個單獨輸入的,同時會配合在此之前的歷史預測單詞完成自注意力機制。

          預測階段解碼器串行工作方式 預測階段解碼器串行工作方式


          解碼器自注意力層和掩碼

          解碼器主要包含兩個注意力模塊,分別是自注意力層交互注意力層,自注意力層是對歷史已經(jīng)預測的單詞序列做特征表征,交互注意力層是融合歷史預測單詞序列和編碼器輸出的特征表征。在自注意力層有兩個要點,首先Q,K,V在訓練和預測階段怎么分配,另外是它獨有的下三角掩碼。

          Q,K,V在訓練和預測階段的分配

          解碼器的自注意力機制和編碼器中的網(wǎng)絡結(jié)構(gòu)一致,都是基于Self Attention,通過原始embedding加上位置編碼來作為Decoder的輸入,自注意力層包含Q,K,V注意力計算,殘差鏈接,層歸一化,前饋傳播模塊,mask機制等。

          解碼器的自注意力機制在訓練階段Q,K,V相同,都是帶有mask掩碼的答案文本embedding,而在預測階段由于只需要用Decoder的最后一維(也就是最后一個token)embedding做概率分布,因此只需要將當前前單詞的信息作為Q,將當前詞和之前所有的詞的信息作為K和V,對最后一個token位置單獨做Self Attention即可,如果這點難以理解請回看上一段的shifted right訓練方式。

          下三角掩碼

          在編碼器中僅需要對padding位置進行掩碼,因為padding位置的信息不需要帶有權(quán)重去干擾有實詞位置的embedding表征,而在解碼器模塊不僅要考慮padding導致的mask,還要考慮后詞偷看問題。由于答案是一齊輸入的,而實際的部署場景是步進預測的,理論上當前步長是看不到當前步長之后的詞的信息的,解決方案是使用下三角掩碼,將答案中當前位置之后的單詞全部mask為0,這樣答案文本依舊可以一齊輸入,在Keras的Transformer源碼中實現(xiàn)如下

          def GetSubMask(s):
              # TODO 生成一批下三角矩陣,就是斜對角線以下部分全是1
              len_s=tf.shape(s)[1]
              bs=tf.shape(s)[:1]
              mask=K.cumsum(tf.eye(len_s, batch_shape=bs), 1)
              return mask

          令s為一個[batch_size,5,6]每個文本最大長度為5,每個單詞映射維度為6,調(diào)用GetSubMask生成mask如下

          >>> a=tf.reshape(tf.convert_to_tensor(list(range(30))), [1, 5, 6])
          >>> GetSubMask(a)
          >>> <tf.Tensor: shape=(1, 5, 5), dtype=float32, numpy=array([[[1., 0., 0., 0., 0.],
                  [1., 1., 0., 0., 0.],
                  [1., 1., 1., 0., 0.],
                  [1., 1., 1., 1., 0.],
                  [1., 1., 1., 1., 1.]]], dtype=float32)>

          該下三角掩碼每一行代表當前位置,每一行的縱向只有當前位置和之前位置為1,代表自注意力使用該詞,否則為0代表該詞還看不到不能使用,以句子序列ABCD為例圖示如下

          下三角掩碼

          例如在計算C單詞的自注意力表征的時候,只能使用候選的ABC三個詞的V信息,C和D的注意力權(quán)重必須干預改成0。

          掩碼中1代表計算出的Q,K相似度保留原值,而0位置代表Q,K相似度改為一個極負的值,使得注意力權(quán)重為0,如圖所示

          下三角掩碼對自注意力的影響

          考慮到在訓練過程中答案本身會進行該批次下的統(tǒng)一padding,因此還需要再疊加padding的mask掩碼,杜絕padding單詞對實詞的表征影響,這個和編碼器中的掩碼一致,在源碼中實現(xiàn)如下

          # TODO 輸出該批次下每個文本樣本,在每個詞步長下的mask向量,由于pad和詞步長無關,所以每個步長下的mask向量相同,就是pad位置的是0
          self_pad_mask=Lambda(lambda x: GetPadMask(x, x))(tgt_seq)
          # TODO 只允許該詞和該詞前面的詞納入計算,下三角 [batch_size, seq_len-1, seq_len-1]
          # TODO 輸出該批次下每個文本樣本,在每個詞步長下的mask向量,由于是生成模型,只能基于當下詞和前詞進行計算,所以是個下三角
          self_sub_mask=Lambda(GetSubMask)(tgt_seq)
          # TODO 只要兩個有一個為0則為0 mask掉
          self_mask=Lambda(lambda x: K.minimum(x[0], x[1]))([self_pad_mask, self_sub_mask])

          其中self_pad_mask為答案句子的padding掩碼,對于答案中每個單詞,該掩碼是相同的,例如ABCD四個單詞組成的答案,其中D詞為padding,有詞位置僅有ABC,則self_pad_mask如下

          編碼器層的padding掩碼

          源碼使用K.minimum將兩個掩碼合并,每個位置取最小值,相當于兩個掩碼只要有任意一種情況需要被遮蔽則就應該被遮蔽,如圖所示

          解碼器的自注意力最終掩碼

          通過掩碼機制,并行輸入整個文本得到的每個單詞的自注意力表征和一個一個逐位循環(huán)預測進行的表征效果等同。


          解碼器交互注意力層和掩碼

          自注意力層是解碼器輸入自身的特征表征,而交互注意力層用到了編碼器的輸出,將Decoder和Encoder信息進行融合。交互注意力層和編碼器中的注意力層網(wǎng)絡結(jié)構(gòu)基本沒有差異,但是由于有兩方進行交互因此Q,K,V的分配上需要單獨設計,解碼器交互注意力層的特寫如下

          交互注意力層

          前文提到在Encoder-Decoder框架中會使用對齊函數(shù)來計算目標單詞和編碼器輸出的每個單詞對齊的可能性大小,而在Transformer中使用點乘注意力來作為對齊函數(shù),解碼器和編碼器作為該對齊函數(shù)的輸入,來比對當前解碼器位置應該更多地關注哪個源文本位置,進一步將源文本信息攜帶到當前編碼位置,因此解碼器交互注意力層Q,K,V安排如下

          • Q:解碼器自注意力層的輸出
          • K:編碼器的輸出
          • V:編碼器的輸出

          在訓練之前需要對所有源文本和目標文本進行單獨padding到最大長度seq_length,因此交互注意層計算的注意矩陣大概率不是一個方陣,計算示意圖如下


          交互注意力計算

          以解碼層的單詞A為例,A需要融合編碼器中的a,b,c,d四個單詞的信息表征,其中得分權(quán)重分別為(3.2,1.3,0.9,-1),同樣的交互注意力也需要mask掩碼,掩碼的維度和注意力權(quán)重矩陣維度相同,在源碼中實現(xiàn)如下

          def GetPadMask(q, k):
              '''
              shape: [B, Q, K]
              '''
              # TODO [batch_size, seq_len - 1]=> [batch_size, seq_len - 1, 1]
              ones=K.expand_dims(K.ones_like(q, 'float32'), -1)
              # TODO [batch_size, 1, seq_len - 1]
              mask=K.cast(K.expand_dims(K.not_equal(k, 0), 1), 'float32')
              # TODO [batch_size, seq_len-1, seq_len-1],相當于對mask直接復制
              # TODO 輸出該批次下每個文本樣本,在每個詞步長下的mask向量,由于pad和詞步長無關,所以每個步長下的mask向量相同,就是pad位置的是0
              mask=K.batch_dot(ones, mask, axes=[2, 1])
              return mask
          
          # TODO 參數(shù)1決定步長,參數(shù)二決定pad
          enc_mask=Lambda(lambda x: GetPadMask(x[0], x[1]))([tgt_seq, src_seq])

          此處的掩碼根據(jù)padding機制生成,其中GetPadMask的第一個參數(shù)tgt_seq決定文本步長,第二個參數(shù)決定padding的依據(jù),顯然使用了源文本的padding信息,例如在源文本abcd中d為padding位置,則mask矩陣如下

          交互注意力掩碼

          代表解碼器層中A,B,C都需要攜帶編碼器中的a,b,c,d信息,但是A,B,C每個位置計算的時候都需要舍棄源文本中的d信息,因為d信息是padding的干擾項。

          交互注意力層計算解碼器輸入每個單詞位置相對于編碼器源文本的表征,解碼器每個輸入本身通過下三角mask機制代表當前和之前位置信息,而編碼器源文本是完整可見的,因此解碼器每個位置都可以和全部編碼器輸出計算注意力,只需要主要編碼器的padding部分在交互注意力的時候同樣需要刪除,源文本中的padding信息不能帶入到解碼器中,示意圖如下

          解碼器中mask工作流程


          解碼器輸出和損失函數(shù)

          解碼器經(jīng)過自注意力層提取當前預測位置的表征,經(jīng)過交互注意力層以當前預測位置的表征和編碼器層的中間狀態(tài)進行對齊,融合編碼器中的信息到解碼器中來,令該批次樣本數(shù)為B,解碼器最大文本長度為L,embedding維度為D,則解碼器最終輸出一個三維向量,維度為[B,L-1,D],其中L-1是在訓練過程中使用錯位訓練策略導致。

          Transformer在解碼器的輸出層加入線性層Linear使每個位置的embedding表征映射到預測詞庫中每個詞的概率,以英文到德文翻譯的數(shù)據(jù)集為例,輸出為3665個樣本中德文單詞的得分,源碼實現(xiàn)如下

          target_layer=TimeDistributed(Dense(o_tokens.num(), use_bias=False))
          
          # TODO decode out [batch_size, seq_len-1, 256]
          dec_output=self.decoder(tgt_emb, tgt_seq, src_seq, enc_output, active_layers=active_layers)
          # TODO final_output [batch_size, seq_len-1, 3665]
          final_output=target_layer(dec_output)

          因為錯位訓練的存在,L-1代表從源文本中除去<start>之外,第2個單詞到最后<end>位置的信息表征,只需要將Linear的結(jié)果和實際的錯位單詞id進行比對即可計算該條樣本的損失,源碼中采用softmax交叉熵來計算每個L-1位置的loss,如果該位置實際為padding則忽略loss,最終采用所有實詞位置的loss均值作為該樣本的總損失,采用該批次的平均損失作為該批次的總損失。

          def get_loss(y_pred, y_true):
              y_true=tf.cast(y_true, 'int32')
              # loss=[None, len_seq],輸出每個樣本,在每個詞位置的softmax loss
              loss=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred)
              # TODO 對于padding位置的預測,該預測預測,但是不記入loss
              mask=tf.cast(tf.not_equal(y_true, 0), 'float32')
              # 對非mask位置求均值
              loss=tf.reduce_sum(loss * mask, -1) / tf.reduce_sum(mask, -1)
              loss=K.mean(loss)
              return loss

          全文完畢,本節(jié)基于訓練過程探究Decoder的原理,下一節(jié)會基于預測部分來完整理解Decoder的工作方式。

          來 發(fā)自 凹非寺
          量子位 報道 | 公眾號 QbitAI

          4月9日,英偉達x量子位分享了一期nlp線上課程,來自NVIDIA的GPU計算專家、FasterTransformer 2.0開發(fā)者之一的薛博陽老師,與數(shù)百位開發(fā)者共同探討了:

          • FasterTransformer 2.0 新增功能介紹
          • 如何針對Decoder和Decoding進行優(yōu)化
          • 如何使用Decoder和Decoding
          • Decoder和Decoding能夠帶來什么樣的加速效果

          應讀者要求,我們將分享內(nèi)容整理出來,與大家一起學習。文末附有本次直播回放、PPT鏈接,大家也可直接觀看。

          以下為本次分享的內(nèi)容整理:


          大家好,今天為大家介紹的是FasterTransformer 2.0的原理與應用

          什么是FasterTransformer?

          首先,參加本期直播的朋友對Transformer架構(gòu)應該都有了一定了解。這個架構(gòu)是在“Attention is All You Need”這篇論文中提出的。在BERT Encoder中使用了大量Transformer,效果很好。因此,Transformer已成為 NLP 領域中非常熱門的深度學習網(wǎng)絡架構(gòu)。

          但是,Transformer計算量通常是非常大的。因此,Transformer的時延往往難以滿足實際應用的需求。

          △Attention is All You Need截圖

          Transformer架構(gòu)可以應用于Encoder或Decoder上。在Encoder中,Transformer包含1個multi-head attention和1個feed forward網(wǎng)絡,在Decoder中,包含2個multi-head attention和1個feed forward網(wǎng)絡。

          其中,純Encoder架構(gòu)在目前的很多應用中都有很好的表現(xiàn),比如Q&A系統(tǒng)、廣告推薦系統(tǒng)等,因此,針對Encoder的優(yōu)化是非常有必要的。

          而在一些場景中,如翻譯場景,我們需要Encoder和Decoder架構(gòu)。在這種架構(gòu)下,Decoder消耗的時間占比是非常高的,可能達到90%以上,是推理的主要瓶頸。因此,針對Decoder的優(yōu)化也是一項重要的工作,能帶來明顯的加速效果。

          實際應用中,F(xiàn)asterTransformer 1.0版本針對BERT中的Encoder為目標做了很多優(yōu)化和加速。在2.0版本中,則主要新增了針對Decoder的優(yōu)化,其優(yōu)越的性能將助力于翻譯、對話機器人、文字補全修正等多種生成式的場景。

          上表比較了Encoder和Decoder計算量的不同。當我們需要編解碼一個句子的時候,Encoder可以同時編碼很多個字,甚至可以直接編碼一個句子。

          但是Decoder是一個解碼的過程,每次只能解碼一個字,因此,解碼一個句子時我們需要多次Decoder的forward,對GPU更不友善。

          △Faster Transformer框架

          上圖列出了FasterTransformer中針對BERT優(yōu)化的模塊。在編碼方面,以BERT為基準,提供了一個單層的、等價于BERT Transformer 的模塊,供使用者做調(diào)用。當我們需要多層的Transformer時,只需調(diào)用多次Encoder即可。

          解碼方面更為復雜,為了兼顧靈活性與效率,我們提供兩個不同大小和效果的模塊:

          Decoder(黃色區(qū)塊) 由單層的 Transformer layer 組成,它包含兩個attention和一個feed forward 網(wǎng)絡;而Decoding(藍色區(qū)塊)除了包含多層的 Transformer layer 之外,還包括了其他函數(shù),例如 embedding_lookup、beam search、position Encoding 等等。

          我們用一個簡單的虛擬碼展示Decoder和Decoding的區(qū)別。

          在Decoding中通常有兩個終止條件,一是是否達到預先設定的最大的sequence length,第二個條件是所有的句子是否都已經(jīng)翻譯完畢,未終止時會不斷循環(huán)。

          以句子長度為128的句子翻譯場景為例,若其 Decoder 是由6層的 Transformer layer 組成的,總共需要調(diào)用 128x6=768 次的Decoder;如果是使用 Decoding 的話,則只需要調(diào)用一次Decoding,因此Decoding的推理效率更高。

          小結(jié)

          首先,F(xiàn)asterTransformer提供了高度優(yōu)化過的Transformer layer:在Encoder方面是基于BERT實現(xiàn)的;在Decoder方面基于OpenNMT-TensorFlow開源的庫做為標準;Decoding包含了翻譯的整個流程,也是基于OpenNMT-TensorFlow。

          其次,F(xiàn)asterTransformer 2.0的底層由CUDA和cuBLAS實現(xiàn),支持FP16 和 FP32 兩種計算模式,目前提供C++ API和TF OP。

          現(xiàn)在,F(xiàn)asterTransformer 2.0已經(jīng)開源,大家可以在DeepLearningExamples/FasterTransformer/v2 at master · NVIDIA/DeepLearningExamples · GitHub獲取全部源代碼。

          如何進行優(yōu)化?

          先以Encoder為例。

          △TF Encoder Transformer layer

          參數(shù):no XLA,batch size 1,12 heads,size per head 64,F(xiàn)P 32

          圖中藍色方塊表示GPU在實際運行,空白的表示GPU在閑置,因此GPU在很多時間是閑置狀態(tài)。造成GPU閑置的原因是kernels太小,GPU要不斷閑置以等待CPU啟動kernel的時間,這也稱為kernel launch bound問題。

          如何解決這個問題?

          我們嘗試開啟TF的XLA,其他參數(shù)不變。圖中我們看到,從原本計算1層Transformer layer需要50個kernel縮減到24個左右。大部分kernel變得比較寬,雖有加速,但是閑置的時間還是比較多。

          因此,我們提出FasterTransformer針對Encoder進行優(yōu)化。

          首先,我們把矩陣計算部分挑選出來,用NVIDIA高度優(yōu)化的庫cuBLAS 來計算,此外的部分,我們把能融合的kernel都盡可能融合起來。

          最終的結(jié)果如上圖右邊,經(jīng)過整體的優(yōu)化后,我們只需要8個矩陣計算加6個kernel就可以完成單層Transformer layer計算,也就是說所需kernel從24個減少到14個。

          我們可以看到,優(yōu)化后每一個 kernel 都相對比較大,時間占比小的kernel也減少了。但還是有很多空白的片段。

          我們直接調(diào)用C++ API,如圖,GPU閑置的時間幾乎沒有了。因此,小batch size情況下,我們推薦使用C++ API以獲得更快的速度。當batch size比較大時,GPU閑置時間會比較少。

          接下來我們看下Decoder。

          參數(shù):no XLA,batch size 1,8 heads,size per head 64,F(xiàn)P32

          經(jīng)過統(tǒng)計,TF需要使用70個左右kernel來計算1層Transformer layer。直觀來看,非常小、時間占比非常短的kernel更多。因此,batch size比較小的情況下,優(yōu)化效果會更明顯。

          Decoder的優(yōu)化同上述Encoder,特別之處是,Decoder里面的矩陣計算量非常少,因此我們把整個multi-head attention以一個kernel來完成。經(jīng)過優(yōu)化之后,原本需要70個kernel才能完成的計算,只需要使用16個kernel就能夠完成。

          在更大的Decoding模塊中,另一個時間占比較多的kernel是beam search,這里我們針對top k做出優(yōu)化。在GPU中可以同時執(zhí)行多個block和多個warp,并行運算,大大節(jié)省時間。

          △更多優(yōu)化細節(jié)

          如何使用FasterTransformer?

          大家可以在DeepLearningExamples/FasterTransformer/v2 at master · NVIDIA/DeepLearningExamples · GitHub根目錄下找到對應資料:

          針對 Decoder 和 Decoding,F(xiàn)asterTransformer 分別提供了 C++ 和 TensorFlow OP 這兩種接口。

          C++接口

          首先創(chuàng)建一個Eecoder,超參數(shù)如圖:

          其次,設定訓練好的模型權(quán)重;

          設置好后,直接調(diào)用forward即可。

          TF OP接口

          首先,我們需要先載入OP。這里以Decoder為例,會自動創(chuàng)建TF需要使用的庫,調(diào)用接口時先導入.so文件(圖中已標紅):

          然后調(diào)用Decoder,放入input、權(quán)重、超參數(shù),然后針對out put 做Session run。

          這里需要注意的是,參數(shù)里有一個虛擬的輸入 (pseudo input)。這個輸入是為了避免 TensorFlow 的 decoder 和 FasterTransformer Decoder 發(fā)生并行,因為我們發(fā)現(xiàn)并行執(zhí)行時,Decoder中的memory可能會被污染。實際應用的時候可以將這個輸入拿掉。

          優(yōu)化效果

          最后我們來看下優(yōu)化的效果如何。首先測試環(huán)境設置:

          使用的GPU是NVIDIA的Tesla T4和V100。

          Encoder模塊在Tesla V100的結(jié)果

          超參數(shù)設置:12 layers,32 sequence length,12 heads,64 size per head(BERT base),under FP 16

          結(jié)果如上圖,batch size從100逐步增加到500的過程中,F(xiàn)asterTransformer對比TF開啟XLA,大概可以提供1.4倍的加速。

          Decoder和Decoding模塊在Tesla T4的結(jié)果

          超參數(shù)設置:Batch size 1,beam width 4,8 heads,64 size per head,6 layers,vocabulary size 30000,F(xiàn)P 32

          結(jié)果如上圖,不同的sequence length下,相比于TF,F(xiàn)asterTransformer Decoder可以帶來3.4倍左右的加速效果,Decoding可以帶來7-8倍的加速,效率更高。

          超參數(shù)設置:Batch size 256,sequence length 32,beam width 4,8 heads,64 size per head,6 layers,vocabulary size 30000

          結(jié)果如上圖,把batch size固定在較高值時,不同的FP下,F(xiàn)asterTransformer Decoder和Decoding也帶來一定的加速效果。

          最后,本次直播的PPT獲取連接:「鏈接」

          本次直播回放:NVIDIA Webinar


          主站蜘蛛池模板: 伊人色综合一区二区三区影院视频| 中文字幕日韩精品一区二区三区| 美女一区二区三区| 国产一区二区三区在线观看免费| 色一情一乱一伦一区二区三欧美| 亚洲福利电影一区二区?| 久久综合九九亚洲一区| 中文乱码人妻系列一区二区| 亚洲国产欧美日韩精品一区二区三区| 91一区二区在线观看精品| 麻豆文化传媒精品一区二区| 精品无码综合一区二区三区| 日韩精品电影一区亚洲| 无码人妻精品一区二区蜜桃百度| 91一区二区三区| 亚洲国产综合无码一区 | 无码人妻精品一区二区蜜桃网站 | 亚洲av色香蕉一区二区三区蜜桃 | 亚洲一区精品无码| 麻豆一区二区99久久久久| 国产福利日本一区二区三区| 亚洲免费一区二区| 国产日本亚洲一区二区三区| 国产成人片视频一区二区| 3D动漫精品一区二区三区| 亚洲视频在线一区二区| 亚洲综合无码一区二区痴汉| 插我一区二区在线观看| 亚洲AV成人精品一区二区三区 | 久久精品国产免费一区| 在线视频一区二区三区四区| 国产一区中文字幕| 亚洲av无码一区二区三区天堂古代 | 一区国产传媒国产精品| 久久国产精品免费一区| 国产精品视频无圣光一区| 国产成人无码精品一区二区三区| 精品一区二区三区在线视频观看| 亚洲av无码片区一区二区三区 | 精品日本一区二区三区在线观看 | 国产高清一区二区三区四区|