量子位@| 腾讯第100个对外开源项目,微信也在用的Transformer加速推理工具( 二 )


图(b)将一个Cell的细节加以展开 , 每一个矩形都是一个独立的计算核心 。
量子位@| 腾讯第100个对外开源项目,微信也在用的Transformer加速推理工具
文章图片
TransformerCell计算包含了8个GEMM(通用矩阵乘法 , GeneralMatrixMultiplication)运算 。 通过调优IntelMKL和cuBLAS的GEMM调用方式来获得最佳GEMM性能 。
并且在硬件允许条件下 , 在GPU上使用tensorcore方式进行GEMM运算 。
类似NVIDIAFasterTransformers方案 , 将所有GEMM运算之间的计算融合成一个调用核心 。 融合会带来两个好处 , 一是减少了内存访问开销 , 二是减少多线程启动开销 。
【量子位@| 腾讯第100个对外开源项目,微信也在用的Transformer加速推理工具】对于这些核心 , 在CPU上采用openmp进行并行 , 在GPU上使用CUDA进行优化实现 。
对于比较复杂的LayerNorm和Softmax算子 , 它们包含了不适合GPU上并行的规约操作 , TurboTransformers为它们设计了创新并行算法 , 极大降低了这些算子的延迟 。
理论上Transformers推理延迟应该近似于矩阵乘法延迟 。
框架层优化
TurboTransformers采用了一个有效的内存管理方式 。
由于NLP的采用变长输入特性 , 每次运算中间结果的大小其实并不相同 。 为了避免每次都分配释放内存 , 研究人员通过Caching方式管理显存 。
为了能够无缝支持pytorch/tensorflow训练好的序列化模型 , 提供了一些脚本可以将二者的预训练模型转化为npz格式 , 供TurboTransformers读入 。
特别的 , 考虑到pytorchhuggingface/transformers是目前最流行的transformers训练方法 , 支持直接读入huggingface/transformers预训练模型 。
应用部署
Turbo提供了C++和Python调用接口 , 可以嵌入到C++多线程后台服务流程中 , 也可以加入到pytorch服务流程中 。
研究人员建议TurboTransformers通过docker部署 , 一方面保证了编译的可移植性 , 另一方面也可以无缝应用于K8S等线上部署平台 。
—完—