LLM & Multimodal 面试复习笔记

09: 高频面试八股题集

收集整合自 wdndev/llm_interview_note、HarleysZhang/llm_note 等开源面经,按主题分类,可展开查看答案。
基础 进阶 深入 高频

Part 1: Transformer 核心机制

Transformer
Self-Attention 中为什么要除以 $\sqrt{d_k}$? 基础 高频

核心原因:防止 softmax 进入饱和区。

假设 $q$ 和 $k$ 的每个分量独立同分布,均值为0、方差为1,则 $q \cdot k = \sum_{i=1}^{d_k} q_i k_i$ 的方差为 $d_k$。

当 $d_k$ 很大时,点积的值可能非常大或非常小,导致 softmax 的梯度极小(接近 one-hot),反向传播时梯度消失。

除以 $\sqrt{d_k}$ 后,点积的方差归一化为 1,使 softmax 输出更均匀,梯度更健康。

公式:$$\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$

追问:如果不除,会怎样? → 训练初期注意力权重几乎是 one-hot,模型只关注少数 token,学习极慢。

Multi-Head Attention 为什么比 Single-Head 好?如何计算参数量? 基础 高频

动机:让模型同时从不同的表示子空间中获取信息。单头注意力只能学一种"关注模式",多头允许模型并行学习不同位置、不同语义关系的注意力模式。

参数量计算(假设 $d_{model}=D$,$h$ 头):

  • 每个头的 $W_Q, W_K, W_V$ 大小为 $D \times (D/h)$,共 $3 \times D \times D = 3D^2$
  • 输出投影 $W_O$ 大小为 $D \times D = D^2$
  • 总参数量 = $4D^2$(不含 bias),与头数 $h$ 无关

关键洞察:MHA 不增加参数量,而是把同样的参数分配到多个子空间,信息量更丰富。

Pre-Norm 和 Post-Norm 的区别?为什么现代 LLM 都用 Pre-Norm? 进阶 高频

Post-Norm(原始 Transformer): $x + \text{LN}(\text{SubLayer}(x))$

Pre-Norm(GPT-2+/LLaMA 等): $x + \text{SubLayer}(\text{LN}(x))$

对比维度Post-NormPre-Norm
训练稳定性需要 warmup,深层梯度问题训练更稳定,无需 warmup
最终性能略高(相同训练量下)略低但差距可忽略
深层可扩展性层数多时不稳定可扩展到数百层
残差通路经过 LN,信息有损直接残差连接,梯度畅通

原因:Pre-Norm 使残差连接成为真正的"直通路",梯度可以直接回传到底层,不经过 LayerNorm 的缩放,训练超深模型时更稳定。

现代 LLM 通常使用 RMSNorm 替代 LayerNorm,去掉了均值中心化,只保留方差归一化,计算更快且效果相当。

RoPE 旋转位置编码的原理?为什么比正弦编码好? 进阶 高频

核心思想:将位置信息编码为旋转变换,使得两个 token 的注意力分数只取决于它们的相对距离。

数学形式:对位置 $m$ 的向量 $x$,将相邻两维视为复数平面上的一个点,乘以旋转角 $e^{im\theta}$:

$$f(x, m) = \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} \otimes \begin{pmatrix} \cos m\theta \\ \sin m\theta \end{pmatrix}$$

具体地,$\langle f(q, m), f(k, n) \rangle$ 的结果只与 $m - n$(相对位置)有关。

优势对比:

  • 正弦编码:绝对位置,加法形式,不能直接表达相对位置
  • RoPE:相对位置,乘法形式,天然支持相对位置感知
  • RoPE 可外推到训练时未见过的更长序列(配合 NTK-aware 等方法)
  • RoPE 不增加任何可学习参数

外推问题:原始 RoPE 在超出训练长度时性能下降,NTK-aware RoPE 通过修改旋转频率基数来缓解,YaRN 进一步引入注意力缩放因子。

Transformer 模型参数量如何计算?以 LLaMA-7B 为例。 进阶

每个 Transformer Block 的参数:

  • Self-Attention: $4D^2$(Q/K/V/O 投影)
  • FFN: $D \times 4D + 4D \times D = 8D^2$(两层线性变换,中间维度通常为 $4D$)
  • LLaMA 用 SwiGLU FFN: $3 \times D \times \frac{8D}{3} \approx 8D^2$
  • LayerNorm: $2D$(可忽略不计)

每层总计约 $12D^2$

LLaMA-7B 验证:$D=4096$,$L=32$ 层

  • Attention: $4 \times 4096^2 \times 32 = 2.15B$
  • FFN (SwiGLU, 中间维度 11008): $3 \times 4096 \times 11008 \times 32 = 4.33B$
  • Embedding: $32000 \times 4096 = 0.13B$
  • 总计 ≈ 6.7B ✓

Part 2: LLM 架构设计

Architecture
为什么大模型几乎都用 Decoder-only 架构? 进阶 高频

三大原因:

  1. 训练效率:Decoder-only 使用 Causal Mask,每个 token 都能作为训练信号(next-token prediction),数据利用率最高。Encoder-only(如BERT)需要 mask 15% 的 token,效率较低。
  2. 零样本泛化:Decoder-only 的自回归生成天然适配各种 NLP 任务(摘要、翻译、QA 都可以转化为续写问题),不需要为每个任务设计不同的 head。
  3. Scaling Law 更友好:实验表明 Decoder-only 架构在同等参数/数据量下 scaling 效果最好,性能随规模增长最平滑。

补充观点(苏剑林):Causal Attention 的 mask 形式使 attention 矩阵满秩,信息表达能力更强;而 bidirectional attention 容易出现低秩退化。

Encoder-Decoder 的适用场景:输入输出长度差异大的任务(如翻译),但在 LLM 时代,通过 instruction tuning 统一为 seq2seq 形式后,Decoder-only 也能胜任。

MHA、MQA、GQA、MLA 分别是什么?如何选择? 进阶 高频
方法KV 头数KV Cache 大小代表模型
MHA (Multi-Head Attention)= Q 头数 $h$$2 \times L \times h \times d_{head} \times \text{seq}$GPT-3, BERT
MQA (Multi-Query Attention)1$2 \times L \times 1 \times d_{head} \times \text{seq}$PaLM, Falcon
GQA (Grouped-Query Attention)$G$(分组数)$2 \times L \times G \times d_{head} \times \text{seq}$LLaMA-2/3, Qwen2
MLA (Multi-head Latent Attention)压缩到低秩$2 \times L \times d_c \times \text{seq}$,$d_c \ll hd$DeepSeek-V2/V3

GQA 是目前主流选择:在 MHA 的性能和 MQA 的效率之间取得平衡。LLaMA-2 70B 用 8 组 GQA(32 个 Q 头分 8 组,每组共享 1 对 KV)。

MLA(DeepSeek-V2)核心思想:将 KV 投影到低维潜空间 $c = W_{DKV} \cdot h$,推理时只缓存 $c$(维度远小于完整 KV),解码时再还原 $K = W_{UK} \cdot c$, $V = W_{UV} \cdot c$。KV Cache 压缩比可达 10x+。

SwiGLU 激活函数是什么?为什么比 ReLU/GELU 好? 基础

SwiGLU 公式:

$$\text{SwiGLU}(x) = (\text{Swish}(xW_1)) \otimes (xW_2)$$

其中 $\text{Swish}(x) = x \cdot \sigma(\beta x)$,$\otimes$ 是逐元素乘法(门控)。

为什么更好:

  • 门控机制:GLU(Gated Linear Unit)让网络学习哪些信息应该通过,相当于一个可学习的信息过滤器
  • Swish 平滑性:相比 ReLU 没有不连续点,梯度流更平滑
  • 实验验证:Google PaLM 论文中对比了多种激活函数,SwiGLU 在同等参数量下 loss 最低

代价:FFN 需要 3 个权重矩阵($W_1, W_2, W_3$),为保持参数量不变,通常将中间维度从 $4D$ 缩小到 $\frac{8D}{3}$(LLaMA 实际用 11008 而非 16384)。

MoE(Mixture of Experts)的原理?负载均衡怎么做? 深入 高频

核心思想:用稀疏激活替代密集计算。每个 token 只被路由到少数几个专家(如 8 选 2),总参数量很大但每次推理的计算量与单个专家相当。

Router 路由机制:

$$g(x) = \text{TopK}(\text{softmax}(x \cdot W_r))$$

$$\text{output} = \sum_{i \in \text{TopK}} g_i(x) \cdot E_i(x)$$

负载均衡问题:如果某些专家总是被选中("赢者通吃"),其他专家退化为废参数。

解决方案:

  • 辅助损失(Auxiliary Loss):$L_{aux} = \alpha \cdot N \cdot \sum_{i=1}^N f_i \cdot P_i$,惩罚专家使用不均匀
  • Expert Capacity:设置每个专家的容量上限,超出的 token 被丢弃或溢出到下一层
  • Random Routing:Switch Transformer 中 TopK=1 + 随机性
  • DeepSeek-V2 的 Fine-grained Expert:256 个小专家 + 共享专家,路由更均匀

面试追问:MoE 的推理难点? → 内存占用大(所有专家权重都需加载)、不同 token 路由到不同专家导致 batch 内 GPU 利用率不均。

KV Cache 是什么?为什么推理时需要它?大小如何计算? 基础 高频

原理:自回归生成时,每一步只新增一个 token。如果不缓存,生成第 $t$ 个 token 时需要重新计算前 $t-1$ 个 token 的 K 和 V,计算量为 $O(t^2)$。KV Cache 把历史 K/V 存起来,每步只算新 token 的 K/V 并追加,计算量降为 $O(t)$。

大小计算:

$$\text{KV Cache} = 2 \times L \times n_{kv\_heads} \times d_{head} \times \text{seq\_len} \times \text{batch} \times \text{bytes}$$

LLaMA-2 7B(GQA, 8 KV heads)示例:

  • $2 \times 32 \times 8 \times 128 \times 4096 \times 1 \times 2 = 512\text{MB}$(FP16, seq=4096, batch=1)
  • 对比 MHA (32 KV heads): $2048\text{MB} = 2\text{GB}$ — GQA 压缩 4 倍

KV Cache 是推理时显存的主要瓶颈,这也是 PagedAttention(vLLM)、GQA、MLA 等技术的核心动机。

Part 3: 训练与微调

Training
LoRA 的原理是什么?为什么有效?Rank 怎么选? 基础 高频

核心思想:冻结原始权重 $W_0$,学习一个低秩增量 $\Delta W = BA$,其中 $B \in \mathbb{R}^{d \times r}$,$A \in \mathbb{R}^{r \times d}$,$r \ll d$。

$$h = (W_0 + \Delta W)x = W_0 x + BAx$$

为什么有效:

  • Aghajanyan et al. (2021) 证明预训练模型在下游任务上的权重更新具有低内在维度(low intrinsic dimension),即大部分信息变化可以被低秩矩阵捕获
  • 微调只改变模型的一个"方向子空间",不需要全参数更新

Rank 选择经验:

  • 通用任务:$r=8 \sim 16$ 通常足够
  • 复杂任务/大模型:$r=32 \sim 64$
  • 过大的 $r$ 接近全量微调,过小则欠拟合

QLoRA 进一步优化:将基础权重量化到 4-bit(NF4),LoRA 部分仍为 FP16/BF16,大幅减少显存(65B 模型可在单张 48G GPU 上微调)。

常见追问:LoRA 加在哪些层? → 通常加在 Q/V 投影层效果最好,也可以加在所有线性层。

SFT 数据的质量要求有哪些?数据量需要多少? 进阶

质量 > 数量(LIMA 论文证明 1000 条高质量数据即可显著提升能力)

数据质量要求:

  • 多样性:覆盖不同任务类型、指令风格、输出长度
  • 准确性:答案事实正确、逻辑自洽
  • 一致性:风格统一(如都用第一人称、都分步回答)
  • 复杂度分布:简单/中等/困难按比例混合,避免模型"变懒"
  • 去重:语义去重,避免过拟合某类模式

数据量参考:

场景数据量
通用对话能力10K-100K 高质量多轮对话
垂域适配1K-10K 领域高质量数据
指令遵循5K-50K 多样化指令

关键技巧:数据配比(instruction following : safety : coding : math ≈ 4:1:2:2),以及 curriculum learning(先简单后复杂)。

DeepSpeed ZeRO 三个阶段分别优化了什么? 进阶 高频

背景:数据并行中,每张 GPU 持有完整的模型副本,显存浪费严重。ZeRO(Zero Redundancy Optimizer)通过分片来消除冗余。

阶段分片内容显存节省通信开销
ZeRO-1Optimizer States(Adam 的 m, v)4x同 DDP
ZeRO-2+ Gradients8x同 DDP
ZeRO-3+ Parameters$N_d$ x(GPU 数线性)1.5x DDP

显存构成(以 FP16 混合精度 + Adam 为例,$\Phi$ 为参数量):

  • 参数:$2\Phi$ bytes (FP16)
  • 梯度:$2\Phi$ bytes (FP16)
  • 优化器状态:$12\Phi$ bytes(FP32 参数副本 4Φ + Adam m 4Φ + Adam v 4Φ)
  • 总计:$16\Phi$ bytes / GPU(无 ZeRO)

ZeRO-3 在 $N$ 卡下:$16\Phi / N$ bytes / GPU

选择建议:小规模(< 8 GPU)用 ZeRO-2;大规模或模型不fit单卡时用 ZeRO-3;超大规模结合张量并行 + ZeRO-1。

如何计算大模型训练时的显存占用? 深入

显存四大组成:

  1. 模型参数:FP32 = $4\Phi$,FP16 = $2\Phi$
  2. 梯度:与参数同精度,FP16 = $2\Phi$
  3. 优化器状态:Adam FP32 = $12\Phi$(含 FP32 master copy)
  4. 激活值(Activations):与 batch size、seq_len、hidden_dim 成正比

激活值估算公式(Megatron-LM):

$$\text{Activation} \approx L \times s \times b \times d \times (34 + 5 \frac{a \cdot s}{d})$$

其中 $L$=层数,$s$=seq_len,$b$=batch_size,$d$=hidden_dim,$a$=注意力头数。

7B 模型训练(BF16混合精度,batch=1,seq=2048):

  • 参数+梯度+优化器:$16 \times 7B = 112\text{GB}$
  • 单卡至少需要 ZeRO-3(8 卡 A100 80G)才能 fit

省显存技巧:梯度检查点(recompute activations, 显存降 $\sqrt{L}$ 倍,计算增 33%)、梯度累积、混合精度。

梯度累积和梯度裁剪分别解决什么问题? 基础

梯度累积(Gradient Accumulation):

  • 解决问题:显存不够大时,模拟大 batch_size
  • 做法:前向+反向传播 $K$ 次,累加梯度,然后做一次参数更新。等效 batch = micro_batch × $K$ × num_gpus
  • 注意:需要对梯度除以 $K$(或等效地调整 lr)

梯度裁剪(Gradient Clipping):

  • 解决问题:防止梯度爆炸,稳定训练
  • 做法:计算全局梯度范数 $\|g\|$,若超过阈值 $\tau$ 则缩放:$g \leftarrow g \cdot \frac{\tau}{\|g\|}$
  • LLM 常用值:$\tau = 1.0$
  • 注意:裁剪不改变梯度方向,只缩放幅度

Part 4: RLHF 与对齐

Alignment
RLHF 的三阶段流程是什么?各阶段的作用? 基础 高频

三阶段:

  1. SFT(监督微调):在人工标注的高质量对话数据上微调预训练模型,让模型学会基本的指令遵循和回答格式。输出:$\pi^{SFT}$
  2. RM(奖励模型训练):让 SFT 模型生成多个回复,人工标注排序($y_w \succ y_l$),训练 Reward Model。损失函数:$$\mathcal{L}_{RM} = -\mathbb{E}[\log\sigma(r_\theta(x, y_w) - r_\theta(x, y_l))]$$
  3. PPO(强化学习微调):用 RM 作为奖励信号,通过 PPO 优化 SFT 模型,目标:$$\max_{\pi_\theta} \mathbb{E}[r(x,y)] - \beta \text{KL}[\pi_\theta \| \pi_{ref}]$$

KL 惩罚的作用:防止模型"hack"奖励模型,保持输出多样性,避免模式崩塌。

为什么需要 RM 而不是直接用人类打分? → 标注排序的成本远低于生成答案的成本;RM 可以自动化大规模评估。

DPO 与 PPO 的核心区别是什么?各自的优缺点? 进阶 高频

DPO 核心洞察:把 RLHF 的优化目标推导为闭式解,绕过奖励模型和 RL 训练。

DPO 损失:

$$\mathcal{L}_{DPO} = -\mathbb{E}\left[\log\sigma\left(\beta \log\frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log\frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}\right)\right]$$

对比维度PPODPO
需要的模型数4 个(Policy, Ref, RM, Critic)2 个(Policy, Ref)
训练稳定性不稳定,超参敏感稳定,类似 SFT
计算成本高(需在线采样)低(离线偏好数据)
数据要求可在线生成需预先准备偏好对
对齐效果能力天花板更高偏好对齐足够好
探索能力有(在线采样新数据)无(受限于离线数据分布)

选择建议:资源有限/快速迭代用 DPO;追求最佳对齐效果用 PPO/GRPO。

GRPO 的核心思想是什么?相比 PPO 有什么优势? 进阶 高频

GRPO(Group Relative Policy Optimization)— DeepSeek-Math/R1 提出

核心改进:去掉 Critic Model,用组内相对奖励替代。

做法:

  1. 对每个 prompt $x$,用当前策略采样一组回复 $\{y_1, ..., y_G\}$
  2. 用 RM 或规则给每个回复打分 $\{r_1, ..., r_G\}$
  3. 计算组内归一化优势:$\hat{A}_i = \frac{r_i - \text{mean}(r)}{\text{std}(r)}$
  4. 用 PPO-clip 目标优化,但 Advantage 来自组内比较而非 Critic

优势:

  • 省资源:少一个 Critic 模型(对 7B 模型,省约 7B 参数的显存和计算)
  • 更稳定:避免 Critic 估计不准导致的训练不稳定
  • 天然适配 RLVR:可用规则验证器替代 RM,实现无人工标注的 RL 训练

DeepSeek-R1 发现:纯 GRPO + 规则奖励(答案正确性 + 格式正确性)就能涌现 CoT 推理能力,无需人工标注。

什么是 Reward Hacking?如何缓解? 进阶

定义:模型学会利用奖励模型的漏洞获得高分,而非真正提升回答质量。例如生成冗长但空洞的回答、过度使用某些讨好性词汇。

表现形式:

  • 奖励分数持续上升,但人工评测质量下降
  • 生成内容过度冗余、格式化
  • 迎合 RM 偏见(如倾向长回答)

缓解方法:

  • KL 惩罚:限制策略偏离参考模型的程度($\beta$ 参数)
  • RM 集成:使用多个 RM 取平均/最小值,减少单一 RM 偏见
  • Early Stopping:监控 KL 散度,过大时停止训练
  • Constrained RL:对 RM 分数设上限
  • 迭代训练:用新策略产生的数据重新训练 RM
PPO 在 RLHF 中为什么需要 4 个模型?各自的作用? 基础 高频

四个模型:

  1. Policy Model(策略模型):当前正在训练的模型,生成回复。参数被更新。
  2. Reference Model(参考模型):SFT 模型的冻结副本,用于计算 KL 散度,防止策略偏移过大。
  3. Reward Model(奖励模型):冻结,对生成的回复打分,提供优化信号。
  4. Critic Model(评论模型):估计每个 token 的 Value(未来累积回报的预期),用于计算 GAE Advantage。

为什么是4个?

  • Policy + Reference:计算 KL 约束
  • Reward:提供外部奖励信号
  • Critic:降低 Advantage 估计方差(若无 Critic,只用 REINFORCE,方差极大)

GRPO 优化:去掉 Critic,用组内比较替代 → 只需 3 个模型(Policy, Ref, RM)。

DPO 优化:去掉 Critic 和 RM → 只需 2 个模型(Policy, Ref)。

Part 5: 多模态大模型

Multimodal
CLIP 的对比学习原理是什么?为什么能做零样本分类? 基础 高频

CLIP (Contrastive Language-Image Pre-training) 原理:

  1. 两个编码器:Image Encoder(ViT/ResNet)+ Text Encoder(Transformer)
  2. 将图文对映射到共享的嵌入空间
  3. 对比学习:一个 batch 内配对的图文 cosine 相似度最大化,非配对的最小化

InfoNCE 损失:

$$\mathcal{L} = -\frac{1}{N}\sum_{i=1}^N \log\frac{\exp(\text{sim}(I_i, T_i)/\tau)}{\sum_{j=1}^N \exp(\text{sim}(I_i, T_j)/\tau)}$$

零样本分类原理:

  • 将每个类别转化为文本描述(如 "a photo of a {class}")
  • 计算输入图像与所有类别文本的相似度
  • 选相似度最高的类别 → 不需要任何标注数据即可分类

局限性:CLIP 是理解模型(encoder),不能生成;视觉细粒度理解不够(如 counting、spatial reasoning)。

LLaVA 的架构设计是什么?训练分几个阶段? 进阶 高频

LLaVA 架构(极简设计):

Visual Encoder (CLIP-ViT) → Projection Layer (MLP) → LLM (Vicuna/LLaMA)

训练两阶段:

  1. Stage 1 - 对齐预训练:
    • 冻结 Visual Encoder 和 LLM,只训练 Projection MLP
    • 数据:CC3M 中 595K 图文对,格式化为对话
    • 目的:将视觉特征对齐到 LLM 的文本空间
  2. Stage 2 - 指令微调:
    • 冻结 Visual Encoder,解冻 LLM 和 Projection
    • 数据:158K GPT-4 生成的多模态指令数据
    • 目的:让模型学会多模态对话和指令遵循

LLaVA-1.5 改进:MLP 从线性换为两层 MLP(效果显著提升);Vision Encoder 提升到 336px;加入更多指令微调数据。

为什么 LLaVA 范式如此流行? → 简单有效、可扩展、训练成本低(相比 BLIP-2 的 Q-Former),成为 VLM 的标准 baseline。

Visual Token 太多怎么办?有哪些压缩方法? 进阶 高频

问题:ViT 输出 $\frac{H}{14} \times \frac{W}{14}$ 个 token。高分辨率 (如 1344px) 可达 9000+ visual tokens,严重占用 LLM 的上下文窗口。

压缩方法:

方法原理代表
Q-Former用固定数量的 learnable queries 通过 cross-attention 提取视觉信息BLIP-2 (32 tokens)
Perceiver Resampler类似 Q-Former,用 latent tokens 做交叉注意力Flamingo (64 tokens)
Spatial Pooling对 patch tokens 做 2x2 或 4x4 平均池化LLaVA-Next
Token Merging根据相似度合并相邻 tokensToMe
Pixel Shuffle空间维度下采样 + 通道拼接InternVL

权衡:token 越少推理越快,但细粒度信息丢失越多。OCR/文档理解类任务需要更多 token,通用对话任务压缩更激进。

多模态模型如何处理高分辨率图像? 进阶

问题:CLIP-ViT 训练分辨率固定(224/336px),高分辨率输入会丢失细节或 token 数爆炸。

主流方案:

  1. Dynamic Resolution / AnyRes(LLaVA-Next/1.6):
    • 将图像按最佳比例分割为多个 336x336 子图(tiles)
    • 每个 tile 独立过 ViT,同时保留一个全局缩略图
    • 所有 tile 的 features 拼接后送入 LLM
  2. Native Resolution(Fuyu/Qwen-VL-2):
    • 直接对原始分辨率图像做 patch embedding
    • 不经过预训练 ViT,从头训练视觉编码
  3. Multi-scale(InternVL-2):
    • 动态分割 + 多尺度特征融合
    • 支持 448px ~ 4096px 动态输入

面试关键点:高分辨率 = 更多 visual tokens = 更大计算开销。核心 trade-off 是分辨率 vs 效率 vs 上下文长度。

多模态 MoE 是怎么做的?与纯文本 MoE 有什么不同? 深入

代表工作:MoE-LLaVA、Uni-MoE、DeepSeek-VL2

核心思想:在 VLM 的 FFN 层使用 MoE,让不同模态的 token 路由到不同专家。

与纯文本 MoE 的区别:

  • 模态感知路由:视觉 token 和文本 token 可能自然地被路由到不同专家子集,形成模态专属专家
  • 负载均衡更复杂:视觉 token 数量随图像分辨率变化,需要动态调整
  • 训练策略:通常先训练密集模型,再通过 upcycling 转化为 MoE(如 DeepSeek-VL2)

MoE-LLaVA 训练三阶段:

  1. Stage 1: 训练 MLP connector(同 LLaVA)
  2. Stage 2: 用密集 FFN 做指令微调
  3. Stage 3: 将 FFN 复制为多个专家,加入 Router 继续训练

优势:激活参数少但总参数大 → 在同等推理成本下获得更强的多模态理解能力。

Part 6: 推理与工程

Inference
Speculative Decoding(投机解码)的原理是什么? 进阶 高频

核心思想:用一个小模型(draft model)快速生成 $K$ 个候选 token,再用大模型(target model)并行验证,接受概率满足条件的 token。

算法流程:

  1. Draft model 自回归生成 $K$ 个 token:$t_1, t_2, ..., t_K$
  2. Target model 对这 $K$ 个 token 做一次并行前向(计算 $K$ 个位置的条件概率)
  3. 从左到右验证:若 target 概率 $p(t_i) \geq q(t_i)$(draft 概率),接受;否则按修正分布重采样
  4. 平均每次大模型推理可确认 2-3 个 token(取决于 draft 模型质量)

数学保证:输出分布严格等于 target model 的分布(无损加速)。

加速比取决于:

  • Draft model 与 Target model 的分布匹配度(接受率 $\alpha$)
  • Draft model 的速度(越快越好,通常用 1B-2B 模型)
  • 典型加速 2x-3x,无精度损失

变体:Self-Speculative Decoding(用模型自身浅层做 draft)、Medusa(多 head 并行猜测)。

常见量化方法(GPTQ / AWQ / GGUF)对比? 进阶
方法类型原理精度损失适用场景
GPTQPTQ, Weight-only逐层量化,用 Hessian 信息最小化量化误差(OBQ 改进)较小GPU 推理
AWQPTQ, Weight-only识别"显著权重"(对激活敏感的通道)保留高精度最小GPU 推理
GGUFPTQ, 多种方案llama.cpp 格式,支持 CPU+GPU 混合推理取决于位数边缘设备/CPU
SmoothQuantPTQ, W8A8将激活中的难量化离群值迁移到权重较小高吞吐 GPU
QLoRA (NF4)训练时量化4-bit NormalFloat 量化 + LoRA训练时无损微调省显存

选择建议:

  • GPU 部署首选 AWQ(精度最好)或 GPTQ(生态成熟)
  • CPU/边缘设备用 GGUF (Q4_K_M 是精度/速度平衡点)
  • 需要 activation 也量化的高吞吐场景用 SmoothQuant
Flash Attention 的原理是什么?为什么能加速? 进阶 高频

核心问题:标准 Attention 需要 $O(N^2)$ 的 HBM 读写(存储完整的 $N \times N$ 注意力矩阵),而 GPU 的 HBM 带宽是瓶颈(IO-bound)。

Flash Attention 解决方案:Tiling + 在线 Softmax

  1. Tiling:将 Q、K、V 分块,每次只加载一小块到 SRAM(快速片上内存),在 SRAM 内完成计算
  2. Online Softmax:不需要先计算完整的 $QK^T$ 再做 softmax,而是分块计算并递推更新 softmax 归一化因子
  3. 不存储中间矩阵:$N \times N$ 的注意力权重矩阵不写回 HBM

复杂度对比:

方面标准 AttentionFlash Attention
计算量 (FLOPs)$O(N^2 d)$$O(N^2 d)$(相同)
HBM 读写$O(N^2 + Nd)$$O(N^2 d^2 / M)$,$M$=SRAM 大小
内存占用$O(N^2)$$O(N)$

实际加速:2-4x wall-clock speedup + 显存从 $O(N^2)$ 降到 $O(N)$。

Flash Attention 2 改进:减少非 matmul 操作、更好的 warp-level 并行、支持更多 head 维度。

Continuous Batching vs Static Batching 的区别? 基础 高频

Static Batching(传统):

  • 一个 batch 内所有序列必须同时开始、同时结束
  • 短序列生成完 EOS 后只能 pad,GPU 空转等待最长序列
  • GPU 利用率低,尤其是生成长度方差大时

Continuous Batching(vLLM/TGI):

  • 序列生成完毕后立即移出 batch,新请求立即填入
  • 以 iteration(每步解码)为调度粒度,而非以 request 为粒度
  • GPU 始终满载,吞吐量提升 2-20x(取决于生成长度方差)

实现关键:需要动态的 KV Cache 内存管理(PagedAttention)来支持灵活的 batch 组合和分离。

BPE Tokenizer 的算法步骤是什么?与 WordPiece/Unigram 的区别? 基础 高频

BPE(Byte Pair Encoding)步骤:

  1. 将所有词拆分为字符级 token,统计词频
  2. 统计所有相邻 token 对的出现频率
  3. 合并频率最高的 token 对为新 token
  4. 重复步骤 2-3,直到达到目标词表大小

三种方法对比:

方法构建策略分词策略代表模型
BPE自底向上合并贪心最长匹配GPT-2/3/4, LLaMA
WordPiece自底向上,选似然增量最大的最长匹配BERT
Unigram自顶向下剪枝概率最大的分词方式T5, ALBERT

面试追问:

  • 为什么现代 LLM 用 Byte-level BPE? → 不需要 UNK token,任何文本都可编码,天然支持多语言
  • 词表大小的 trade-off? → 词表大=序列短但 embedding 表参数多;词表小=序列长但参数少