騰訊宣佈開源 Transformer 推理加速工具 TurboTransformers。該工具面向自然語言處理領域中 Transformers 相關模型豐富的線上預測場景,據介紹,其在微信、騰訊雲、QQ 看點等產品的線上服務中已經廣泛應用,這也是騰訊對外開源的第 100 個專案。
在自然語言處理領域中,以 BERT 為代表的 Transformers 相關神經網路模型是近年來最重要的模型創新,可以為閱讀理解、文章摘要、語義分類、同義改寫等 NLP 任務提供顯著的效果提升。但提高模型精度的同時,Transformes 相關模型也帶來了更多的計算量。
由於深度學習的訓練和推理任務存在差異,訓練框架直接應用於線上推理並不能得到極致的效能。眾多模型演算法工程師都遇到了訓練的模型效果很好,但因為響應延遲不滿足要求,導致模型無法上線的問題。
在這種背景下,騰訊微信團隊研發了 TurboTransformers 加速器。它來自於深度學習自然語言處理基礎平臺 TencentNLP Oteam,旨在搭建統一的深度學習 NLP (Natural Language Processing,自然語言處理)基礎平臺、提升研發效能。特性主要有三點:
相比其它同類專案:
騰訊介紹,TurboTransformers 讓微信內部眾多 NLP 線上應用能夠充分榨取底層硬體的計算能力,讓演算法更好地服務使用者。具體來說 TurboTransformers 在運算元最佳化、框架最佳化和介面部署方式簡化三個方面做了工作。
TurboTransformers 架構
運算元層最佳化
如下圖所示,Transformer 架構中的 Transformer Cell 計算包含了 8 個 GEMM(通用矩陣乘法,General Matrix Multiplication)運算。其中,(a) 中灰色方框內的結構為一個 Transformer Cell,BERT encoder 堆疊了 Nx 個這樣的 Transformer Cell;(b) 將一個 Cell 的細節加以展開,每一個矩形都是一個獨立的計算核心。
TurboTransformers 透過調優 Intel MKL 和 cuBLAS 的 GEMM 呼叫方式獲得最佳 GEMM 效能。透過調整了預訓練矩陣儲存方式,並且在硬體允許條件下,在 GPU 上使用 tensor core 方式進行 GEMM 運算。
類似 NVIDIA FasterTransformers 方案,TurboTransformers 將 Transformer 中的所有 GEMM(通用矩陣乘法,General Matrix Multiplication) 運算之間的計算融合成一個呼叫核心。融合會帶來兩個好處,一是減少了記憶體訪問開銷,二是減少多執行緒啟動開銷。對於這些核心,在 CPU 上採用 openmp 進行並行,在 GPU 上使用 CUDA 進行最佳化實現。對於比較複雜的 LayerNorm 和 Softmax 運算元,它們包含了不適合 GPU 上並行的規約操作,TurboTransformers 為它們設計了創新並行演算法,極大降低了這些運算元的延遲。理論上 Transformers 推理延遲應該近似於矩陣乘法延遲。
框架層最佳化
由於 NLP 的採用變長輸入特性,每次運算中間結果的大小其實並不相同,為了避免每次都分配釋放記憶體,TurboTransformers 透過 Caching 方式管理視訊記憶體。
為了能夠無縫支援 PyTorch/TensorFlow 訓練好的序列化模型,專案中提供了一些指令碼可以將二者的預訓練模型轉化為 npz 格式,供 TurboTransformers 讀入。特別考慮到 PyTorch huggingface/transformers 是目前最流行的 Transformers 訓練方法,TurboTransformers 支援直接讀入 huggingface/transformers 預訓練模型。
應用部署
TurboTransformers 提供了 C++ 和 Python 呼叫介面,可以嵌入到 C++ 多執行緒後臺服務流中,也可以加入到 PyTorch 服務流中。官方建議透過 Docker 部署 TurboTransformers,一方面保證編譯的可移植性,另一方面也可以無縫應用於 K8S 等線上部署平臺。
效能方面,官方分別以 CPU 和 GPU 兩方面進行測試:
CPU 測試效果
在 3 種 CPU 硬體平臺測試了 TurboTransformers 的效能表現,選擇 pytorch、pytorch-jit 和 onnxruntime-mkldnn 和 TensorRT 實現作為對比。效能測試結果為迭代 150 次的均值。為了避免多次測試時,上次迭代的資料在 cache 中快取的現象,每次測試採用隨機資料,並在計算後重新整理的 cache 資料。
相比 61xx 型號,Intel Xeon 6133 向量化長度更長為 512 bit,並且它擁有一個 30 MB 核間共享 L3 cache。
GPU 測試效果
在 4 種 GPU 硬體平臺測試了 TurboTransformers 的效能表現,選擇 pytorch、NVIDIA Faster Transformers、onnxruntime-gpuTensorRT 實現作為對比。效能測試結果為迭代 150 次的均值。
同時,騰訊也表示,TurboTransformers 目前只支援了 FP32 的計算,對於 GPU FP16 的支援將在後續提供。TurboTransformers 目前重點支援了 BERT 模型,未來也會增加 TurboTransformers 的自動化最佳化能力。另外,TurboTransformers 解決了計算加速的問題,使用者還需要自己搭建服務框架,未來騰訊也會將服務流程開源,打通使用者上線的最後一站。
[admin
]