LLMs 相关知识及面试题

语言模型

语言模型的定义是一种对令牌序列 (token) 的概率分布, 每个 token 被分配一个概率

自回归语言模型 (Autoregressive language models)

序列 x1:Lx_{1:L} 的联合分布 p(x1:L)p(x_{1:L}) 的常见写法是使用概率的链式法则:

p(x1:L)=i=1Lp(xix1:i1)p(x_{1:L}) = \prod_{i=1}^L p(x_i|x_{1:i-1})

在自回归语言模型 pp 中生成整个序列 x1:Lx_{1:L}, 需要逐 token 生成, 每个 token 基于之前生成的 token 计算获得

fori=1,...,L:xip(xix1:i1)1/Tfor i = 1, ... , L:\\ \qquad\qquad x_i \sim p(x_i | x_{1:i-1})^{1/T}

其中, T0T\geq 0 是一个控制我们希望从语言模型中得到多少随机性的温度参数

  • T=0: 确定性地在每个位置 i 选择最可能的 token xix_i
  • T=1: 从纯语言模型 “正常 (normally)” 采样
  • T=\infty: 从整个词汇表上的均匀分布中采样

加速推理

KV cache

设输入序列长度为 s, 输出序列长度为 n, 模型深度为 l, 维度为 h, 以 FP16 来保存 KV cache, KV cache 的峰值显存占用大小为

b(s+n)hl22=4lh(s+n)b(s + n)h * l * 2 * 2 = 4lh(s+n)

这里第一个 2 表示 K/V, 第二个 2 表示 FP16 占 2 bytes.

以 GPT3(175B) 为例, 对比 KV cache 与模型参数占用显存的大小, 已知 GPT3 weight 占用显存大小为 350 GB(FP16), 层数l=96, 维度h=12888

batch size s+n KV cache(GB) KV cache/weight
4 4096 75.5 0.22
16 4096 302 0.86
64 4096 1208 3.45

随着 bs 和长度 l 的增大, KV cache 占用的显存开销快速增大, 甚至超过模型本身.

优化 KV cache 的必要性:

  1. LLM 的窗口长度不断增大, 出现 LLM 窗口长度的增长需要与 GPU 显存有限间的矛盾. (以OpenAI API为例, 输出 token 其实比输出 token 更长)
  2. 消费级显卡上, 显存容量小, KV cache 在一定程度上降低了模型的 bs, KV cache 优化在工程落地中更显重要
  3. 部分文生视频或文生图的模型从 U-Net 转向 DIF (diffusion transformer) 架构, KV cache 可以起到类似 LLM 上的加速效果

KV cache 的作用

prefill 阶段: 输入问题 “what is the apples”, 返回了第一个 token “Apples”, 同时初始化 kv cache

decode 阶段: 输入单个词 q, 通过自回归的方式, 生成 “Apples are a boring fruit” 句子. 过程中 q 的长度为 1, 即当前词, 返回下一个词, 同时更新 kv cache

KV cache 过程

如图所示, kv cache 是 attention 计算中的全量 kv 缓存, 主要作用在 decode 阶段, 目的是将输入 Q 优化为输入 q