微信開源推理加速工具 TurboTransformers,性能超越 PyTorch/TensorFlow 與主流優化引擎

項目背景python

以BERT爲表明的Transformer神經網絡是近年來NLP領域最重要的模型創新,不少NLP任務,如閱讀理解、文章摘要、語義分類、同義改寫等,都經過採用BERT得到了顯著的效果提高。可是,以下圖所示,Transformer帶來更高的模型精度的同時也引入了更多的計算量,使用Transformer的線上NLP服務的高效部署面臨着巨大挑戰。鑑於BERT在各大互聯網公司的普遍應用,很是必要實現一個能發揮充分CPU/GPU硬件計算能力的Transformer推理方法。git

TurboTransformers的誕生源於騰訊內部對開源協同的推進。2019年初,騰訊技術委員會成立,下設開源協同、自研上雲兩個項目組和對外開源管理辦公室,以此來促進內部代碼的開放共享和協同共建。TurboTransformers來自於深度學習天然語言處理基礎平臺TencentNLP Oteam,做爲基礎性技術版塊,率先進行了開源協同的實踐,旨在搭建統一的深度學習 NLP (Natural Language Processing,天然語言處理)基礎平臺、提高研發效能。在內部對技術反覆打磨的基礎上,該項目進一步對外開源。github

image

在業界,Transformers模型的訓練部分一般採用tensorflow或者pytorch這種訓練框架完成。因爲深度學習的訓練和推理任務存在差別,訓練框架直接應用於線上推理並不能獲得極致的性能。衆多算法工程師常常遇到模型效果很好,可是沒法上線的問題。不少工做嘗試彌合推理和訓練之間實現差別的鴻溝,如onnxruntime、tensorRT、torchlib、XLA等,這些工做大多須要根據輸入尺寸預先對計算圖進行預處理和優化,以得到更好的推理時性能。和圖像處理任務的輸入經常沒有變化不一樣,NLP推理任務輸入尺寸多個維度會存在變化。實際推理時經過補零或者截斷成整理成固定的輸入尺寸,這樣引入了額外補零計算開銷,預處理優化的方案對NLP任務並不適用。算法

項目介紹docker

面對豐富的Transformer的線上服務場景,騰訊微信開源了名爲TurboTransformers的Transformer推理加速工具。就像增壓器turbo能跑給汽車的發動機引擎帶來更強勁的功率,TurboTransformers也可讓你的Transformer推理引擎變強。它的特色是高速、實用、簡單。它在CPU和GPU上力求取得業界最佳的性能表現。它支持變長輸入序列,無需預處理更適合NLP任務。它支持C++和python方式調用,在pytorch基礎上增長几行代碼能夠得到端到端BERT加速。微信

Turbo具備以下特性。網絡

1. 優異的CPU/GPU性能表現。面向Intel多核CPU和NVIDIA GPU硬件平臺,經過核心融合,TurboTransformers充發揮硬件的各層級計算能力。在多種CPU和GPU硬件上得到了超過pytorch/tensorflow和目前主流優化引擎(如onnxruntime-mkldnn/onnxruntime-gpu, torch JIT, NVIDIA faster transformers)的性能表現。多線程

2. 爲NLP推理任務特色量身定製。TurboTransformers能夠支持變長輸入序列處理,且不須要預處理過程。架構

3. 簡單的使用方式。TurTurboTransformers支持python和C++接口進行調用。它能夠做爲pytorch的加速插件,在Transformer任務上,經過加入幾行python代碼得到的端對端加速效果。框架

TurboTransformers的已經應用騰訊內部於多個線上BERT服務服務場景。好比,微信的FAQ的服務得到1.88x加速,公有云情感分析服務得到2.11x加速,QQ推薦服務得到13.6x加速。

和其餘工做的對好比下,TurboTransformers在性能,使用方式都具有優點。

image

技術創新

TurboTransformers的軟件架構以下圖,它讓微信內部衆多NLP線上應用可以充分榨取底層硬件的計算能力,讓算法更好地服務的用戶。

具體來講TurboTransformers能夠在算子優化、框架優化和接口部署方式簡化三個方面作了工做。

image

1. 算子層優化

讓咱們先看看Transformer都包含了什麼計算。以下圖所示,圖(a)展現了論文Transformer結構示意圖,這裏稱灰色方框內的結構爲·一個Transformer Cell,BERT encoder堆疊了Nx個這樣的Transformer Cell。圖(b)將一個Cell的細節加以展開,每個矩形都是一個獨立的計算核心。

Transformer Cell計算包含了8個GEMM(通用矩陣乘法,General Matrix Multiplication)運算。咱們經過調優Intel MKL和cuBLAS的GEMM調用方式來得到最佳GEMM性能。經過調整了預訓練矩陣存儲方式。而且在硬件容許條件下,在GPU上使用tensor core方式進行GEMM運算。

相似NVIDIA FasterTransformers方案,咱們將全部GEMM運算之間的計算融合成一個調用核心。融合會帶來兩個好處,一是減小了內存訪問開銷,二是減小多線程啓動開銷。對於這些核心,咱們在CPU上採用openmp進行並行,在GPU上使用CUDA進行優化實現。對於比較複雜的LayerNorm和Softmax算子,它們包含了不適合GPU上並行的規約操做,TurboTransformers爲它們設計了創新並行算法,極大下降了這些算子的延遲。理論上Transformers推理延遲應該近似於矩陣乘法延遲。

image

2. 框架層優化

TurboTransformers採用了一個有效的內存管理方式。因爲NLP的採用變長輸入特性,每次運算中間結果的大小其實並不相同。爲了不每次都分配釋放內存,咱們經過Caching方式管理顯存。

爲了可以無縫支持pytorch/tensorflow訓練好的序列化模型,咱們提供了一些腳本能夠將兩者的預訓練模型轉化爲npz格式,供TurboTransformers讀入。特別的,考慮到pytorch huggingface/transformers是目前最流行的transformers訓練方法,咱們支持直接讀入huggingface/transformers預訓練模型。

3. 應用部署

咱們提供了C++和Python調用接口。能夠嵌入到C++多線程後臺服務流程中,也能夠加入到pytorch服務流程中。

咱們建議TurboTransformers經過docker部署,一方面保證了編譯的可移植性,另外一方面也能夠無縫應用於K8S等線上部署平臺。

性能結果

下圖是在Intel Xeon 6133 CPU的性能測試結果。

image

圖片9.png

下圖是在NVIDIA RTX 2060 GPU的性能測試結果

image

image

下圖是在NVIDIA P40 GPU的性能測試結果

image

image

下圖是在NVIDIA V100 GPU的性能測試結果

image

image

將來展望

TurboTransformers是一個的小而美的Transformer推理加速插件,因爲自身業務限制,它的功能還相對有限,不少方面待能和開源社區一塊兒努力,共同完善。

TurboTransformers只支持了FP32的計算,對於GPU FP16支持將做爲咱們的將來工做。TurboTransformers目前重點支持了BERT模型,將來咱們會增長TurboTransformers的自動化優化的能力。TurboTransformers解決了計算加速的問題,用戶還須要本身搭建服務框架,將來咱們會將服務流程開源,打通用戶上線的最後一站。

項目開源地址: https://github.com/Tencent/Tu...

相關文章
相關標籤/搜索