大模型面试题答案集
常见大模型技术面试题汇总
1. llama2 中使用的注意力机制是什么?手写实现分组注意力
答案:
Llama2 使用的是 Grouped-Query Attention (GQA),是 Multi-Head Attention 和 Multi-Query Attention 的折中方案。
核心思路: - 将 query 分成多组(如 32 个头分成 8 组) - 每组共享同一组 key 和 value - 减少 KV cache,提升推理速度
手写实现:
import torch
import torch.nn as nn
class GroupedQueryAttention(nn.Module):
def __init__(self, d_model, num_heads, num_kv_groups):
super().__init__()
assert num_heads % num_kv_groups == 0
self.d_model = d_model
self.num_heads = num_heads
self.num_kv_groups = num_kv_groups
self.head_dim = d_model // num_heads
self.heads_per_group = num_heads // num_kv_groups
self.q_proj = nn.Linear(d_model, d_model)
self.k_proj = nn.Linear(d_model, num_kv_groups * self.head_dim)
self.v_proj = nn.Linear(d_model, num_kv_groups * self.head_dim)
self.o_proj = nn.Linear(d_model, d_model)
def forward(self, x):
batch_size, seq_len, _ = x.shape
# Q: [batch, seq, num_heads, head_dim]
q = self.q_proj(x).view(batch_size, seq_len, self.num_heads, self.head_dim)
# K/V: [batch, seq, num_kv_groups, head_dim]
k = self.k_proj(x).view(batch_size, seq_len, self.num_kv_groups, self.head_dim)
v = self.v_proj(x).view(batch_size, seq_len, self.num_kv_groups, self.head_dim)
# 重复 K/V 使其与 Q 对齐
k = k.repeat_interleave(self.heads_per_group, dim=2)
v = v.repeat_interleave(self.heads_per_group, dim=2)
# 标准注意力
q = q.transpose(1, 2) # [batch, num_heads, seq, head_dim]
k = k.transpose(1, 2)
v = v.transpose(1, 2)
attn = (q @ k.transpose(-2, -1)) / (self.head_dim ** 0.5)
attn = torch.softmax(attn, dim=-1)
out = attn @ v
out = out.transpose(1, 2).contiguous().view(batch_size, seq_len, self.d_model)
return self.o_proj(out)
2. 了解 LangChain 吗?讲讲其结构
答案:
LangChain 是一个用于构建 LLM 应用的框架,核心结构:
核心组件
- Models:LLM、Chat Models、Embeddings
- Prompts:PromptTemplate、ChatPromptTemplate、FewShotPromptTemplate
- Chains:将多个组件串联(LLMChain、SequentialChain、RouterChain)
- Agents:自主决策调用工具(ReAct、Plan-and-Execute)
- Memory:对话历史管理(ConversationBufferMemory、VectorStoreMemory)
- Indexes:文档检索(VectorStore、DocumentLoader、TextSplitter)
架构层次
Application Layer (用户应用)
↓
Chains/Agents (工作流编排)
↓
Components (Prompts, Models, Memory)
↓
Base Classes (统一接口)
3. 对位置编码熟悉吗?讲讲几种位置编码的异同
答案:
主流位置编码对比
| 类型 | 代表 | 优点 | 缺点 |
|---|---|---|---|
| 绝对位置编码 | Transformer (Sinusoidal) | 简单,外推性好 | 无法表达相对位置 |
| 可学习绝对位置 | BERT | 自适应学习 | 长度受限,外推性差 |
| 相对位置编码 | T5, DeBERTa | 更符合语言特性 | 计算开销大 |
| 旋转位置编码 (RoPE) | Llama, GPT-NeoX | 外推性强,相对位置 | 需要特殊实现 |
| ALiBi | BLOOM | 无需显式编码,外推好 | 偏置设计需调参 |
核心差异
- 绝对 vs 相对:相对位置编码更符合"距离"直觉
- 可学习 vs 固定:固定编码外推性好,可学习编码表达力强
- RoPE:通过旋转矩阵实现相对位置,兼顾效率和外推
- ALiBi:不加编码,直接在注意力矩阵上加偏置
4. RLHF 的具体工程是什么?包含了哪几个模型?
答案:
RLHF 三阶段
SFT (Supervised Fine-Tuning)
- 模型:Base LLM → SFT Model
- 数据:高质量人工标注对话
Reward Model Training
- 模型:Reward Model(通常基于 SFT Model)
- 数据:人工排序数据(同一 prompt 多个回复的排序)
- 输出:给回复打分的能力
PPO Training
- 模型:
- Actor Model(待优化的生成模型)
- Critic Model(价值函数,评估状态)
- Reward Model(固定,打分)
- Reference Model(固定,防止模型偏移太远)
- 算法:PPO (Proximal Policy Optimization)
- 模型:
涉及的模型(4个)
- SFT Model
- Reward Model
- Actor Model(最终产物)
- Reference Model
5. 分别讲讲 encoder-only、decoder-only、encoder-decoder 几种大模型的代表作
答案:
| 架构 | 代表作 | 特点 | 适用场景 |
|---|---|---|---|
| Encoder-only | BERT, RoBERTa, DeBERTa | 双向注意力,擅长理解 | 分类、NER、阅读理解 |
| Decoder-only | GPT-3/4, Llama, PaLM, Claude | 单向注意力,自回归生成 | 文本生成、对话、代码 |
| Encoder-Decoder | T5, BART, mT5 | 编码器理解 + 解码器生成 | 翻译、摘要、问答 |
核心差异
- Encoder-only:Masked Language Modeling (MLM),看全文再预测
- Decoder-only:Causal Language Modeling (CLM),只看前文预测下一个
- Encoder-Decoder:seq2seq 任务天生优势,但训练成本高
6. 具体讲讲 P-Tuning、LoRA 等微调方法,并指出它们与传统 fine-tuning 微调有何不同
答案:
主流 PEFT 方法对比
| 方法 | 核心思路 | 可训练参数 | 优点 | 缺点 |
|---|---|---|---|---|
| Full Fine-Tuning | 全参数更新 | 100% | 效果最好 | 成本高、存储大 |
| Adapter | 插入小模块 | ~1% | 模块化,易切换 | 推理增加计算 |
| Prefix Tuning | 在输入前加可学习前缀 | ~0.1% | 参数少 | 占用序列长度 |
| P-Tuning v2 | 每层都加 prompt embedding | ~0.1% | 更灵活 | 实现复杂 |
| LoRA | 低秩矩阵分解 | ~0.1-1% | 推理无开销,效果好 | 需要重参数化 |
LoRA 核心公式
W' = W + ΔW = W + BA
- W: 原始权重(冻结)
- B, A: 低秩矩阵(可训练,rank << d)
与传统微调的差异
- 参数量:PEFT 只训练 % 参数
- 存储:每个任务只需存小模块,不需要完整模型副本
- 推理:LoRA 可合并回主模型,无推理开销
- 泛化:部分 PEFT 方法泛化性更好(如 LoRA)
7. 显存不够一般怎么解决的?
答案:
显存优化方案
1. 模型层面
- 量化:INT8/INT4 量化(GPTQ, AWQ)
- 剪枝:去除不重要的权重
- 蒸馏:训练小模型模仿大模型
2. 训练层面
- 梯度累积:分多个 micro-batch 累积梯度
- 混合精度训练:FP16/BF16 + FP32
- 梯度检查点 (Gradient Checkpointing):用计算换显存
- ZeRO (DeepSpeed):
- ZeRO-1: 优化器状态分片
- ZeRO-2: + 梯度分片
- ZeRO-3: + 参数分片
- CPU Offload:部分参数放 CPU
3. 推理层面
- KV Cache 量化
- Flash Attention:减少中间激活显存
- PagedAttention (vLLM):动态分配 KV cache
4. 工程层面
- Batch Size 调小
- Sequence Length 截断
- 使用 LoRA 等 PEFT 方法
8. 几种主流大模型的 loss 了解过吗?有哪些异同?
答案:
主流 Loss 对比
| 模型 | Loss | 公式 | 特点 |
|---|---|---|---|
| GPT | Causal LM Loss | -log P(x_t \| x_{<t}) |
自回归预测下一个 token |
| BERT | MLM Loss | -log P(x_i \| x_{\i}) |
随机 mask 15% token 预测 |
| T5 | Span Corruption | 同 MLM,但 mask 连续片段 | 更符合下游任务 |
| CLIP | Contrastive Loss | InfoNCE |
图文对比学习 |
| LLaMA | Causal LM Loss | 同 GPT | + RMSNorm, SwiGLU 等改进 |
核心差异
- Causal LM:适合生成任务,单向
- MLM:适合理解任务,双向
- Contrastive:多模态对齐
9. 了解半精度训练吗?展开讲讲
答案:
半精度训练核心
FP32 → FP16/BF16,显存减半,速度提升
FP16 vs BF16
| 类型 | 指数位 | 尾数位 | 范围 | 精度 | 适用 |
|---|---|---|---|---|---|
| FP32 | 8 | 23 | ±3.4e38 | 高 | 传统训练 |
| FP16 | 5 | 10 | ±65504 | 中 | 旧硬件 |
| BF16 | 8 | 7 | ±3.4e38 | 低 | 新硬件(A100+) |
混合精度训练流程
- 前向传播:FP16 计算
- Loss 缩放:放大 loss 防止梯度下溢
- 反向传播:FP16 梯度
- 梯度缩小:还原真实梯度
- 参数更新:FP32 主副本更新
- 复制回 FP16:用于下一轮
为什么需要 FP32 主副本?
小梯度更新(如 1e-5)在 FP16 下会被截断为 0,需要 FP32 累积。
BF16 优势
- 范围同 FP32,几乎不需要 loss scaling
- 更适合大模型训练(GPT-3, Llama 都用 BF16)
10. DeepSpeed 用过吗?
答案:
DeepSpeed 核心功能
1. ZeRO (Zero Redundancy Optimizer)
核心思路:分布式训练时,参数、梯度、优化器状态在多卡间分片,避免冗余。
| 阶段 | 分片内容 | 显存节约 | 通信开销 |
|---|---|---|---|
| ZeRO-1 | 优化器状态 | 4x | 低 |
| ZeRO-2 | + 梯度 | 8x | 中 |
| ZeRO-3 | + 模型参数 | N倍(N=卡数) | 高 |
2. Offload
- CPU Offload:优化器状态/梯度放 CPU
- NVMe Offload:参数放硬盘
3. 其他优化
- 1-bit Adam:梯度压缩
- Pipeline Parallelism:流水线并行
- Activation Checkpointing:重计算激活值
使用示例
from transformers import TrainingArguments
from transformers.integrations import DeepSpeedPlugin
ds_config = {
"zero_optimization": {
"stage": 3,
"offload_optimizer": {"device": "cpu"},
"offload_param": {"device": "cpu"}
},
"fp16": {"enabled": True},
"gradient_accumulation_steps": 4
}
training_args = TrainingArguments(
deepspeed=ds_config,
# ...
)
典型场景
- ZeRO-1/2:中小模型(7B-13B)
- ZeRO-3 + Offload:超大模型(65B+),单卡显存不够时
最后更新:2026-05-03
11. 分布式训练框架都了解哪些,能不能简单介绍一下?
答案:
主流分布式训练框架
| 框架 | 开发方 | 核心特性 | 适用场景 |
|---|---|---|---|
| DeepSpeed | Microsoft | ZeRO、Offload、Pipeline | 超大模型训练 |
| Megatron-LM | NVIDIA | Tensor/Pipeline/Data 并行 | GPT 类模型训练 |
| PyTorch DDP | Meta | 数据并行,易用 | 中小模型训练 |
| FSDP | Meta | 全分片数据并行 | 类似 ZeRO-3 |
| Horovod | Uber | 通用分布式框架 | 多框架支持 |
| Colossal-AI | HPC-AI Tech | 混合并行,易用 | 一站式解决方案 |
核心并行策略
数据并行 (Data Parallelism, DP)
- 每卡一份完整模型,切分数据
- 梯度 AllReduce 同步
- 适用:模型小,数据大
模型并行 (Model Parallelism, MP)
- Tensor Parallelism:层内切分(如 attention 按头切)
- Pipeline Parallelism:层间切分(前几层卡1,后几层卡2)
- 适用:单卡放不下模型
混合并行
- DP + TP + PP 组合使用
- 如:GPT-3 用 DP=64, TP=8, PP=16
12. DeepSpeed ZeRO-1/2/3 分别是什么,分析训练时候显存占用?
答案:
ZeRO 原理:消除冗余
传统 DP:每张卡都存完整的模型参数、梯度、优化器状态,冗余 N 倍(N=卡数)
ZeRO 三阶段对比
| 阶段 | 分片内容 | 每卡显存占用 | 通信量 | 公式 |
|---|---|---|---|---|
| Baseline (DDP) | 无分片 | Φ + K*Φ |
梯度 AllReduce | Φ: 参数,K≈12 (优化器占大头) |
| ZeRO-1 | 优化器状态 | Φ + K*Φ/N |
同 DDP | 显存省 4x (Adam 占 8Φ) |
| ZeRO-2 | 优化器 + 梯度 | Φ + K*Φ/N |
梯度 Reduce-Scatter | 显存省 8x |
| ZeRO-3 | 全部(含参数) | K*Φ/N |
参数 AllGather + 梯度 RS | 显存省 N倍 |
显存占用详细分析
训练显存 = 模型参数 + 梯度 + 优化器状态 + 激活值
以 7B 模型、FP16、Adam 优化器为例:
模型参数: 7B * 2 bytes = 14 GB
梯度: 7B * 2 bytes = 14 GB
优化器状态: 7B * (4+4+4) bytes = 84 GB (fp32 参数副本 + momentum + variance)
激活值: 取决于 batch size 和 sequence length
单卡 (Baseline): - 静态: 14 + 14 + 84 = 112 GB - 动态: + 激活值 (约 20-50 GB) - 总计: ~150 GB
ZeRO-1 (8卡): - 14 + 14 + 84/8 = 38.5 GB + 激活 - 总计: ~60 GB
ZeRO-2 (8卡): - 14 + 14/8 + 84/8 = 25.75 GB + 激活 - 总计: ~50 GB
ZeRO-3 (8卡): - 14/8 + 14/8 + 84/8 = 14 GB + 激活 - 总计: ~35 GB
通信开销对比
- ZeRO-1: 同 DDP,梯度 AllReduce
- ZeRO-2: 梯度 Reduce-Scatter(比 AllReduce 省一半)
- ZeRO-3:
- 前向: AllGather 参数
- 反向: Reduce-Scatter 梯度
- 通信量增加,但显存省最多
13. 说一下 Transformer 的架构和其内部细节?【必考题】
答案:
什么是Transformer? Transformer模型由Vaswani等人在2017年的一篇论文《Attention Is All You Need》中提出,它引入了自注意力机制(self-attention mechanism)来处理序列数据。相比于传统的循环神经网络(RNN)和卷积神经网络(CNN),Transformer模型具有以下特点:
并行计算:传统的RNN模型需要按时间顺序逐步处理输入序列,无法进行并行计算。Transformer模型通过自注意力机制同时计算输入序列的所有位置,并行计算效率更高。 长程依赖:传统的RNN模型在处理长序列时容易出现梯度消失或爆炸的问题,难以捕捉长程依赖关系。Transformer模型在自注意力机制的引导下能够更好地捕捉序列中的长期依赖。
注意力机制:Transformer模型使用自注意力机制来计算每个输入位置与其他位置之间的权重,从而更好地融合全局信息。这使得模型能够更好地关注相关区域,并且可以灵活地学习输入中的依赖关系。
通过使用PyTorch提供的完整Transformer模块,我们可以轻松地构建和训练Transformer模型,无需自己实现所有细节。下面我们将介绍如何使用PyTorch进行Transformer模型的构建和训练。
Transformer 整体架构
输入 Embedding + Position Encoding
↓
Encoder (N层) ──────┐
↓ │ Cross-Attention
Decoder (N层) ←────┘
↓
Linear + Softmax
↓
输出概率分布
Encoder 单层结构
Input
↓
Multi-Head Self-Attention
↓
Add & Norm (残差连接 + LayerNorm)
↓
Feed-Forward Network (FFN)
↓
Add & Norm
↓
Output
Decoder 单层结构
Input
↓
Masked Multi-Head Self-Attention (看不到未来)
↓
Add & Norm
↓
Cross-Attention (Query 来自 Decoder,K/V 来自 Encoder)
↓
Add & Norm
↓
Feed-Forward Network
↓
Add & Norm
↓
Output
核心细节
1. Multi-Head Attention
公式:
Attention(Q, K, V) = softmax(QK^T / √d_k) V
MultiHead(Q,K,V) = Concat(head_1, ..., head_h) W^O
head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)
为什么多头? - 不同头学习不同的注意力模式(位置、语义、语法等) - 增加模型容量,类似 CNN 的多通道
2. Position Encoding
原始 Transformer 用正弦位置编码:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
为什么需要? - Attention 是置换不变的(打乱顺序结果不变) - 位置编码注入顺序信息
3. Feed-Forward Network
FFN(x) = max(0, xW_1 + b_1)W_2 + b_2
- 两层全连接 + ReLU
- 通常中间维度是 4 倍(如 d_model=512, d_ff=2048)
4. Layer Normalization
公式:
LN(x) = γ * (x - μ) / √(σ² + ε) + β
- 在特征维度归一化(BatchNorm 在 batch 维度)
- 稳定训练,加速收敛
5. 残差连接
output = LayerNorm(x + Sublayer(x))
- 缓解梯度消失
- 允许堆叠更深网络
现代改进(GPT/Llama 等)
| 原始 Transformer | 现代改进 |
|---|---|
| Post-LN (Add 后 Norm) | Pre-LN (Sublayer 前 Norm),更稳定 |
| Sinusoidal PE | RoPE / ALiBi |
| LayerNorm | RMSNorm (更快) |
| ReLU | GeLU / SwiGLU |
| Multi-Head | Multi-Query / Grouped-Query |
14. 介绍大模型推理过程中,可以通过调节哪些参数提高性能?
答案:
推理优化参数
1. 解码策略参数
| 参数 | 作用 | 范围 | 效果 |
|---|---|---|---|
| temperature | 控制随机性 | 0.0-2.0 | 越低越确定,越高越随机 |
| top_p (nucleus) | 累积概率截断 | 0.0-1.0 | 0.9 表示只采样累积概率前 90% 的 token |
| top_k | 只保留概率最高的 k 个 | 1-100 | 限制候选词数量 |
| repetition_penalty | 惩罚重复 | 1.0-2.0 | >1 减少重复,1.0 不惩罚 |
| max_new_tokens | 最大生成长度 | - | 控制输出长度 |
典型配置: - 创意写作: temperature=0.8, top_p=0.9 - 代码生成: temperature=0.2, top_k=10 - 摘要任务: temperature=0.0 (greedy)
2. 推理加速参数
| 技术 | 参数 | 说明 | 加速比 |
|---|---|---|---|
| KV Cache | 默认开启 | 缓存历史 K/V,避免重算 | 5-10x |
| Flash Attention | use_flash_attn=True |
融合算子,减少显存访问 | 2-3x |
| Batch Size | batch_size |
批量推理提升吞吐 | 2-8x |
| 量化 | load_in_8bit=True |
INT8/INT4 量化 | 显存减半,速度1.5-2x |
| Speculative Decoding | 小模型预测 + 大模型验证 | 加速 2-3x(无损) | 2-3x |
3. 框架级优化
# vLLM (PagedAttention)
from vllm import LLM
llm = LLM(model="llama-7b",
tensor_parallel_size=2, # 2卡并行
max_num_batched_tokens=8192) # 动态 batch
# TensorRT-LLM
trtllm.build(model,
max_batch_size=128,
max_input_len=2048,
max_output_len=512)
# Text Generation Inference (HuggingFace)
docker run -p 8080:80 \
-e MAX_BATCH_TOTAL_TOKENS=32768 \
-e MAX_CONCURRENT_REQUESTS=128 \
ghcr.io/huggingface/text-generation-inference
4. 硬件优化
- GPU: A100 > V100 > T4(Tensor Core 加速)
- CPU Offload: KV Cache 放 CPU,节省显存
- 混合精度: BF16 推理(A100 支持)
性能调优流程
- 确定任务类型(创意 vs 精确)→ 设置 temperature/top_p
- 显存紧张?→ 量化 + KV Cache 压缩
- 延迟敏感?→ Speculative Decoding / Flash Attention
- 吞吐优先?→ 增大 batch size + vLLM
最后更新:2026-05-03