腾讯宣布开源 Transformer 推理加速工具 TurboTransformers 。该工具面向自然语言处理领域中 Transformers 相关模型丰富的线上预测场景,据介绍,其在微信、腾讯云、QQ 看点等产品的线上服务中已经广泛应用,这也是腾讯对外开源的第 100 个项目 。

文章插图
在自然语言处理领域中,以 BERT 为代表的 Transformers 相关神经网络模型是近年来最重要的模型创新,可以为阅读理解、文章摘要、语义分类、同义改写等 NLP 任务提供显著的效果提升 。但提高模型精度的同时,Transformes 相关模型也带来了更多的计算量 。
【微信开源加速工具 TurboTransformers,超越 PyTorch/TensorFlow】由于深度学习的训练和推理任务存在差异,训练框架直接应用于线上推理并不能得到极致的性能 。众多模型算法工程师都遇到了训练的模型效果很好,但因为响应延迟不满足要求,导致模型无法上线的问题 。

文章插图
在这种背景下,腾讯微信团队研发了 TurboTransformers 加速器 。它来自于深度学习自然语言处理基础平台 TencentNLP Oteam,旨在搭建统一的深度学习 NLP (Natural Language Processing,自然语言处理)基础平台、提升研发效能 。特性主要有三点:
- 优异的 CPU/GPU 性能表现 。面向 Intel 多核 CPU 和 NVIDIA GPU 硬件平台,通过核心融合和并行算法优化,TurboTransformers 充发挥硬件的各层级并行计算的能力 。在多种 CPU 和 GPU 硬件上获得了超过 PyTorch/TensorFlow 和目前主流优化引擎(如 onnxruntime-mkldnn/onnxruntime-gpu、torch JIT、NVIDIA faster transformers)的性能表现 。
- 为 NLP 推理任务特点量身定制 。TurboTransformers 可以支持变长输入序列处理,无需序列补零、截断或者分桶带来的无用计算,也无需任何针对计算图在推理前进行预调优的过程 。
- 简单的使用方式 。TurboTransformers 支持 Python 和 C++ 接口进行调用 。TurboTransformers 支持 TensorFlow 和 PyTorch 预训练模型的载入 。它可以作为 huggingface/transformers 的推理加速插件,通过加入几行 Python 代码获得对 BERT 模型的端对端加速效果 。

文章插图
腾讯介绍,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 预训练模型 。
推荐阅读
- 微信消息延迟,更改手机这5个设置一键改善,要是还不会可惜了
- 多人中招!快来查查你的身份证是否被别人绑定微信支付
- 探寻5G本质,抢占5G先机丨i黑马X宽带资本“5G加速度”产业独角兽在线沙龙
- 微信转账转错人后被对方拉黑,你可以这样要回钱!
- 微信朋友圈可以发20张图真的假的,微信朋友圈怎么发20张图2022
- 微信 小程序 POST请求中文乱码的解决方法
- 10万元放在微信零钱通安全吗,微信理财通10万元一天收益多少
- 5G深度报告:科技新基建发力,5G驱动“云大物智”加速向上
- 多亏这些强大到逆天的微信办公小程序,工作效率猛翻10倍!太强了
- 微信11亿用户,为啥发朋友圈的人却越来越少?原因无非这3点
