当前位置: 首页 > 科技观察

微信也用的Transformer加速推理工具,现在腾讯开源了

时间:2023-03-17 14:57:25 科技观察

这几年,基于Transformer的模型可以说是在NLP界独辟蹊径。Transformer虽然在提高模型模型精度方面起到了不可低估的作用,但同时也引入了更大的计算量。那么,这个计算量是多少呢?让我们看看数据。因此,实现一种能够充分利用CPU/GPU硬件计算能力的Transformer推理方法是一个亟待解决的问题。近日,腾讯开源了一款名为TurboTransformers的工具,可以加速Transformer的推理过程,让你的推理引擎更加强大。该工具已在微信、腾讯云、QQ看点等产品中得到广泛应用,在在线预测场景中可以说是“身经百战”。Turbo具有以下三个特点:出色的CPU/GPU性能。针对NLP推理任务的特点量身定做。便于使用。值得一提的是,TurboTransformers是腾讯第100个通过Github开源的项目。那么,这样一个“有纪念意义”的开源工具到底有多厉害呢?接下来,我们将一一解释。多项性能测试“夺冠”Turbo在CPU/GPU性能上的表现可以说非常出色。pytorch/tensorflow和目前主流优化引擎的性能已经在多种CPU和GPU硬件上实现。CPU上的测试结果首先,TurboTransformers的性能在CPU硬件平台上进行了测试。选择pytorch、pytorch-jit和onnxruntime-mkldnn以及TensorRT实现进行比较。性能测试结果为150次迭代的平均值。为了避免多次测试时上一次迭代的数据缓存在缓存中的现象,每次测试使用随机数据,计算完成后刷新缓存数据。下图是IntelXeon6133CPU的性能测试结果。GPU上的测试结果其次,TurboTransformers的性能在GPU硬件平台上进行了测试。选择对比的对象有:pytorch、NVIDIAFasterTransformers、onnxruntime-gpuTensorRT。性能测试结果为150次迭代的平均值。下图是在NVIDIARTX2060GPU上的性能测试结果。接下来是在NVIDIAP40GPU上的性能测试结果。最后是在NVIDIAV100GPU上的性能测试结果。Turbo技术的原理可以做到这么好的推理性能,背后的计算原理是什么?TurboTransformers的软件架构如下图所示。让微信内的众多NLP线上应用充分提取底层硬件的算力,让算法更好地为用户服务。具体来说,TurboTransformers可以做三个方面的工作:算子优化、框架优化和接口部署简化。算子层优化Transformer包括哪些计算?如下图所示,图(a)为论文的Transformer结构示意图。这里,灰色框中的结构称为TransformerCell,BERT编码器堆叠了Nx个这样的TransformerCell。图(b)展开了一个Cell的细节,每个矩形都是一个独立的计算核心。TransformerCell计算包括8次GEMM(通用矩阵乘法)运算。通过调整英特尔MKL和cuBLAS的GEMM调用获得最佳GEMM性能。并且在硬件允许的情况下,使用tensorcore的方法在GPU上进行GEMM运算。与NVIDIAFasterTransformers解决方案类似,所有GEMM操作之间的计算被融合到一个调用核心中。Fusion会带来两个好处,一是减少内存访问开销,二是减少多线程启动开销。对于这些内核,openmp用于CPU上的并行处理,CUDA用于GPU上的优化实现。对于更复杂的LayerNorm和Softmax算子,它们包括不适合GPU并行的归约操作。TurboTransformers为它们设计了一种创新的并行算法,大大降低了这些算子的延迟。理论上,Transformers推理延迟应该近似于矩阵乘法延迟。框架级优化的TurboTransformers采用高效的内存管理方法。由于NLP的变长输入特性,每个操作的中间结果大小其实是不一样的。为了避免每次都分配和释放内存,研究人员通过Caching来管理显存。为了无缝支持pytorch/tensorflow训练的序列化模型,提供了一些脚本将两者的预训练模型转换成npz格式供TurboTransformers读取。特别是考虑到pytorchhuggingface/transformers是目前最流行的transformers训练方式,支持直接读入huggingface/transformers预训练模型。应用部署Turbo提供了C++和Python的调用接口,可以嵌入到C++多线程后台服务进程中,也可以添加到pytorch服务进程中。研究人员建议通过docker部署TurboTransformers,既保证了编译的可移植性,又可以无缝应用于K8S等在线部署平台。传送门GitHub项目地址:https://github.com/Tencent/TurboTransformers/blob/master/README_cn.md