01 介绍
自从 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 获取项目全部源代码,最新的性能数据以及支持的特性。欢迎大家前往使用、加星及反馈。
02 性能 由于目前没有针对 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 的镜像
超参数设定:· head_num = 96· size_per_head = 128· vocabulary_size = 51200· top p = 0.9· GPU number = 8xA100· data type = FP16 由于 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 上的时延与加速比。* FT:FasterTransformer 使用 triton backend
表2. FasterTransformer 与 Megatron 在 GPT-89B 上的时延与加速比。 * 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的情况下,也会显存溢出。
03 使用说明 目前,FT-GPT 的多卡推理提供了两大类的解决方案。第一大类是 C 与 PyTorch 的接口;第二大类则是针对 Triton 服务提供的 backend。
04 C 与 PyTorch 接口
在 C 与 PyTorch 上,我们主要结合了 MPI 与 NCCL 的使用,来达成多卡+多节点的推理。其中,MPI 当中的每一个进程会负责一个 GPU 的工作。MPI 主要的功能是在前期提供 NCCL 初始化的相关参数,并在推理的开始时,将输入送到所有的进程上。在实际的推理过程当中,MPI是不参与的,所有的通讯都是透过 NCCL 直接在 GPU 之间完成。
05 Triton backend Triton 是一个针对服务设计的服务框架。和过往单 GPU 的情况不同,多 GPU 推理的服务部署要更加复杂。为了能让使用者更容易的将 FT-GPT 部署到实际的业务上,我们同时提供了 FT-GPT 的Triton backend。使用者只要按照说明分配放置好模型、编译好 FasterTransformer GPT backend 之后,就可以透过 Triton server 很容易的将FT-GPT 使用起来。不过由于 Triton 目前设计上较难让多个进程之间进行通信,现在只能透过多线程的方式,支持单机多 GPU 的服务。图1展示了目前 FT-GPT 在 Triton backend 上的运作流程。 图 1. FT-GPT 在 Triton backend 的流程
06 结论 FasterTransformer 4.0 是目前第一个能支持多 GPU、多节点 GPT 模型的推理框架。同时,也继承了过往 FasterTransformer 本身的 kernel 优化与显存优化,对比一般的训练框架不管在速度上还是显存使用上都有一定的优势。此外,同时提供了C, PyTorch 的接口与 Triton 服务的 backend,让使用者能够在最短时间内将 GPT-3这样的巨大模型部署上线。除了这个重大更新之外,我们也在 FasterTransformer 当中优化了很多 encoder 与 decoder的kernel,带来更好的效果。
07 其他相关文章 快无止尽! FasterTransformer 2.0 让 Decoder 不再是你的性能瓶颈。 CNS20389 NVIDIA 的 BERT 量化方法与工具 (Quantization Methods and Tools for BERT) CNS20306 Faster Transformer 3.0 编码器的 INT8 量化实现 (The INT8 Quantization of Faster Transformer 3.0 Encoder) Faster Transformer V3.1发布,观看视频了解对哪些性能进行了优化
|