大模型-分布式推理简介
一、概览
1.1 背景介绍
大模型通常指的是参数规模庞大、计算复杂度高的深度学习模型,这些模型在推理阶段需要巨大的计算资源。而在2023年年尾,随着大模型的迅速发展,大模型的应用层出不穷,如何提高大模型的推理效率,使用高效的分布式推理变得至关重要。
大型语言模型(LLMs)主要采用Transformers架构,该架构在训练阶段具有高度的并行性。然而,在实际应用中,高效地部署这些模型面临一些挑战。这是因为生成推理是逐个token进行的,而每个token的计算都依赖于先前生成的标记。因此,支持大规模训练的模型需要仔细考虑并行布局和内存优化,以实现所需的可扩展性和高效的低延迟推理。从而更好地支持大规模训练的模型在实际应用中实现高效的低延迟推理,从而满足对于实时性和可扩展性的需求。
然而,在实际的工程化环境中,模型性能优化从未是一个简单的最优化问题。在大型语言模型(LLMs)的生成推理中,我们面临着诸多挑战,包括庞大的内存占用、严格的延迟目标以及长序列长度,不同指标的优化方法还存在一定的冲突。
一次端到端的推理延迟包括两个主要部分:数据处理(prefill,大部分在CPU上进行处理)和逐词生成(decode,大部分在GPU上进行)。
内存成本在prefill和decoder两个阶段都会存在,主要体现在将数据从HBM(high-bandwidth memory)传输到计算核心的成本上。主要的占用是模型本身的占用+kv cache+额外的一些参数的占用。
tips:分布式训练技术的介绍:https://zhuanlan.zhihu.com/p/598714869
1.2 分布式推理简要介绍
模型推理中的分布式并行技术,是指将一个大模型的推理过程拆解到多个设备或计算节点上运行,以达到 提升吞吐、加速响应、突破单卡显存限制 等目的。
1.2.1 模型并行
当有超大模型的模型,比如千亿模型,单卡放不下的时候,这个时候就可以进行模型并行。将模型参数按层或按张量拆分在多个推理设备上进行推理。输入数据,每个设备按照模型的层结构的顺序依次推理,每个设备的推理数据逐层的传递。所有的设备构成了整个完整的推理流程。比如设备1放置0-3层,设备2放置4-7层,设备3放置8-11层。
1.2.2 流水线并行
当模型并行按照层数进行拆分,也就是将模型纵向拆分,每个GPU只包含模型的一部分层,数据在一个GPU完成运算后,传给下一个GPU继续计算。这样可以在多个GPU上同时进行不同阶段的计算,提高资源利用率,类似于流水线机制一样,每个设备专注于每个阶段的计算,这种方式就是流水线并行。也可以说流水线并行是模型并行的一种特例。优点就是整体的吞吐量大,但是首次延时较长。
1.2.3 张量并行
当模型并行按照张量进行拆分,也就是将模型横向的拆分,比如一个大的矩阵拆分到多个推理设备上进行推理计算的时候,这种方式就是张量并行,典型的将 QKV
权重矩阵按列切到多个卡进行分布式计算,这种方式多用于Attention和FNN的线性层的大矩阵计算。从这个角度说数据并行是模型并行的一种特例。
1.2.4 数据并行
当有多用户的批量请求的时候,每个设备处理不同 batch,可以在多个推理设备上使用相同模型副本,然后针对每个设备输入不同的batch数据,这样子也可以提升整体的吞吐量,也就是空间换时间的做法。适用于推理场景中批量请求,提升吞吐。
1.2.5 混合并行
顾名思义就是多种并行方式进行结合的一种并行策略。
1.2.6 常见并行说法的解释
比如说我们常常讲到的MOE并行(专家并行),即将大模型FNN结构拆分成多个小模型(专家,expert
), 推理自动的决定激活一部分专家用于计算,达到了节省计算资源的效果; 并引入可训练并确保稀疏性的门( gate
)机制,以保证计算能力的优化。
使用 MoE 结构,可以在计算成本次线性增加的同时实现超大规模模型推理和训练,为恒定的计算资源预算带来巨大增益。而 MOE 并行,本质上也是一种模型并行方法。
Kv cache分布式存储,当在多卡/多节点环境下部署大模型推理时,Key/Value 缓存(KV Cache)并不会集中在单个设备上,而是被拆分存储和管理在多个设备上。这样做的目的是: 降低显存压力,支持大模型在分布式架构上运行,加速推理。当模型本身已经被分布式切分运行,KV Cache 自然也要跟着一起“分布”到多个设备。原因是:
-
模型本身已经被张量并行(TP)或模型并行(MP),那么每个 GPU 只负责部分计算。
-
如果 KV Cache 不分布,就会出现跨设备依赖/通信瓶颈。
-
所以 KV Cache 必须“在哪算的就存在那”。
-
Infinite-llm: Efficient llm service for long context with distattention and distributed kvcache
分离式架构:这个思想其实比较简单,就是prefill 和 generate 分别放在不同的gpu上,
-
Inference without Interference:Disaggregate LLM Inference for Mixed Downstream Workloads,
-
Splitwise: Efficient Generative LLM Inference Using Phase Splitting,
-
DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving,
这几篇论文都是分离式架构的论文,下面会详细的说明。