NVIDIA BERT推理解決方案Faster Transformer開源啦
作者:英偉達GPU計算專家團隊,賈曉瑩
Faster Transformer是一個基於CUDA和cuBLAS的Transformer Encoder前向計算實現,其優越的性能將助力於多種BERT的應用場景。
2017年12月Google在論文「Attention is All You Need」[1] 中首次提出了Transformer,將其作為一種通用高效的特徵抽取器。至今,Transformer已經被多種NLP模型採用,比如BERT[2]以及上月發布重刷其記錄的XLNet[3],這些模型在多項NLP任務中都有突出表現。在NLP之外, TTS,ASR等領域也在逐步採用Transformer。可以預見,Transformer這個簡潔有效的網路結構會像CNN和RNN一樣被廣泛採用。雖然Transformer在多種場景下都有優秀的表現,但是在推理部署階段,其計算性能卻受到了巨大的挑戰:以BERT為原型的多層Transformer模型,其性能常常難以滿足在線業務對於低延遲(保證服務質量)和高吞吐(考慮成本)的要求。以BERT-BASE為例,超過90%的計算時間消耗在12層Transformer的前向計算上。因此,一個高效的Transformer 前向計算方案,既可以為在線業務帶來降本增效的作用,也有利於以Transformer結構為核心的各類網路在更多實際工業場景中落地。本文將介紹NVIDIA GPU計算專家團隊針對Transformer推理提出的性能優化方案:Faster Transformer。
Faster Transformer是一個BERT Transformer 單層前向計算的高效實現,其代碼簡潔明了,後續可以通過簡單修改支持多種Transformer結構。目前優化集中在編碼器(encoder)的前向計算(解碼器decoder開發在後續特性規劃中)。底層由CUDA和cuBLAS實現,支持FP16和FP32兩種計算模式,其中FP16可以充分利用Volta和Turing架構GPU上的Tensor Core計算單元。
Faster Transformer共接收4個輸入參數。首先是attention head的數量以及每個head的維度。這兩個參數是決定Transformer網路結構的關鍵參數。這兩個參數的動態傳入,可以保證Faster Transformer既支持標準的BERT-BASE(12 head x 64維),也支持裁剪過的模型(例如,4 head x 32維),或者其他各式專門定製化的模型。其餘兩個參數是Batch Size 和句子最大長度。出於性能考慮,目前句子最大長度固定為最常用的32,64 和128三種,未來會支持任意長度。Faster Transformer對外提供C++ API,TensorFlow OP 介面,以及TensorRT [4]插件,並提供了相應的示例,用以支持用戶將其集成到不同的線上應用代碼中。
Faster Transformer目前已經開源,可以訪問https://github.com/NVIDIA/DeepLearningExamples/tree/master/FasterTransformer
獲取項目全部源代碼,最新的性能數據以及支持的特性。歡迎大家前往使用,加星和反饋。
性能數據
Faster Transformer在不同的應用場景下都有著突出的表現。我們在這裡測試了不同生產環境下Faster Transformer前向計算的執行時間以及與TensorFlow XLA的性能比較。測試環境如表1所示:
表1. 性能數據測試環境(本地伺服器)