昨日,腾讯发布了在 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 具备高速、实用、简单三个特点:面向 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 的支持等能力等。