前言
本文主要介绍Transformer类网络在GPU设备上部署上的优化要点。 主要围绕Nvidia开源的FasterTransformer展开。
模型结构分析
标准的Transformer结构主要包括 Encoder
和 Decoder
两部分结构,具体结构分析可参考Transformer在CV领域的应用与部署:
Encoder对应算子结构为:
Decoder对应算子结构为:
可以发现:
Encoder/Decoder的基本结构还是一致的。其中主要算子(算力大头)为GEMM/Softmax算子;另外存在大量add bias/normalization操作(包含大量小算子)。从 Encoder
模型下面流水图中可以发现:大量的小算子会导致CPU侧的算子”Launch”时间变长,呈现“Launch Bound”的现象,无法完全发挥GPU的算力。
具体优化措施
基于Transformer类网络的基本结构,当前NVIDIA做了一系列的优化。首先是算子融合层面,可以进行一系列的小算子融合:
- LayerNorm小算子融合:add bias + layernorm
- 激活函数小算子融合:add bias + relu/gelu
- Softmax小算子融合:add bias + Softmax
另外核心算子层面:
- GEMM为主要耗时算子,cuBLAS着力进行了性能优化:QKV GEMM融合等/GEMM配置自动选择等
- 采用了优化的Softmax算子:FP32/FP16实现不同
其他优化点:
- 采用了half2数据类型,能够减少数据拷贝的空间
- 指令层面:
- _expf替换expf运算:精度更低,但是性能更好(主要提速softmax?)
- 采用
__shfl_xor_sync
对reduce
操作进行加速(Layernorm)
优化后的 Encoder
结构流水图如下,可见各算子之间基本不存在空隙,提高了GPU的利用率;同时对核心算子的优化也大大提升了模型性能。