大模型科研篇1-PD概念和并行计算概念
PD概念
大模型的 prefill 和 decode 是什么意思?
在大规模语言模型(如 GPT-3、GPT-4 等)的推理(inference)过程中,prefill 和 decode 是两个关键阶段,分别对应于模型在生成文本时的不同处理过程。这两个概念对于理解和优化大模型的性能至关重要。
- 预填充阶段(Prefilling):在 LLM 推理过程中,预填充阶段是指模型在收到输入序列后,生成第一个输出词元之前的计算过程。
- 解码阶段(Decoding):解码阶段是指在预填充阶段生成第一个词元后,模型通过迭代生成后续词元的过程,直到生成结束标志或达到最大序列长度。
1.Encoder 和 Prefill 的区别
1.1 模型架构差异
- Encoder 是模型架构中的一个组件:它是特定模型(如 Encoder-Decoder 模型)中的一个模块,专门用于编码输入序列。
- Prefill 是模型推理过程中的一个阶段:它是模型在生成输出时的一个计算阶段,不一定对应于模型架构中的特定组件。
1.2 应用对象不同
- Encoder 针对 Encoder-Decoder 模型:
- 模型结构:Encoder-Decoder 模型明确区分了编码器和解码器部分。
- 任务类型:适用于需要将输入序列转换为输出序列的任务,如机器翻译。
- Prefill 针对自回归语言模型(Decoder-only 模型):
- Prefill decode
- 模型结构:如 GPT-3、GPT-4,没有明确的编码器部分,整个模型是一个大型的解码器。
- 任务类型:以文本生成为主,根据输入提示生成后续文本。
1.3 与解码器的关系
- Encoder 与 Decoder 是模型的两个部分:
- 协同工作:编码器提供输入的表示,解码器利用这些表示生成输出。
- Prefill 与 Decode 是推理过程的两个阶段:
- 顺序执行:prefill 阶段准备好初始状态,decode 阶段逐步生成输出。
Transformer = Bert +GPT = Encoder + Decoder
2.LLM 推理性能指标
下面是 Anyscale 公司,在 llmperf 工具中采用的一些推理性能测试指标:
- 每分钟完成请求数(RPS,Requests Per Second):衡量模型在一定时间内能处理的请求数量,反映了并发处理能力。
- 首字输出时间(TTFT,Time to First Token):从接收到请求到输出第一个字符的时间,表示初始响应速度。
- 字符间延迟(ITL,Inter-Token Latency):连续生成字符之间的平均时间,影响生成文本的流畅性和速度。
- 端到端延迟(End-to-End Latency):从请求发出到完成整个响应的时间,总体响应速度的体现。
- 每次典型请求的成本(Cost per Typical Request):综合考虑性能指标的成本效率。
3.KV-cache
重温一下self-attention什么是QKV,3个W是要学的参数矩阵,X是输入。
注意力机制:使用 Q、K、V 计算注意力权重,生成每个令牌的上下文感知表示(Contextual Representation)
X=[1,2,3,4] 分别对应缓慢输入进来的Q1,Q2,Q3,Q4
https://www.yidoo.xyz/images/3dd4913cf39f78580f17710ee638c773.gif
推理过程中,W是不变了。所以之前的K和V可以缓存。只是省去了K=XW的计算过程而已。
这样,在后续 token 的 Attention 计算中,无需重复计算 K 和 V,从而显著节约计算时间。
Qwen2 7B 这个国产大模型,在 4 K 序列长度下,KV Cache 大小是 1.6 GB!这是什么概念呢?要知道很多人的显卡也就 8GB 或者 16GB。怎么解决, PagedAttention!PagedAttention 的设计灵感来源于操作系统的虚拟内存分页技术。
将KV缓存分割成固定大小的“页” ,根据当前需要处理的数据,动态地加载相关的页面到内存中,并卸载不再需要的页面。
4.prefill和decode分离式架构
预填充阶段:
输入序列被分词器转换为令牌token。一个个英文单词X how are you
模型计算这些令牌的嵌入表示。
通过自注意力机制,计算出每个令牌位置的键和值向量,并存储在KV缓存中。
生成第一个输出令牌。I;m
传递内容:
KV缓存:包含所有输入令的键和值向量。
第一个输出令牌:预填充阶段生成的第一个输出令牌。
解码阶段:
使用传递过来的KV缓存和第一个输出令牌作为初始状态。
逐步生成后续的输出令牌,每次生成一个新令牌时,都会更新KV缓存。
重复上述过程,直到生成完整的输出序列。
5.令牌-token
例子:文本生成
假设我们有一个简单的句子:“Hello, how are you?”,并且我们想用一个语言模型来生成接下来的回复。
- 分词: 首先,输入文本会被分词器转换成一系列的令牌。例如,对于这个句子,分词器可能会将其分割为以下令牌序列:
["Hello", ",", "how", "are", "you", "?"]
- 预填充阶段 (Prefill Phase): 在预填充阶段,模型会处理整个输入序列,以生成初始的键-值6个(KV)缓存。这些缓存将用于后续的解码步骤。在这个阶段,模型实际上是在理解输入的上下文,并准备好生成输出“Today”。
- 解码阶段 (Decode Phase): 接下来,进入解码阶段,模型开始逐个生成新的令牌。假设我们的模型预测下一个令牌是“Today”,那么输出序列现在变为:
["Hello", ",", "how", "are", "you", "?", "Today"]
模型继续基于当前的上下文和之前的KV缓存来预测下一个令牌。比如,模型可能接着生成“I’m”、“fine”等,直到完成整个句子或达到预设的最大长度。
通过这种方式,令牌作为文本的基本单位,使得模型能够逐步理解和生成自然语言。
参考:
扫盲视频:Transformer
OSDI‘24–DistServe:分解预填充和解码实现吞吐量优化的LLM服务
Sigcomm’24-CacheGen用于快速大型语言模型服务的KV缓存压缩和流式传输
并行计算概念
模型越来越大,需要更多的GPU时间; 1块GPU训练十天,则1024块GPU只需要训练14分钟。
数据并行
蓝色绿色橙色,不同的数据集【将数据集切分为三份】。在不同的GPU上跑。跑的都是一个模型,比如都是”RestNet”
将权重改变全部交给中心服务器(比如zookeeper),比如四个是+1,+1,+1,-1,则ZK改变权重为+2。改变完之后再通知每个边缘服务器开始拉最新的参数。
Replicate -> Split Data -> Compute Gradients -> Push & Sum -> Update
先复制5份一样的模型(一份中心,四份边缘),然后把数据随机切分四份(数量相同),然后计算梯度,然后把计算值上传给中心模型,中心模型进行累加,最后中心模型把改变结果同步给边缘模型。
流水线并行
不同的GPU负责模型的不同的层,比如34个GPU负责RestNet的34个层。
微批,是将一个大的数据流切分为好多批次。
横坐标是随着时间的流动。4种颜色对应4块GPU。每个GPU处理模型的一层。Bubble代表空闲期。
F0,0 F1,0. F2,0. 是一个微批。
F0,1. 是另一个微批。另一批数据。