LLM 技术速查表
本章目标:公式、面试常问、快速对比表
1. 核心公式速查
1.1 位置编码
| 名称 | 公式 | 特点 |
|---|---|---|
| Sinusoidal | $PE_{(pos,2i)} = \sin(pos/10000^{2i/d}), PE_{(pos,2i+1)} = \cos(...)$ | 绝对位置,可外推 |
| RoPE | $R_{m,d} = \begin{bmatrix} \cos(m\theta) & -\sin(m\theta) \ \sin(m\theta) & \cos(m\theta) \end{bmatrix}$ | 相对位置,外推好 |
| ALiBi | $score_i \leftarrow score_i - m \cdot | i-j |
| RoPE 远程衰减 | $\frac{1}{c \cdot (i-j) + b}$ | 位置越远,attention 越低 |
1.2 注意力机制
| 名称 | KV Cache 大小 | 参数量变化 |
|---|---|---|
| MHA | $2 \times num_heads \times head_dim$ | 标准 |
| MQA | $2 \times head_dim$ | K/V 参数量 $\frac{1}{h}$ |
| GQA | $2 \times num_kv_heads \times head_dim$ | K/V 参数量 $\frac{g}{h}$ |
1.3 显存估算
模型参数 (FP16/BF16):
参数显存 = 参数量 × 2 bytes
模型参数 (INT4):
参数显存 = 参数量 × 0.5 bytes
Optimizer State (AdamW):
optimizer 显存 = 参数量 × 12 bytes (FP32 states)
梯度:
梯度显存 = 参数量 × 2 bytes (BF16)
KV Cache:
KV_Cache = 2 × batch × seq_len × num_kv_heads × head_dim × bytes
激活值 (估算):
激活显存 ≈ 2 × batch × seq_len × hidden_dim × layers × bytes1.4 LoRA 参数
可训练参数量 ≈ 2 × r × (d_in + d_out)
= 2 × r × hidden_dim × (rank + rank)
实际显存节省 ≈ 参数量 / (2 × r × hidden_dim) 倍2. 模型架构对比
2.1 位置编码对比
| 特性 | RoPE | ALiBi | Sinusoidal | Learnable |
|---|---|---|---|---|
| 相对位置 | ✅ | ✅ | ❌ | ❌ |
| 外推能力 | ✅ 好 | ✅ 好 | ❌ 差 | ❌ 差 |
| 计算效率 | ✅ | ✅ | ❌ | ✅ |
| 外推到超长 | ✅ NTK | ✅ | ❌ | ❌ |
| LLM 使用 | LLaMA, GLM | BLOOM | 原始 | 早期 BERT |
2.2 Attention 机制对比
| 特性 | MHA | MQA | GQA |
|---|---|---|---|
| K/V 头数 | = num_heads | = 1 | = num_kv_heads |
| KV Cache | 大 | 最小 | 中等 |
| 生成速度 | 慢 | 快 | 中 |
| 质量 | 最高 | 略低 | 接近 MHA |
| 适用 | 小模型 | 推理优化 | 大模型 (LLaMA 2 34B+) |
2.3 归一化对比
| 特性 | LayerNorm | RMSNorm | DeepNorm |
|---|---|---|---|
| 计算 mean | ✅ | ❌ | ✅ |
| 公式 | $\frac{x - \mu}{\sigma} \cdot \gamma + \beta$ | $\frac{x}{RMS(x)} \cdot \gamma$ | $\alpha \cdot LayerNorm(x + f(x))$ |
| 速度 | 基准 | 快 10-30% | 中 |
| 稳定性 | 中 | 中 | ✅ 好 (深层) |
3. 量化技术对比
3.1 量化格式
| 格式 | 精度 | 显存节省 | 速度 | 质量损失 |
|---|---|---|---|---|
| FP32 | 32bit | 1x | 1x | 无 |
| FP16 | 16bit | 2x | ~1x | 小 |
| BF16 | 16bit | 2x | ~1x | 更小 |
| INT8 | 8bit | 4x | ~1.5x | 中 |
| INT4 | 4bit | 8x | ~2x | 较大 |
| FP8 | 8bit | 4x | ~2x | 小 (H100) |
3.2 量化方法对比
| 方法 | 原理 | 校准数据 | 适用场景 | 质量 |
|---|---|---|---|---|
| GPTQ | OBQ 逐层贪心 | ✅ 需要 | 推理 | 好 |
| AWQ | 保留显著权重 | ✅ 需要 | 推理 | 更好 |
| SmoothQuant | 平滑权重分布 | ✅ 需要 | 推理 | 好 |
| bitsandbytes | 动态量化 | ❌ | 训练+推理 | 中 |
| GGUF | Q4_K_M 等多种 | ❌ | CPU/边缘 | 取决于实现 |
3.3 量化公式
对称量化:
scale = max(|x|) / (2^(n-1) - 1)
x_q = round(x / scale)
x_deq = x_q × scale
非对称量化:
scale = (max - min) / (2^n - 1)
zero_point = round(-min / scale)
x_q = round(x / scale + zero_point)
x_deq = (x_q - zero_point) × scale
NF4 (NormalFloat):
量化中心 = N(0,1) 的分位数
适合正态分布的权重4. 对齐方法对比
| 方法 | 数据需求 | 稳定性 | 实现 | 效果 |
|---|---|---|---|---|
| SFT | 高质量对话 | 好 | 简单 | 基础 |
| RLHF | 成对偏好 | 中 | 复杂 | 最好 |
| DPO | 成对偏好 | 好 | 简单 | 接近 RLHF |
| IPO | 成对偏好 | 更好 | 简单 | 更稳定 |
| KTO | 单样本偏好 | 好 | 简单 | 灵活 |
RLHF 关键公式
Reward Model (Bradley-Terry):
L = -log(σ(r_chosen - r_rejected))
PPO 损失:
L = -min(r(θ)A, clip(r(θ), 1-ε, 1+ε)A)
KL 约束:
L_total = L_RLHF + β × KL(π_θ || π_ref)
DPO 损失:
L = -log(σ(β × (log π_θ(y_c) - log π_θ(y_r) - log π_ref(y_c) + log π_ref(y_r))))5. 长上下文技术
5.1 注意力近似方法
| 方法 | 复杂度 | 显存 | 精度 | 需重训练 |
|---|---|---|---|---|
| Flash Attention | O(N) | ✅ 省 | ✅ 几乎无损 | ❌ |
| Ring Attention | O(N) | ✅ 省 | ✅ 无损 | ❌ |
| Sparse Attention | O(N·k) | 省 | 中 | ❌ |
| LongLoRA | O(N/k) | 省 | 好 | ✅ |
| H2O | O(N) | 省 | 好 | ❌ |
| SnapKV | O(N) | 省 | 好 | ❌ |
5.2 位置外推方法
| 方法 | 原理 | 外推能力 | 质量 | 实现 |
|---|---|---|---|---|
| PI (线性插值) | 线性缩放位置 | 2x | 中 | 简单 |
| NTK-aware | 非线性缩放 | 好 | 好 | 中 |
| YaRN | 温度缩放 | 好 | 好 | 中 |
| Dynamic Scaling | 动态缩放 | 好 | 好 | 简单 |
6. 面试高频问题
6.1 架构相关
Q: RoPE 为什么能外推?
A:
1. RoPE 编码的是相对位置,不是绝对位置
2. 通过旋转矩阵实现:旋转角度只依赖 (m-n)
3. 外推时用 NTK-aware scaling 或 Position Interpolation
4. 核心公式:<R_m(q), R_n(k)> = f(q,k,m-n)Q: GQA 省多少显存?
A:
LLaMA-2 34B: num_heads=48, num_kv_heads=8
- MHA KV Cache: 2 × 48 × 128 × 2 = 24KB/token
- GQA KV Cache: 2 × 8 × 128 × 2 = 4KB/token
- 节省 6 倍
LLaMA-2 7B: num_heads=32, num_kv_heads=32 (MHA)
- 不节省(但 7B 用 MHA 也可以接受)Q: SwiGLU 为什么比 ReLU 好?
A:
1. SwiGLU = Swish(xW₁) ⊗ (xW₃)
2. Swish = x · sigmoid(x),是平滑的
3. ReLU 在 0 处梯度突变,可能导致神经元死亡
4. SwiGLU 有非零梯度,避免死亡
5. 门控机制让信息流动更好6.2 训练相关
Q: BF16 vs FP16 区别?
A:
FP16: 1+5+10 = 16 bits, 指数范围小
BF16: 1+8+7 = 16 bits, 指数范围接近 FP32
BF16 优势:
- 更大动态范围,不容易 overflow
- 混合精度训练更稳定
- LLM 训练推荐 BF16Q: Warmup 为什么需要?
A:
1. 随机初始化时参数方差大,梯度可能爆炸
2. Warmup 让学习率从 0 慢慢增加
3. 让模型参数先稳定,再大学习率
4. 通常 warmup_steps = 2000~100006.3 推理相关
Q: KV Cache 显存怎么算?
A:
以 LLaMA-2 7B, batch=1, seq=4096 为例:
- num_layers = 32
- num_kv_heads = 32 (MHA)
- head_dim = 128
- BF16 = 2 bytes
KV Cache = 2 × 32 × 4096 × 32 × 128 × 2
= 128 MB
如果是 34B (GQA, num_kv_heads=8):
KV Cache = 2 × 48 × 4096 × 8 × 128 × 2
= 48 MB (减少 2.7 倍)Q: 投机解码加速原理?
A:
1. 小模型(如 7B)一次生成 k 个 token
2. 大模型(70B)并行验证这 k 个 token
3. 如果小模型猜对了 → 一次输出 k 个
4. 如果错了 → 只输出前几个对的
加速比 ≈ 小模型速度 / 大模型速度 × k / (1 + rejection_rate)
通常 2-4x 加速Q: Paged Attention 是什么?
A:
传统 KV Cache:每个请求连续存储,碎片化严重
Paged Attention:分块管理 KV Cache,像操作系统的分页
优势:
- 减少显存碎片(从 60% → 90%+ 利用率)
- 提高并发(bs=1 → bs=32+)
- 支持 prefix caching6.4 量化相关
Q: GPTQ vs AWQ 区别?
A:
GPTQ:
- 逐层 OBQ 量化
- 需要校准数据
- 对所有权重一视同仁
AWQ:
- 保留 1% 显著权重为高精度
- 只量化 99% 的权重
- 质量更好,尤其对 LLMQ: INT4 量化后模型能用吗?
A:
能用,但有前提:
1. 用 GPTQ/AWQ 等方法,而非 naive INT4
2. 保留重要权重为更高精度(如 INT8)
3. 评估指标(困惑度、accuracy)下降 < 5%
LLaMA-2 70B INT4 (AWQ):
- 显存从 140GB → 35GB
- 质量损失 < 2%
- 单卡 A100 (80GB) 可运行7. 框架选择决策树
需要部署 LLM?
│
├─── 是
│ │
│ ├─── 需要最高吞吐?
│ │ │
│ │ ├─── 是 → TensorRT-LLM
│ │ └─── 否 → vLLM
│ │
│ ├─── 需要复杂推理(约束解码)?
│ │ │
│ │ └─── 是 → SGLang
│ │
│ └─── CPU/边缘部署?
│ │
│ └─── 是 → llama.cpp / GGUF
│
└─── 只是实验/微调?
│
└─── 是
│
├─── LoRA 微调 → QLoRA (bitsandbytes)
│
└─── 只是推理 → HuggingFace Transformers8. 常用配置参考
8.1 LLaMA 模型规格
| 模型 | 参数量 | num_heads | head_dim | GQA | 最大上下文 |
|---|---|---|---|---|---|
| LLaMA 2 7B | 7B | 32 | 128 | ❌ | 4096 |
| LLaMA 2 13B | 13B | 40 | 128 | ❌ | 4096 |
| LLaMA 2 34B | 34B | 48 | 128 | ✅ (8) | 4096 |
| LLaMA 2 70B | 70B | 64 | 128 | ✅ (8) | 4096 |
| LLaMA 3 8B | 8B | 32 | 128 | ✅ (8) | 8192 |
| LLaMA 3 70B | 70B | 64 | 128 | ✅ (8) | 8192 |
8.2 显存占用参考
| 模型 | FP16 | INT8 | INT4 (GPTQ) | INT4 + GQA |
|---|---|---|---|---|
| 7B | 14GB | 7GB | 3.5GB | - |
| 13B | 26GB | 13GB | 6.5GB | - |
| 34B | 68GB | 34GB | 17GB | ~10GB |
| 70B | 140GB | 70GB | 35GB | ~20GB |
8.3 常用超参数
python
# LoRA 常用配置
lora_config = {
'r': 16, # rank,通常 8-16
'lora_alpha': 32, # 通常 2*r
'lora_dropout': 0.05,
'target_modules': ['q_proj', 'v_proj'], # 通常 Q+V
'bias': 'none', # 或 'lora_only'
'task_type': 'CAUSAL_LM'
}
# QLoRA 配置
q_lora_config = {
'bnb_4bit_compute_dtype': torch.bfloat16,
'bnb_4bit_use_double_quant': True,
'bnb_4bit_quant_type': 'nf4' # NormalFloat4
}
# 训练配置
training_config = {
'per_device_train_batch_size': 4,
'gradient_accumulation_steps': 4, # 总 batch = 4*4 = 16
'learning_rate': 1e-4,
'warmup_steps': 100,
'num_train_epochs': 3,
'bf16': True,
'gradient_checkpointing': True,
'max_grad_norm': 1.0
}