相关文章推荐

机器之心报道

机器之心编辑部

昨日,腾讯发布了在 GitHub 上的第 100 个开源项目「TurboTransformers」,在多种 CPU 和 GPU 硬件测试中,这款 Transformer 推理加速工具获得了超越 PyTorch/TensorFlow 和目前主流优化引擎的性能表现。


在自然语言处理领域,以 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 的支持等能力等。

 
推荐文章