點擊上方「
傑哥的IT之旅
」,選擇「
星標
」公衆號
近期,騰訊發
布了在 GitHub 上的第 100 個開源項目「TurboTransformers」,在多
種
CPU 和 GPU 硬件測試中,這款 Transformer 推理加速工具得到了超越 PyTorch/Tens
orFlow 和目前主流優化引擎的性能表現。

在天然語言處理領域,以 BERT 爲表明的 Transformer 神經網絡模型是近年來最重要的模型創新,爲諸如閱讀理解、文章摘要、語義分類、同義改寫等 NLP 任務帶了顯著的效果提高。但 Transformer 在提升模型精度的同時,也引入了更多的計算量,這致使 Transformer 的線上 NLP 服務在部署方面面臨着巨大挑戰。
業界廣泛採用 TensorFlow 或者 Pytorch 來完成 Transformer 的訓練部分,但因爲深度學習的訓練和推理任務存在差別,訓練框架直接應用於線上推理並不能獲得極致的性能。
昨日,騰訊宣佈開源 Transformer 推理加速工具「TurboTransformers」。Turbo 的意思是「渦輪」,通常用來增長髮動機氧氣含量,帶來更大動力,TurboTransformers 則意味着可以使推理引擎更增強勁。
項目地址:
https://github.com/Tencent/TurboTransformers
具體而言,TurboTransformers 具有高速、實用、簡單三個特色:
面向 Intel 多核 CPU 和 NVIDIA GPU 硬件平臺,經過核心融合和並行算法優化,TurboTransformers 充發揮硬件的各層級並行計算的能力。在多種 CPU 和 GPU 硬件上得到了超過 PyTorch/TensorFlow 和目前主流優化引擎(如 onnxruntime-mkldnn/onnxruntime-gpu, torch JIT, NVIDIA faster transformers)的性能表現。
TurboTransformers 能夠支持變長輸入序列處理,無需序列補零、截斷或者分桶帶來的無用計算,也無需任何針對計算圖在推理前進行預調優的過程。
TurboTransformers 支持 python 和 C++接口進行調用。TurboTransformers 支持 TensorFlow 和 PyTorch 預訓練模型的載入。它能夠做爲 huggingface/transformers 的推理加速插件,經過加入幾行 python 代碼得到 BERT 模型的端對端加速效果。
和 ONNX-runtime、TensorRT、Torchlib 等推理優化引擎相比,TurboTransformers 在性能和使用方式上都具有優點。
此前,TurboTransformers 已應用在騰訊內部多個線上 BERT 服務服務場景,微信經常使用問題回覆服務得到 1.88x 加速,公有云情感分析服務得到 2.11x 加速,QQ 看點推薦服務得到 13.6x 加速。
TurboTransformers 在算子優化、框架優化和接口部署方式簡化三個方面作了改進。
上圖 (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 方案,TurboTransformers 將全部 GEMM 運算之間的計算融合成一個調用核心。這樣有兩個好處,一是減小了內存訪問開銷,二是減小多線程啓動開銷。
對於這些核心,TurboTransformers 在 CPU 上採用 openmp 進行並行,在 GPU 上使用 CUDA 進行優化實現。對於比較複雜的 LayerNorm 和 Softmax 算子,它們包含了不適合 GPU 上並行的規約操做,TurboTransformers 爲它們設計了創新並行算法,極大下降了這些算子的延遲。
因爲 NLP 的採用變長輸入特性,每次運算中間結果的大小其實並不相同。爲了不每次都分配釋放內存,TurboTransformers 經過 Caching 方式管理顯存。
此外,團隊爲 TurboTransformers 提供了一些腳本,將兩者的預訓練模型轉化爲 npz 格式供其讀入,以無縫支持 pytorch/tensorflow 訓練好的序列化模型。考慮到 pytorch huggingface/transformers 是目前最流行的 transformer 訓練方法,TurboTransformers 支持直接讀入 huggingface/transformers 預訓練模型。
爲了減小用戶開發難度,TurboTransformers 提供了 C++和 Python 調用接口,能夠嵌入到 C++多線程後臺服務流程中,也可加入到 pytorch 服務流程中,增長几行代碼便可得到端到端 BERT 加速。現階段更建議經過 docker 部署 TurboTransformers,一方面保證了編譯的可移植性,另外一方面也能夠無縫應用於 K8S 等線上部署平臺。
團隊首先在三個 CPU 硬件平臺上測試了 TurboTransformers 的性能,
下圖顯示了在 Intel Xeon 6133 CPU 上的性能測試結果(150 次迭代的均值):
接下來在四個 GPU 硬件平臺上進行測試,下圖顯示了在 NVIDIA RTX 2060 GPU 和
NVIDIA V100 GPU 上的
性能測試結果(150 次迭代的均值):
NVIDIA RTX 2060 GPU 測試結果。

此外,團隊還在多個CPU和GPU等平臺上測試了 TurboTransformers,更多性能測試結果可見項目主頁。
目前,TurboTransformers 暫時只支持 FP32 的計算,將來騰訊將對其進一步改進,包括對 GPU FP16 的支持等能力等。
本公衆號所有博文已整理成一個目錄,請在公衆號後臺回覆「m
」獲取!
python
關注微信公衆號『
傑哥的IT之旅』,後臺回覆「
1024」查看更多內容,回覆「
微信」添加我微信。