点击蓝字关注我们
扫码关注我们
公众号 : 计算机视觉战队
扫码回复:腾讯开源,获取下载链接
自Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型,具体原理可以参考传送门的文章。之后google又提出了解决sequence to sequence问题的transformer模型,用全attention的结构代替了lstm,在翻译任务上取得了更好的成绩。本文主要介绍《Attention is all you need》这篇文章,自己在最初阅读的时候还是有些不懂,希望可以在自己的解读下让大家更快地理解这个模型。
1. 模型结构模型结构如下图:
和大多数seq2seq模型一样,transformer的结构也是由encoder和decoder组成。
1.1 Encoder
Encoder由N=6个相同的layer组成,layer指的就是上图左侧的单元,最左边有个“Nx”,这里是x6个。每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalisation,因此可以将sub-layer的输出表示为:
接下来按顺序解释一下这两个sub-layer:
Multi-head self-attention
熟悉attention原理的童鞋都知道,attention可由以下形式表示:
multi-head attention则是通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来:
self-attention则是取Q,K,V相同。
另外,文章中attention的计算采用了scaled dot-product,即:
作者同样提到了另一种复杂度相似但计算方法additive attention,在 很小的时候和dot-product结果相似,大的时候,如果不进行缩放则表现更好,但dot-product的计算速度更快,进行缩放后可减少影响(由于softmax使梯度过小,具体可见论文中的引用)。
Position-wise feed-forward networks
这层主要是提供非线性变换。Attention输出的维度是[bsz*seq_len, num_heads*head_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。
1.2 Decoder
Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,这里先明确一下decoder的输入输出和解码过程:
输出:对应i位置的输出词的概率分布
输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出
解码:这里要特别注意一下,编码可以并行计算,一次性全部encoding出来,但解码不是一次把所有序列解出来的,而是像rnn一样一个一个解出来的,因为要用上一个位置的输入当作attention的query
明确了解码过程之后最上面的图就很好懂了,这里主要的不同就是新加的另外要说一下新加的attention多加了一个mask,因为训练时的output都是ground truth,这样可以确保预测第i个位置时不会接触到未来的信息。
加了mask的attention原理如图(另附multi-head attention):
1.3 Positional Encoding
除了主要的Encoder和Decoder,还有数据预处理的部分。Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。
这里作者提到了两种方法:用不同频率的sine和cosine函数直接计算学习出一份positional embedding(参考文献)经过实验发现两者的结果一样,所以最后选择了第一种方法,公式如下:
2. 优点
作者主要讲了以下三点:
如今腾讯也开源了!
在自然语言处理领域中,以 BERT 为代表的 Transformers 相关神经网络模型是近年来最重要的模型创新,可以为阅读理解、文章摘要、语义分类、同义改写等 NLP 任务提供显著的效果提升。但提高模型精度的同时,Transformes 相关模型也带来了更多的计算量。
由于深度学习的训练和推理任务存在差异,训练框架直接应用于线上推理并不能得到极致的性能。众多模型算法工程师都遇到了训练的模型效果很好,但因为响应延迟不满足要求,导致模型无法上线的问题。
腾讯介绍,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 预训练模型。
应用部署
TurboTransformers 提供了 C++ 和 Python 调用接口,可以嵌入到 C++ 多线程后台服务流中,也可以加入到 PyTorch 服务流中。官方建议通过 Docker 部署 TurboTransformers,一方面保证编译的可移植性,另一方面也可以无缝应用于 K8S 等线上部署平台。
性能方面,官方分别以 CPU 和 GPU 两方面进行测试:
CPU 测试效果
在 3 种 CPU 硬件平台测试了 TurboTransformers 的性能表现,选择 pytorch、pytorch-jit 和 onnxruntime-mkldnn 和 TensorRT 实现作为对比。性能测试结果为迭代 150 次的均值。为了避免多次测试时,上次迭代的数据在 cache 中缓存的现象,每次测试采用随机数据,并在计算后刷新的 cache 数据。
Intel Xeon 61xx
Intel Xeon 6133
相比 61xx 型号,Intel Xeon 6133 向量化长度更长为 512 bit,并且它拥有一个 30 MB 核间共享 L3 cache。
GPU 测试效果
在 4 种 GPU 硬件平台测试了 TurboTransformers 的性能表现,选择 pytorch、NVIDIA Faster Transformers、onnxruntime-gpuTensorRT 实现作为对比。性能测试结果为迭代 150 次的均值。
RTX 2060
Tesla V100
Tesla P40
Tesla M40
同时,腾讯也表示,TurboTransformers 目前只支持了 FP32 的计算,对于 GPU FP16 的支持将在后续提供。TurboTransformers 目前重点支持了 BERT 模型,未来也会增加 TurboTransformers 的自动化优化能力。另外,TurboTransformers 解决了计算加速的问题,用户还需要自己搭建服务框架,未来腾讯也会将服务流程开源,打通用户上线的最后一站。
扫码关注我们
公众号 : 计算机视觉战队
扫码回复:腾讯开源,获取下载链接