自从 2018 年推出
FasterTransformer
之后,我们团队持续的对
FasterTransformer
进行开发与优化。从 1.0 版本针对 BERT 的优化、2.0, 2.1 版本针对 decoder 的优化、3.0 与 3.1 的版本中追加了
encoder INT8
的支持,让许多使用者能够顺利地在
transformer
的各种应用场景当中,更有效地使用 GPU。
在最新的 4.0 版本中,我们更提供了全球首个
在千亿级参数规模
的 GPT-3 模型上进行多机多卡的推理支持。由于 GPT-3 有多达 1750 亿的参数,即使使用 FP16 来储存模型,也需要 350 GBs 的 GPU 显存。面对这么巨大的模型,使用多卡推理势在必行。虽然目前有一些框架可以支持多卡的推理,如 Megatron-LM 与 DeepSpeed,但这些框架主要都是为了训练而设计的,缺少针对推理的优化。因此,在这次的更新当中,我们结合了 MPI 与 NCCL,让 FasterTransformer 可以透过张量并行 (tensor parallel) 和流水线并行 (pipeline parallel) 进行多 GPU 的推理,推出了 FasterTransformer-GPT (FT-GPT)。针对 GPT-3,我们测试了使用单机 8 卡的 DGX-A100-80GB 以及四机 32 卡的 DGX-1。此外,我们团队更提供了Triton backend,让使用者能够轻松地将 GPT-3 的推理部署到 Triton serving 上面。不过需要注意的是,目前的 Triton backend 只支持单机多卡的功能。如果必须使用多机多卡的话,还是必须使用 C 或是 PyTorch 的接口。
除了上述的重大新功能之外,我们也持续对现有的功能进行优化。例如,在 3.1 的时候,encoder 里面的 fused multi-head attention kernel 只支持 FP16 精度、并且要求 Turing 以上的架构。而在 4.0 的更新中,我们追加了 INT8 的 fused multi-head attention kernel;同时,Volta 架构在 FP16 精度下也可以使用 fused multi-head attention 的 kernel。
第三个优化点则是针对解码端 kernel 的优化。由于解码端的一个 batch 当中,有些句子可能已经先解码完成了,而有些句子还没有。这个情况下,我们可以省略这些已经完成的句子的计算。因此,我们在所有的自定义 kernel 当中都加入了这个机制来避免这些计算资源的浪费。在我们的测试当中,batch size 大的情况下,最多可以带来接近2倍的加速。
FasterTransformer 4.0 目前已经开源到新的独立项目当中,可以访问https://github.com/NVIDIA/FasterTransformer 获取项目全部源代码,最新的性能数据以及支持的特性。欢迎大家前往使用、加星及反馈。
由于目前没有针对 GPT-3 这种超大模型的推理框架,而 GPT-3 的开发团队也没有公开模型与代码,因此我们采用了
Megatron-LM (https://github.com/NVIDIA/Megatron-LM/tree/main/megatron)
这个训练框架作为标准,比较对象则是 FT-GPT 在 Triton 服务上的性能。
· CPU: AMD EPYC 7742 64-Core Processor
· NVIDIA DGX-A100 (with mclk 1593MHz, pclk 1410MHz)
· nvcr.io/nvidia/pytorch:20.12-py3 以及 nvcr.io/nvidia/tritonserver:21.02-py3 的镜像
· vocabulary_size = 51200
由于 GPT-3 完整模型在一些task下无法满足 1 秒钟的时延需求,我们提供了 96 层的GPT-3 (1750 亿参数) 以及 48 层的 GPT (约 890 亿参数)两个模型在不同输入/输出长度上,使用 8 张 A100 GPU 在张量并行下的结果。这里,GPT-175B 表示拥有 1750 亿参数的模型、GPT-89B 表示拥有 890 亿参数的模型。由于推理时的 batch size 通常不够大,这边并没有展示使用流水线并行的测试结果。
表1.
FasterTransformer
与
Megatron
在
GPT-175B
上的时延与加速比。
Batch size
|
Input SeqLen
|
Output SeqLen
|
Megatron (ms)
|
FT* (ms)
|
FT* speedup
|
1
|
128
|
8
|
660.38
|
488.86
|
1.35
|
2
|
128
|
8
|
687.34
|
509.47
|
1.35
|
4
|
128
|
8
|
1004.88
|
629.64
|
1.6
|
8
|
128
|
8
|
1705.07
|
749.86
|
2.27
|
16
|
128
|
8
|
3111.57
|
1037.47
|
3
|
|
|
|
|
|
|
1
|
512
|
32
|
2384.78
|
1719.96
|
1.39
|
2
|
512
|
32
|
2503.24
|
1830.56
|
1.37
|
4
|
512
|
32
|
3658.65
|
2092.56
|
1.75
|
8
|
512
|
32
|
6238.79
|
2629.97
|
2.37
|
16
|
512
|
32
|
11409.53
|
3706.23
|
3.08
|
* FT
:
FasterTransformer
使用
triton backend
表2.
FasterTransformer
与
Megatron
在
GPT-89B
上的时延与加速比。
Batch size
|
Input SeqLen
|
Output SeqLen
|
Megatron (ms)
|
FT* (ms)
|
FT* speedup
|
1
|
128
|
8
|
342.86
|
279.44
|
1.23
|
2
|
128
|
8
|
369.43
|
280.24
|
1.32
|
4
|
128
|
8
|
540.97
|
317.71
|
1.7
|
12
|
128
|
8
|
1263.39
|
445.46
|
2.84
|
16
|
128
|
8
|
1663.39
|
524.8
|
3.17
|
|
|
|
|
|
|
1
|
512
|
32
|
1244.81
|
887.52
|
1.4
|
2
|
512
|
32
|
1357.54
|
940.11
|
1.44
|
4
|
512
|
32
|
1970.08
|
1133.22
|
1.74
|
8
|
512
|
32
|
3341.66
|
1415.02
|
2.36
|
16
|
512
|
32
|
6090.07
|
1952.2
|
3.12
|
* FT:FasterTransformer使用triton backend
从上面的测试结果当中
,我们可以看到
FasterTransformer 带来的加速效果在两个模型上很接近。在 batch size 1, 2 下大概能带来 1.3 倍左右的加速;而 batch size 32时能带来 3 倍左右的加速。此外,还可以发现,在 GPT-89B 的模型上,当输入长度为512、输出长度为 32 时,Megatron 并无法满足时延小于1秒的要求。而FasterTransformer 在 batch size 2 的情况下仍然可以满足。
除了速度上的优势外,FasterTransformer 需要的显存也比较少。例如在总句子长度为2048的情况下,使用8张A100-80GB 的话,FasterTransformer 最多能使用batch size 16;相较之下,Megatron即使在batch size 1的情况下,也会显存溢出。
更多的性能数据以及4.0其他优化当中带来的效果欢迎参考
https://github.com/NVIDIA/FasterTransformer
里面的文檔。