点击上方“
杰哥的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”查看更多内容,回复“
微信”添加我微信。