大模型科研篇1-PD概念和并行计算概念


大模型科研篇1-PD概念和并行计算概念

PD概念

大模型的 prefill 和 decode 是什么意思?

在大规模语言模型(如 GPT-3、GPT-4 等)的推理(inference)过程中,prefilldecode 是两个关键阶段,分别对应于模型在生成文本时的不同处理过程。这两个概念对于理解和优化大模型的性能至关重要。

  • 预填充阶段(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?”,并且我们想用一个语言模型来生成接下来的回复。

  1. 分词: 首先,输入文本会被分词器转换成一系列的令牌。例如,对于这个句子,分词器可能会将其分割为以下令牌序列:
    1. ["Hello", ",", "how", "are", "you", "?"]
  2. 预填充阶段 (Prefill Phase): 在预填充阶段,模型会处理整个输入序列,以生成初始的键-值6个(KV)缓存。这些缓存将用于后续的解码步骤。在这个阶段,模型实际上是在理解输入的上下文,并准备好生成输出“Today”。
  3. 解码阶段 (Decode Phase): 接下来,进入解码阶段,模型开始逐个生成新的令牌。假设我们的模型预测下一个令牌是“Today”,那么输出序列现在变为:
    1. ["Hello", ",", "how", "are", "you", "?", "Today"]

模型继续基于当前的上下文和之前的KV缓存来预测下一个令牌。比如,模型可能接着生成“I’m”、“fine”等,直到完成整个句子或达到预设的最大长度。

通过这种方式,令牌作为文本的基本单位,使得模型能够逐步理解和生成自然语言。

参考:

扫盲视频:Transformer

LLM推理入门

kv-cache

pagedAttention

prefill-decode 分离式架构

OSDI‘24–DistServe:分解预填充和解码实现吞吐量优化的LLM服务

Sigcomm’24-CacheGen用于快速大型语言模型服务的KV缓存压缩和流式传输

通过pd分离提高gpu利用率

并行计算概念

模型越来越大,需要更多的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. 是另一个微批。另一批数据。

张量并行


文章作者: 爱敲代码の鱼儿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 爱敲代码の鱼儿 !
  目录