腾讯开源 TurboTransformers,推理加速性能超越 TensorRT 等主流优化引擎!

点击上方“ 杰哥的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 具有高速、实用、简单三个特色:
 
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 已应用在腾讯内部多个线上 BERT 服务服务场景,微信经常使用问题回复服务得到 1.88x 加速,公有云情感分析服务得到 2.11x 加速,QQ 看点推荐服务得到 13.6x 加速。

总体架构

TurboTransformers 在算子优化、框架优化和接口部署方式简化三个方面作了改进。

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 测试结果。

NVIDIA V100 GPU 测试结果。

此外,团队还在多个CPU和GPU等平台上测试了 TurboTransformers,更多性能测试结果可见项目主页。

目前,TurboTransformers 暂时只支持 FP32 的计算,将来腾讯将对其进一步改进,包括对 GPU FP16 的支持等能力等。

来源:机器之心前端

本公众号所有博文已整理成一个目录,请在公众号后台回复「m」获取!
python

   
推荐阅读:
一、 国内良心 Linux 桌面操做系统,全新 Deepin V20 来了!(附下载地址)
二、 2020年最漂亮的 Linux 发行版
三、 这多是史上最全的权限系统设计
四、 这张「二维码」火到了GitHub热榜第一:扫一扫,打破系统边界,文件秒传!
五、 太强了!GitHub 上值得收藏的100个精选前端项目!
六、 将来 10 年,软件开发技术的 8 个发展趋势
关注微信公众号『 杰哥的IT之旅』,后台回复“ 1024”查看更多内容,回复“ 微信”添加我微信。

好文和朋友一块儿看~

本文分享自微信公众号 - 杰哥的IT之旅(Jake_Internet)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。git

相关文章
相关标签/搜索