自回归模型的两个阶段
- Prefill 阶段:并行处理输入 prompt 的所有 token,并输出第一个 token;同时生成用于未来解码的 KV Cache。因为输入序列长度很长,所以计算开销大,很小的 batch size (批量处理的序列数)就会让 GPU 打满。增大 batch size,prefill 阶段单个 token 开销几乎是不变的。
- Decode 阶段:(开启 KV Cache)使用先前的 KV Cache 以自回归方式逐步生成新的 token。Decode 阶段在每个自回归步仅仅会生成一个 token。虽然decode 阶段输入的序列长度一直是 1,但是需要反复读取 KV Cache,故而 IO 开销很大。Decode 时,单个 token 的开销显著大于 prefill 阶段。需要把 decode 阶段的 batch size 配置得非常大才有可能占满 GPU ,但会因为 KV Cache 读写开销太大而变得不现实,所以 Decode 阶段的 GPU 利用率很低。
TTFT(Time To First Token)指的是用户发出请求后,模型输出第一个 token 所需的时间,它主要受预填充(prefill)阶段计算和缓存加载影响,决定了响应的“开口速度”; TPOT(Time Per Output Token)是模型在开始生成后,平均每个 token 的输出耗时,它反映了增量解码阶段(decode)的效率,决定了生成过程的“语速流畅度”。 换句话说,TTFT解决“多久开始说话”,TPOT衡量“说话有多快”。
多头注意力机制
在语言模型(LLM)中,“head” 通常指的是自注意力机制(self-attention mechanism)中的一个注意力头(attention head)。在多头注意力机制(multi-head attention)中,多个注意力头被用来从不同的表示子空间中提取信息,每个注意力头可以被看作是一个独立的注意力机制。通过同时使用多个注意力头,模型能够捕获输入序列中更丰富和多样的特征。
注意力头(Attention Head)是自注意力机制中的一个关键组件,它帮助模型在处理输入序列时识别和关注重要部分。通常,自注意力机制中的注意力头包含以下几个步骤:
-
线性变换:
- 输入序列中的每个元素通常被表示为一个向量。对于每个注意力头,这些输入向量首先通过三个不同的线性变换层,分别生成查询(Query)、键(Key)和值(Value)向量。这些变换通常用参数矩阵 , , 和 表示:
其中 是输入序列的表示。
-
计算注意力分数:
- 对于每个查询向量 ,通过与所有键向量 计算点积以获得注意力分数。这些分数度量了输入序列中各个位置之间的相关性: