騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎

機器之心報道

機器之心編輯部

4月24日,騰訊發佈了在 GitHub 上的第 100 個開源項目「TurboTransformers」,在多種 CPU 和 GPU 硬件測試中,這款 Transformer 推理加速工具獲得了超越 PyTorch/TensorFlow 和目前主流優化引擎的性能表現。


騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎

在自然語言處理領域,以 BERT 為代表的 Transformer 神經網絡模型是近年來最重要的模型創新,為諸如閱讀理解、文章摘要、語義分類、同義改寫等 NLP 任務帶了顯著的效果提升。但 Transformer 在提高模型精度的同時,也引入了更多的計算量,這導致 Transformer 的線上 NLP 服務在部署方面面臨著巨大挑戰。

騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎


業界普遍採用 TensorFlow 或者 Pytorch 來完成 Transformer 的訓練部分,但由於深度學習的訓練和推理任務存在差異,訓練框架直接應用於線上推理並不能得到極致的性能。

4月24日,騰訊宣佈開源 Transformer 推理加速工具「TurboTransformers」。Turbo 的意思是「渦輪」,一般用來增加發動機氧氣含量,帶來更大動力,TurboTransformers 則意味著可使推理引擎更加強勁。

項目地址:
https://github.com/Tencent/TurboTransformers

從業界痛點出發:高速、實用、簡單

具體而言,TurboTransformers 具備高速、實用、簡單三個特點:

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. 使用方式簡單

TurboTransformers 支持 python 和 C++接口進行調用。TurboTransformers 支持 TensorFlow 和 PyTorch 預訓練模型的載入。它可以作為 huggingface/transformers 的推理加速插件,通過加入幾行 python 代碼獲得 BERT 模型的端對端加速效果。

和 ONNX-runtime、TensorRT、Torchlib 等推理優化引擎相比,TurboTransformers 在性能和使用方式上都具備優勢。


騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎


此前,TurboTransformers 已應用在騰訊內部多個線上 BERT 服務服務場景,微信常用問題回覆服務獲得 1.88x 加速,公有云情感分析服務獲得 2.11x 加速,QQ 看點推薦服務獲得 13.6x 加速。

整體架構

TurboTransformers 在算子優化、框架優化和接口部署方式簡化三個方面做了改進。

騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎

TurboTransformers 軟件架構圖。

算子層優化

騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎


上圖 (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 次迭代的均值):

騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎


接下來在四個 GPU 硬件平臺上進行測試,下圖顯示了在 NVIDIA RTX 2060 GPU 和 NVIDIA V100 GPU 上的性能測試結果(150 次迭代的均值):

騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎

NVIDIA RTX 2060 GPU 測試結果。

騰訊開源TurboTransformers,推理加速性能超TensorRT主流優化引擎

NVIDIA V100 GPU 測試結果。

此外,團隊還在多個CPU和GPU等平臺上測試了 TurboTransformers,更多性能測試結果可見項目主頁。

目前,TurboTransformers 暫時只支持 FP32 的計算,未來騰訊將對其進一步改進,包括對 GPU FP16 的支持等能力等。


分享到:


相關文章: