大模型面试题答案集

常见大模型技术面试题汇总


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 应用的框架,核心结构:

核心组件

  1. Models:LLM、Chat Models、Embeddings
  2. Prompts:PromptTemplate、ChatPromptTemplate、FewShotPromptTemplate
  3. Chains:将多个组件串联(LLMChain、SequentialChain、RouterChain)
  4. Agents:自主决策调用工具(ReAct、Plan-and-Execute)
  5. Memory:对话历史管理(ConversationBufferMemory、VectorStoreMemory)
  6. 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 三阶段

  1. SFT (Supervised Fine-Tuning)

    • 模型:Base LLM → SFT Model
    • 数据:高质量人工标注对话
  2. Reward Model Training

    • 模型:Reward Model(通常基于 SFT Model)
    • 数据:人工排序数据(同一 prompt 多个回复的排序)
    • 输出:给回复打分的能力
  3. PPO Training

    • 模型:
      • Actor Model(待优化的生成模型)
      • Critic Model(价值函数,评估状态)
      • Reward Model(固定,打分)
      • Reference Model(固定,防止模型偏移太远)
    • 算法:PPO (Proximal Policy Optimization)

涉及的模型(4个)

  1. SFT Model
  2. Reward Model
  3. Actor Model(最终产物)
  4. 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)

与传统微调的差异

  1. 参数量:PEFT 只训练 % 参数
  2. 存储:每个任务只需存小模块,不需要完整模型副本
  3. 推理:LoRA 可合并回主模型,无推理开销
  4. 泛化:部分 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+)

混合精度训练流程

  1. 前向传播:FP16 计算
  2. Loss 缩放:放大 loss 防止梯度下溢
  3. 反向传播:FP16 梯度
  4. 梯度缩小:还原真实梯度
  5. 参数更新:FP32 主副本更新
  6. 复制回 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 混合并行,易用 一站式解决方案

核心并行策略

  1. 数据并行 (Data Parallelism, DP)

    • 每卡一份完整模型,切分数据
    • 梯度 AllReduce 同步
    • 适用:模型小,数据大
  2. 模型并行 (Model Parallelism, MP)

    • Tensor Parallelism:层内切分(如 attention 按头切)
    • Pipeline Parallelism:层间切分(前几层卡1,后几层卡2)
    • 适用:单卡放不下模型
  3. 混合并行

    • 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 支持)

性能调优流程

  1. 确定任务类型(创意 vs 精确)→ 设置 temperature/top_p
  2. 显存紧张?→ 量化 + KV Cache 压缩
  3. 延迟敏感?→ Speculative Decoding / Flash Attention
  4. 吞吐优先?→ 增大 batch size + vLLM

最后更新:2026-05-03