简介:这份PDF资料整理了字节跳动大模型算法岗一面、二面、三面的完整面试试题,面向准备冲击大厂算法岗位的求职者,尤其是已有一定深度学习基础、希望系统复盘面试考点的人群。内容覆盖Transformer与LLaMA的LN差异、RMSNorm与FFN手写、数据清洗与质量过滤、PPL公式、BERT预训练任务、位置编码、prompt范式设计,以及二面中的模型结构设计、数据配比思路、LLM评估与工具调用实现,三面则深入硬件利用率、DeepSpeed分片阶段、DP与DDP区别、训练监控、预训练与SFT评估、decoding策略等工程细节,并附有cross-attention等手撕代码题。资源包为1个PDF文件,大小约75KB,轻量便携,适合碎片化查阅与面试前突击。目前已有174人学习,可作为大模型算法面试的实战题库与知识查漏清单,帮助读者快速定位薄弱环节、梳理回答框架。
1. 大模型算法岗面试到底在考什么:从一面到三面的能力分层
很多人准备大模型算法岗面试时,第一反应是刷题、背八股、把 Transformer 结构图默写十遍。但真正面过几轮的人会发现,面试官问的问题表面上在考知识点,实际上在考你对大模型训练全链路的理解深度。一面通常聚焦基础功底,二面开始往工程落地和系统设计走,三面则更看重你对业务场景的判断力和技术选型的取舍逻辑。换句话说,这不是一场知识竞赛,而是一次能力分层的筛选。
这个标题背后对应的是一个非常具体的需求:你即将参加大模型算法岗的面试,想知道每一轮大概会问什么、问到什么深度、该怎么准备。适合的人群包括应届生转大模型方向、传统 NLP 工程师想切入大模型、以及后端或数据方向想转算法岗的从业者。接下来我会按一面、二面、三面的顺序,把每一轮的高频考点、回答框架和准备方法拆开讲,中间穿插我自己的踩坑经验,希望能帮你少走弯路。
2. 一面:基础功底与核心概念的快速筛查
2.1 一面到底在筛什么:三个维度判断你是否及格
一面的定位是“筛掉明显不合格的人”,所以面试官不会问太偏的东西,但会问得很细。三个核心维度是:数学与深度学习基础、Transformer 架构理解、以及基本的代码能力。
数学基础方面,高频问题包括:为什么注意力机制要除以根号 d_k?LayerNorm 和 BatchNorm 的区别是什么,为什么 Transformer 用 LayerNorm?Softmax 的数值稳定性怎么处理?这些问题看起来简单,但面试官会追问到你答不上来为止。比如你说了除以根号 d_k 是为了防止点积过大导致 softmax 梯度消失,面试官可能接着问:那为什么是根号 d_k 而不是 d_k?这就涉及到方差推导了。
Transformer 架构方面,几乎必问的是 Self-Attention 的计算过程、Multi-Head Attention 的维度变换、位置编码的设计动机。我见过不少候选人能画出结构图,但被问到“多头注意力里每个头的维度是多少,为什么要这样设计”时就卡住了。常见做法是每个头的维度等于 d_model 除以头数,这样总计算量和单头全维度注意力相当,但能捕捉不同子空间的语义关系。
代码能力方面,一面通常不会让你手写完整的 Transformer,但可能让你用 PyTorch 实现一个简单的注意力模块,或者手写 softmax、LayerNorm 的前向传播。下面是一个我常用的注意力实现模板,面试时如果被要求手写,可以按这个框架来:
import torch import torch.nn as nn import math class SingleHeadAttention(nn.Module): def __init__(self, d_model, d_k): super().__init__() self.d_k = d_k # 三个线性变换分别生成 Q、K、V self.W_q = nn.Linear(d_model, d_k) self.W_k = nn.Linear(d_model, d_k) self.W_v = nn.Linear(d_model, d_k) def forward(self, x, mask=None): # x: [batch, seq_len, d_model] Q = self.W_q(x) # [batch, seq_len, d_k] K = self.W_k(x) V = self.W_v(x) # 缩放点积注意力,除以 sqrt(d_k) 防止梯度消失 scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k) if mask is not None: # mask 中为 0 的位置填一个极大负数,softmax 后趋近于 0 scores = scores.masked_fill(mask == 0, -1e9) attn_weights = torch.softmax(scores, dim=-1) output = torch.matmul(attn_weights, V) return output, attn_weights这段代码的关键点有三个:一是缩放因子的位置,必须在 softmax 之前除以根号 d_k;二是 mask 的处理方式,用 masked_fill 填 -1e9 而不是直接置零,否则 softmax 后仍然会分配到概率;三是返回注意力权重,方便后续做可视化或分析。面试时如果面试官让你解释每一行的含义,重点讲清楚 Q 和 K 的点积为什么能表示相似度、缩放的作用是什么、mask 在训练和推理阶段分别怎么用。
2.2 高频八股的回答框架:别背答案,讲推导
一面里有一类问题是“你怎么理解 XX”,比如“你怎么理解位置编码”“你怎么理解残差连接”。这类问题最忌讳背一段定义,面试官想听的是你的推导逻辑和直觉理解。
以位置编码为例,一个好的回答框架是:先说为什么需要位置编码(自注意力本身是置换不变的,打乱输入顺序输出不变),再说绝对位置编码和相对位置编码的区别,然后讲正弦位置编码的设计动机(不同频率的三角函数可以让模型通过线性变换获取相对位置信息),最后提一下现在主流大模型更常用 RoPE 或 ALiBi 这类相对位置编码方案。整个回答控制在两三分钟内,有逻辑层次,面试官就能判断你是真的理解而不是背的。
再比如“为什么 Pre-Norm 比 Post-Norm 更常用”,回答时可以从梯度传播的角度切入:Pre-Norm 把 LayerNorm 放在子层之前,残差路径上没有归一化操作,梯度可以更直接地回传,训练更稳定,尤其在大模型深层网络中优势明显。Post-Norm 虽然理论上表达力更强,但需要更精细的学习率 warmup 策略才能训好。这种回答既有原理又有工程视角,面试官通常会满意。
2.3 代码题的准备策略:手写比调库更重要
一面的代码题通常不难,但要求手写、不能调库。常见的题目包括:手写 softmax、手写 LayerNorm、手写多头注意力的维度变换、用 numpy 实现一个简单的反向传播。
准备方法是:把 Transformer 里每一个基础模块都手写一遍,不要求跑通,但要求写出来的代码逻辑正确、维度对得上。我一般会建议准备一个“手写清单”,包含 softmax、LayerNorm、Scaled Dot-Product Attention、Multi-Head Attention、Positional Encoding、Feed-Forward Network 这六个模块。每个模块写三遍,第一遍看参考,第二遍默写,第三遍限时写。
这里有一个容易翻车的点:很多人手写 softmax 时忘了减最大值。面试官如果看到你直接 exp(x) 除以 sum(exp(x)),会追问数值溢出怎么处理。正确写法是先减去该维度的最大值,再做指数运算:
def stable_softmax(x, dim=-1): # 减去最大值防止 exp 溢出 x_max = x.max(dim=dim, keepdim=True).values x_shifted = x - x_max exp_x = torch.exp(x_shifted) return exp_x / exp_x.sum(dim=dim, keepdim=True)这个细节看起来小,但能体现你有没有实际训练过模型。没踩过数值溢出的坑的人,通常不会主动想到这一步。
3. 二面:工程落地与系统设计的深度追问
3.1 二面的考察重心:从“懂原理”到“能落地”
二面的面试官通常是团队里负责具体项目的人,他们关心的是你来了能不能干活。所以问题会从“是什么”转向“怎么做”和“为什么这么做”。
高频方向包括:大模型训练流程(预训练、SFT、RLHF 各阶段的目标和数据构造)、分布式训练策略(数据并行、模型并行、流水线并行的适用场景)、显存优化技术(混合精度、梯度检查点、ZeRO 系列)、推理加速方案(量化、蒸馏、KV Cache 优化)。
以 RLHF 为例,面试官可能问:PPO 阶段有四个模型,分别是什么角色?为什么需要奖励模型?KL 散度惩罚项的作用是什么?回答时不能只说“四个模型是 actor、critic、reward、reference”,还要讲清楚每个模型的输入输出、训练时哪些参数更新哪些冻结、KL 项怎么防止策略偏离太远。这些细节才是有没有真正跑过 RLHF 的分水岭。
3.2 分布式训练的参数选择:什么时候用哪种并行
分布式训练是二面的重灾区。很多人知道数据并行、模型并行、流水线并行的概念,但被问到“一个 70B 模型在 8 卡上怎么切”时就答不上来了。
常见做法是:先看单卡显存能不能放下整个模型。如果放不下,优先考虑张量并行(Tensor Parallelism),把每一层的权重矩阵按维度切分到不同卡上;如果层数太多导致流水线气泡严重,再考虑流水线并行(Pipeline Parallelism);数据并行(Data Parallelism)通常作为补充,在模型切分之后复制多份来提升吞吐。
下面是一个用 PyTorch FSDP 做数据并行的最小配置示例,适合在面试中描述“如果让你配一个训练脚本你会怎么设”:
import torch from torch.distributed.fsdp import FullyShardedDataParallel as FSDP from torch.distributed.fsdp import MixedPrecision, ShardingStrategy # 混合精度配置:参数用 bf16,梯度用 bf16,缓冲区用 fp32 mp_policy = MixedPrecision( param_dtype=torch.bfloat16, reduce_dtype=torch.bfloat16, buffer_dtype=torch.float32, ) # FSDP 包装模型,指定分片策略和混合精度 model = FSDP( model, sharding_strategy=ShardingStrategy.FULL_SHARD, # 全分片,显存最省 mixed_precision=mp_policy, device_id=torch.cuda.current_device(), )这里的关键参数是 sharding_strategy。FULL_SHARD 对应 ZeRO-3,把参数、梯度、优化器状态都分片,显存最省但通信量最大;SHARD_GRAD_OP 对应 ZeRO-2,只分片梯度和优化器状态;NO_SHARD 就是普通数据并行。面试时如果能说清楚这三种策略的显存占用和通信开销的权衡,基本就能过关。
3.3 显存估算:面试官爱考的“心算题”
二面经常出现的一类问题是:给你一个模型配置,让你估算训练需要多少显存。比如“一个 7B 模型,用 Adam 优化器,fp16 混合精度训练,batch size 为 1,大概需要多少显存”。
估算逻辑是:模型参数 7B,fp16 存储需要 14GB;梯度 fp16 需要 14GB;Adam 优化器需要保存一阶矩和二阶矩,通常用 fp32 存储,需要 7B × 4 × 2 = 56GB;再加上激活值,取决于序列长度和 batch size,通常几 GB 到几十 GB。总计大概在 90GB 以上,单张 80GB 卡放不下,需要至少两张卡做切分。
这种估算不需要精确到小数点,但数量级要对。我一般会记住几个基准:1B 参数 fp16 约 2GB,Adam 优化器状态约 8GB(fp32 的一阶矩和二阶矩),所以 1B 模型全量训练大约需要 12-16GB 显存(不含激活值)。面试时按这个比例去推,基本不会错。
3.4 推理优化的常见方案:KV Cache 与量化
二面也会问推理侧的问题,尤其是 KV Cache 和量化。KV Cache 的核心思想是:自回归生成时,每次只生成一个新 token,但注意力需要看到之前所有 token 的 K 和 V,如果每次都重新计算就太浪费了,所以把历史 K 和 V 缓存下来。
面试官可能追问:KV Cache 占多少显存?怎么优化?计算公式是:2 × batch_size × num_layers × num_heads × head_dim × seq_len × dtype_size。以 LLaMA-7B 为例,32 层、32 头、head_dim 为 128,fp16 存储,seq_len 为 2048,batch size 为 1,KV Cache 大约占 2 × 1 × 32 × 32 × 128 × 2048 × 2 字节,约 1GB。如果 batch size 到 32,就是 32GB,非常可观。
优化方案包括:MQA(Multi-Query Attention)让所有头共享 K 和 V,GQA(Grouped-Query Attention)让每组头共享 K 和 V,以及 PagedAttention 做显存分页管理。这些方案的名字和基本思想要能说清楚,面试时能画出对比图更好。
4. 三面:业务判断与技术选型的取舍逻辑
4.1 三面在找什么人:能独立定义问题的人
三面通常是团队负责人或更高级别的面试官,他们不再考具体知识点,而是看你能不能独立定义问题、拆解问题、做出合理的技术选型。
常见问题形式是开放式的:“如果让你从零搭建一个垂直领域的对话模型,你会怎么做?”或者“我们有一个场景,数据只有几千条,你会选择微调还是 RAG?”这类问题没有标准答案,面试官看的是你的思考框架。
一个好的回答框架是:先明确场景约束(数据量、延迟要求、成本预算、迭代速度),再列出候选方案,然后逐一分析优劣,最后给出推荐方案和理由。比如数据少、迭代快、对事实准确性要求高的场景,RAG 通常比微调更合适;如果场景对风格一致性要求高、数据有一定积累,微调可能更好。如果能进一步说出“先做 RAG 快速上线,同时积累数据,等数据到一定量再考虑微调”这种分阶段策略,面试官会觉得你有落地经验。
4.2 技术选型的取舍:没有最好,只有最合适
三面里有一类问题是故意给你一个“两难”场景,看你怎么权衡。比如:“模型效果不好,但标注成本很高,你会怎么办?”或者“推理延迟要求 100ms 以内,但模型很大,你怎么优化?”
这类问题的回答要点是:先量化约束,再找瓶颈,然后给出多个方案并说明适用条件。以延迟优化为例,可以先分析延迟主要来自哪里(模型前向、KV Cache 读取、网络传输),然后针对瓶颈给方案:模型前向慢就量化或蒸馏,KV Cache 大就换 MQA/GQA,网络传输慢就做边缘部署。每个方案都要说清楚代价,比如量化可能损失精度,蒸馏需要重新训练。
我自己的血泪经验是:面试时不要一上来就给方案,先问清楚约束条件。比如“延迟 100ms 是 P99 还是平均值”“模型大小是参数量还是显存占用”“有没有硬件限制”。问清楚再答,比直接给一个通用方案要好得多。
4.3 项目深挖:怎么讲清楚你做过的项目
三面一定会深挖你简历上的项目。面试官会从“你做了什么”问到“为什么这么做”再到“如果重来你会怎么改”。
讲项目的框架是:背景与目标(一句话说清楚要解决什么问题)、方案选型(为什么选这个方案,对比过哪些)、具体实现(你负责的部分,用了什么技术)、结果与反思(效果如何,踩了什么坑,怎么解决的)。
有一个容易翻车的点:很多人讲项目时喜欢说“我们用了 XX 技术”,但被问到“为什么不用 YY”时就答不上来。准备项目时,一定要把每个技术选型的替代方案都想一遍,准备好“为什么选 A 不选 B”的回答。比如你用了 LoRA 做微调,就要能说出全量微调、Adapter、Prefix Tuning 的优劣和适用场景。
5. 避坑与常见问题:面试现场容易翻车的五个细节
5.1 现象:一面手写代码时维度对不上
原因:平时调库习惯了,nn.Linear 自动处理维度,手写时忘了 transpose 或 reshape。
解决:手写代码时先在纸上画维度变换图,每一步标注 shape,写代码时对照检查。重点检查 Q 和 K 的转置、多头拆分和合并的 reshape 顺序。
5.2 现象:二面被问分布式训练时只会背概念
原因:没有实际跑过多卡训练,对通信开销、显存占用没有体感。
解决:至少用 FSDP 或 DeepSpeed 跑一次小模型的多卡训练,观察显存变化和日志里的通信时间。面试时用具体数字说话,比如“8 卡 A100 跑 7B 模型,FULL_SHARD 策略下每卡显存占用约 XX GB”。
5.3 现象:三面被问开放问题时回答太泛
原因:没有形成结构化的思考框架,想到哪说到哪。
解决:准备一个通用的分析框架:约束条件 → 候选方案 → 评估维度 → 推荐方案 → 风险与兜底。每次练习时按这个框架说,形成肌肉记忆。
5.4 现象:被追问“为什么”时卡住
原因:只记住了结论,没有理解推导过程。
解决:对每个核心知识点,至少问自己三层“为什么”。比如“为什么用 LayerNorm” → “因为 BatchNorm 对 batch size 敏感” → “为什么敏感” → “因为 NLP 任务序列长度不一,batch 内统计量不稳定”。
5.5 现象:面试官说“你回去等通知”后再无消息
原因:可能是某个环节答得不好,也可能是岗位匹配度问题。
解决:面试后立刻复盘,把没答好的问题记下来,查资料补上。如果是匹配度问题,调整投递方向。面试是双向选择,一次失败不代表什么。
6. 进阶技巧:用“反向面试”判断团队值不值得去
面试到三面,通常你也有机会问面试官问题。很多人把这个环节浪费了,问一些“团队氛围怎么样”之类的客套话。其实这是你判断这个团队值不值得去的最好机会。
我一般会问三类问题。第一类是关于技术栈的:“团队现在训练和推理主要用什么框架?有没有自研的训练加速方案?”这个问题能看出团队的技术积累和工程成熟度。如果回答是“我们主要用 HuggingFace 的 Trainer”,那可能工程优化空间不大;如果提到自研的分布式训练框架或推理引擎,说明团队在工程侧有投入。
第二类是关于业务场景的:“模型上线后主要看哪些指标?效果不好时通常怎么排查?”这个问题能看出团队对业务的理解深度。好的回答会提到具体的业务指标和排查流程,比如“先看是召回问题还是排序问题,再看是特征问题还是模型问题”。如果回答很模糊,说明可能还在探索阶段。
第三类是关于团队分工的:“算法工程师需要自己写训练脚本和推理服务吗,还是有专门的工程团队配合?”这个问题能帮你判断入职后的实际工作内容。有些团队算法和工程分得很清,你只需要调参和做实验;有些团队要求全栈,从数据清洗到服务部署都要自己来。两种模式没有好坏,但你要知道自己更适合哪种。
下面这张表是我总结的不同回答对应的团队画像,供你参考:
| 面试官回答特征 | 团队画像 | 适合人群 |
|---|---|---|
| 提到自研框架、有明确优化目标 | 工程驱动型,技术积累深 | 想深入工程优化的工程师 |
| 强调业务指标、有完整排查流程 | 业务驱动型,落地经验丰富 | 想积累业务经验的工程师 |
| 分工明确、算法工程各司其职 | 成熟团队,流程规范 | 想专注算法实验的工程师 |
| 要求全栈、从数据到部署都做 | 早期团队,成长空间大但强度高 | 想快速成长的工程师 |
最后说一个我自己的习惯:每次面试完,不管结果如何,我都会花半小时把面试官问的问题和我当时的回答整理成文档。这个文档积累到几十篇之后,你会发现高频考点其实很集中,而你的薄弱环节也会反复出现。面试准备不是刷题,是查漏补缺。希望帮到你。
本文还有配套的精品资源,点击获取