LLM(大语言模型)部署加速方法——Faster Transformer篇
来自:AiGC面试宝典 作者:宁静致远 日期:2023年09月29日
一、为什么需要 FasterTransformer?随着大语言模型(LLM)的参数规模从数十亿增长到数千亿(如GPT-3有1750亿参数),推理(Inference)面临着巨大的挑战:
- 计算量大:每次推理需要完成数百亿次浮点运算
- 内存占用高:即使使用半精度(FP16)存储,GPT-3也需要约350GB显存
- 延迟高:单次推理可能需要数秒甚至数十秒
- 单卡难以承载:普通GPU的显存无法容纳整个模型
因此,需要专门的加速技术来优化推理过程,FasterTransformer应运而生。
📝 通俗解释:想象你要完成一个超级复杂的拼图(千亿参数的大模型),一个人做太慢太累。FasterTransformer就像一个组织多个人分工合作做拼图的系统——有人专门负责天空部分,有人负责建筑部分(张量并行),不同的人负责不同的拼图层级(流水线并行),这样就能大幅加快速度。
二、FasterTransformer 介绍
NVIDIA FasterTransformer (FT) 是一个用于实现基于Transformer的神经网络推理加速引擎的库,特别擅长处理大型模型,支持分布式部署到多个GPU和多个节点。
FasterTransformer 包含高度优化的Transformer块实现,包括编码器和解码器两部分。使用此模块,您可以运行完整的编码器-解码器架构(如T5),以及仅编码器模型(如BERT)或仅解码器模型(如GPT)的推理。
该库使用C++/CUDA编写,依赖于高度优化的cuBLAS、cuBLASLt和cuSPARSELt库,使您能够在GPU上构建最快的Transformer推理流程。
Faster Transformer模型加速推理应用 图片描述:左侧Inputs包含文档、相机、音频等图标;中间是NVIDIA FasterTransformer框图,内部列出了支持的模型如GPT-175B、T5、ViT、XLNet、LongFormer、Swin Transformer、BERT等,下方展示了Accelerated Multi-GPU/Multi-node inference及NVIDIA HARDWARE;右侧Tasks/Outputs列出了Classification、Generation、Summarization、Representation (Embeddings 、Others。)
📝 通俗解释:FasterTransformer就像一个"翻译官",它把PyTorch、TensorFlow这些深度学习框架的模型代码,翻译成GPU能直接执行的最底层指令,从而大幅提升推理速度。
三、FasterTransformer 核心是什么?
张量并行 (TP) 和流水线并行 (PP) 技术 图片描述:展示了Transformer layer #1和Transformer layer #2的并行处理。每个layer被分为Tensor MP partition #1和#2,以及Pipeline MP partition #1和#2。图注说明:图1.使用张量并行(张量MP分区)和管道并行(管道MP分区),在四个GPU之间分布了几个transformer/attention块
3.1 张量并行(Tensor Parallelism, TP)
当每个张量被分成多个块时,就会发生张量并行性,并且张量的每个块都可以放置在单独的GPU上。在计算过程中,每个块在不同的GPU上单独并行处理,最后通过组合来自多个GPU的结果来计算最终结果。
📝 通俗解释:比如你要计算一个大矩阵乘法,可以把这个大矩阵切成4块,分别放在4个GPU上同时计算,最后把4个GPU的结果拼起来。这就是"分块计算"的思想。
3.2 流水线并行(Pipeline Parallelism, PP)
当模型被深度拆分并将不同的完整层放置到不同的GPU/节点上时,就会发生流水线并行。
📝 通俗解释:就像工厂的生产线,第一个人负责组装零件,第二个人负责测试,第三个人负责包装。不同GPU负责模型的不同层级,上一层的结果传给下一层,形成"流水线"。
3.3 通信优化
在底层,启用节点间/节点内通信依赖于MPI和NVIDIA NCCL。使用此软件堆栈,您可以在多个GPU上以张量并行模式运行大型Transformer,以减少计算延迟。
同时,TP和PP可以结合在一起,在多GPU和多节点环境中运行具有数十亿和数万亿个参数(相当于TB级权重)的大型Transformer模型。
📝 通俗解释:MPI和NCCL是GPU之间"打电话"用的通信库,确保多个GPU之间能快速传递计算结果,不耽误彼此的工作。
3.4 多后端支持
除C++源代码外,FasterTransformer还提供:
- TensorFlow集成(使用TensorFlow算子)
- PyTorch集成(使用PyTorch算子)
- Triton集成作为后端
目前,TensorFlow算子仅支持单GPU,而PyTorch算子和Triton后端都支持多GPU和多节点。
为了避免为模型并行性而拆分模型的额外工作,FasterTransformer还提供了一个工具,用于将模型从不同格式拆分和转换为FasterTransformer二进制文件格式,然后可以直接加载运行。
📝 通俗解释:FasterTransformer支持多种"接口",无论你用PyTorch还是TensorFlow框架,都能方便地调用它的加速功能,就像手机充电有多种充电器一样。
四、FasterTransformer 优化策略
4.1 推理缓存优化(KV Cache)
动机:自回归推理时会产生大量的Key和Value缓存值,每次都需要重复计算,造成浪费。
优化策略:对这些产生的缓存分块存储,避免重复计算。
![图片描述:(Q * K^T) * V computation process with caching]图片展示了带有缓存机制的注意力计算过程,分为Step 1和Step N两个阶段:
- Step 1: Queries (4x64) 与 Keys_Transpose (64x4) 相乘,Values (64x4) 参与后续计算,计算出的Keys和Values被存入Cache memory,最终得到Results (4x64)
- Step N: 新的Queries (1x64) 进入,Keys_Transpose由Cached part K(来自缓存)和新计算部分组成,Values同样由Cached part V(来自缓存)和新计算部分组成,最终得到Results (1x64)
- 图例: 蓝色表示"Values that will be computed on this step",紫色表示"Values that will be taken from cache"
📝 通俗解释:就像背单词时,已记住的单词不用每次都重新背。KV Cache把之前计算过的Key和Value存起来,下次生成新词时直接复用,不用从头再算一遍,大大节省计算量。
4.2 内存优化(Activation Caching)
动机:大模型参数量巨大,即使量化到INT4也占用不少内存。GPT-3 175B使用半精度存储需要约350GB。
优化策略:FasterTransformer会缓存激活值和输出,在进行新句子推理时可以重新利用缓存的激活值和输出,避免多层反复计算和保存激活值信息。例如GPT-3层数为96层,因此只需要1/96的内存量用于激活。
📝 通俗解释:就像做数学题时,第一步算出来的中间结果可以先记在草稿纸上,后面用到时直接查看,不用重新计算。激活值缓存就是这个"草稿纸"的作用。
4.3 通信优化(MPI和NCCL)
张量并行:FasterTransformer遵循Megatron的思想。对于自注意力块和前馈网络块,FT按行拆分第一个矩阵的权重,并按列拆分第二个矩阵的权重。通过优化,FT可以将每个Transformer块的归约操作减少到两次。
流水线并行:FasterTransformer将整批请求拆分为多个微批次,隐藏了通信的气泡(Bubble)。FasterTransformer会针对不同情况自动调整微批次大小。
📝 通俗解释:张量并行是"空间上的分工",把计算任务切成块分给不同GPU;流水线并行是"时间上的分工",让不同GPU在不同时间做不同的事情。MPI和NCCL就是协调它们高效通信的"指挥官"。
4.4 矩阵乘法(MatMul)内核自动调整
矩阵乘法是基于Transformer的神经网络中主要和最繁重的操作。FT使用来自cuBLAS和cuTLASS库的功能来执行这些操作。重要的是,MatMul操作可以在"硬件"级别使用不同的低级算法以数十种不同的方式执行。
gemmBatchedEx函数实现MatMul操作,并以cublasGemmAlgo_t作为输入参数。使用此参数,您可以选择不同的底层算法。
FasterTransformer库使用此参数对所有底层算法进行实时基准测试,并为模型的参数和输入数据(注意力层大小、注意力头数量、隐藏层大小等)选择最佳算法。此外,FT对网络的某些部分使用硬件加速的底层函数,如__expf、__shfl_xor_sync。
📝 通俗解释:就像做菜有多种做法(炒、煮、蒸、煎),矩阵乘法也有几十种"算法做法"。FasterTransformer会实际测试每种方法哪种最快,然后自动选择最优的那个来执行。
4.5 量化推理
FT的内核支持使用FP16和INT8中的低精度输入数据进行推理。由于较少的数据传输量和所需的内存,这两种机制都允许加速。同时,INT8和FP16计算可以在特殊硬件上执行,例如Tensor Core(适用于从Volta开始的所有GPU架构),以及Hopper GPU中的Transformer引擎。
📝 通俗解释:量化就像把高清照片压缩成低分辨率——虽然细节损失了一些,但文件小了很多、加载快了很多。FasterTransformer支持把模型从32位浮点数"压缩"到16位或8位整数,大幅减少内存占用和计算量,同时利用GPU的专用计算单元(Tensor Core)保持速度。
参考来源:https://articles.zsxq.com/id_dd2gowztxtfg.html整理日期:2024年8月11日