
简介这份PDF资料整理自字节跳动大模型算法岗位的一、二、三面真实面试记录面向准备冲击大厂算法岗的求职者尤其是已有一定深度学习基础、希望系统梳理大模型知识体系的中高级候选人。内容按面试轮次展开一面聚焦Transformer与LLaMA的LN差异、RMSNorm与FFN手写、数据清洗流程、PPL公式、位置编码及prompt范式等基础拷打二面深入数据配比策略、主流LLM结构设计、模型评估与工具调用实现三面覆盖DeepSpeed各阶段分片代价、DP与DDP区别、训练时间估计、模型监控、预训练与SFT评估及decoding策略并附cross-attention手撕题。资源包仅含1个PDF文件大小约75KB轻量便携适合通勤或碎片时间反复翻阅。目前已有175人学习可帮助读者对照真实面试节奏查漏补缺理解大模型训练与推理的关键考点提前准备论文追问与手撕环节。1. 大模型面试的真正分水岭为什么问的都是“你亲手改过哪一行”一场大模型算法面试问到第三轮面试官往往不再关心你背没背过 Transformer 的结构图而是突然抛出一句RMSNorm 和 LayerNorm 到底差在哪为什么现在的模型都换成了它这个问题背后藏着一个残酷的分水岭——能画出结构图的人很多能说清“为什么这么设计、换掉之后省了什么、代价是什么”的人极少。大模型算法岗的面试本质上不是考知识面而是考你有没有真正钻进过训练管线里摸过数据清洗、配比、并行策略、显存账本这些脏活。这篇内容围绕一份三面完整面经展开把每一轮问题背后的底层机制拆开讲透让你从“知道答案”走到“理解为什么答案长这样”。2. 归一化与激活函数RMSNorm 和 SwiGLU 到底在省什么2.1 LayerNorm 的均值中心化为什么成了负担LayerNorm 的公式很直白对每个 token 的隐向量减去均值、除以标准差再乘缩放加偏置。它做两件事——中心化和归一化。问题在于中心化这一步在大模型里收益很小成本却不低。每层都要算一次均值意味着一次额外的归约操作在张量并行切分时还会引入跨卡通信。更关键的是LayerNorm 的均值减法会让隐向量的方向信息被部分抹掉而大模型真正依赖的是方向而非绝对幅度。RMSNorm 的做法是直接砍掉均值中心化只保留均方根归一化import torch def rms_norm(x, weight, eps1e-6): # x: [batch, seq, hidden] # 只算均方根不减均值 rms torch.sqrt(torch.mean(x * x, dim-1, keepdimTrue) eps) return (x / rms) * weight这段代码的关键在torch.mean(x * x)——它算的是平方均值再开根没有减均值那一步。少了一次归约少了一次减法在千亿参数模型里每层省下的计算和通信累积起来相当可观。常见的实现思路是RMSNorm 在数值上更稳定因为除以的是均方根而非标准差不会因为均值接近零时标准差剧烈波动而翻车。2.2 SwiGLU 的门控结构为什么比 ReLU FFN 更“会挑信息”传统 FFN 是两层线性加一个 ReLU先升维再降维中间做非线性。SwiGLU 改成了门控结构用两个并行的升维投影一个过 SiLU 激活另一个直接做门两者逐元素相乘import torch.nn as nn import torch.nn.functional as F class SwiGLUFFN(nn.Module): def __init__(self, hidden, intermediate): super().__init__() # 两个升维投影gate 和 up self.gate_proj nn.Linear(hidden, intermediate, biasFalse) self.up_proj nn.Linear(hidden, intermediate, biasFalse) self.down_proj nn.Linear(intermediate, hidden, biasFalse) def forward(self, x): # SiLU(gate) 逐元素乘 up再降维 return self.down_proj(F.silu(self.gate_proj(x)) * self.up_proj(x))门控的意义在于SiLU 的输出是平滑的、可正可负它像一个软开关决定哪些维度的信息通过。ReLU 是硬截断负值直接归零梯度在负区恒为零SiLU 在负区仍有微小梯度训练时不容易出现神经元“死掉”。代价是参数量增加了——多了一个 gate 投影所以实际实现里通常把 intermediate 维度调小让总参数量与标准 FFN 持平。这也是面试里常被追问的点SwiGLU 不是白拿收益是用参数换表达力配比要重新算。2.3 手写题背后的考察逻辑一面让手写 RMSNorm 和 SwiGLU不是考你背 API而是看你能不能把公式落到张量形状上。RMSNorm 里keepdimTrue漏了会怎样广播维度对不上直接报错。SwiGLU 里两个投影的 bias 该不该有主流实现是无 bias因为归一化已经处理了偏移。这些细节在面试官眼里就是“你有没有真写过”的证据。血泪经验是手写时先把输入输出形状注释清楚再写计算比上来就堆算子稳得多。3. 数据管线清洗、配比与“什么样的数据才便于模型学习”3.1 质量过滤的 PPL 公式与模型选择数据清洗的第一道关是质量过滤。面经里问到“质量过滤用什么模型、PPL 公式是什么”这指向一种常见做法用一个小的参考语言模型给每条数据打分困惑度越低说明文本越“像人话”。PPL 的定义是import torch def perplexity(logits, labels): # logits: [seq, vocab], labels: [seq] log_probs torch.log_softmax(logits, dim-1) # 取每个位置正确 token 的 log 概率 token_log_probs log_probs.gather(-1, labels.unsqueeze(-1)).squeeze(-1) avg_nll -token_log_probs.mean() return torch.exp(avg_nll)公式本身是交叉熵的指数但工程上的关键在“用什么模型算”。参考模型太小打分区分度不够太大清洗成本扛不住。常见的实现思路是用一个几亿参数级别的模型做粗筛再对边界样本用更大模型复核。注意 PPL 低不等于质量高——重复文本、模板化内容 PPL 也很低所以通常还要叠加去重、规则过滤、分类器打分多路并行。3.2 数据配比为什么是“玄学”而非公式二面问“数据配比能说下思路吗”三面追问“数据配比怎么量化才是一个好的方案”。这说明配比是面试官眼里的硬骨头。配比没有闭式解因为不同来源的数据在训练不同阶段的价值不同。常见的做法是分阶段预训练早期多用通用语料打底中期提高高质量领域数据比例后期用少量精选数据做退火。量化方案一般靠小规模消融实验——固定总 token 数改配比看验证集 loss 和下游任务表现用网格搜索或贝叶斯优化找相对优解。这里有个容易翻车的点配比实验的结论对模型规模不敏感但对数据顺序敏感。同样的配比先喂 A 后喂 B 和反过来最终效果可能差出一截。所以好的配比方案必须绑定训练课程而不是一个静态比例表。3.3 端到端大模型 vs 多个小模型开放性问题的答法一面那道开放题“端到端大模型和多个小模型各自的优缺点”考的是系统设计判断力。端到端大模型的优势是信息不丢失、联合优化、少一层级联误差缺点是推理成本高、难迭代、单点故障影响全局。多个小模型则是模块化、可独立迭代、成本可控但级联误差会累积模块间的接口设计容易成为瓶颈。合格的答法不是选边站而是给出场景判据任务耦合度高、数据充足时倾向端到端任务边界清晰、迭代频繁时倾向多模型编排。4. 训练系统DeepSpeed 分片、DP 与 DDP、显存账本怎么算4.1 DeepSpeed 三个阶段的切分对象与代价三面直接问“deepspeed 几个阶段分别分片什么、代价是什么”。这是训练系统的核心考点。ZeRO 的三个阶段切分对象逐级递进阶段切分对象省下的显存主要代价ZeRO-1优化器状态优化器状态按卡均分更新参数时需 all-gatherZeRO-2优化器状态 梯度梯度也均分反向传播时梯度需 reduce-scatterZeRO-3优化器状态 梯度 参数参数也均分前向反向都要 all-gather 参数通信量最大代价的本质是通信换显存。ZeRO-1 通信开销最小适合显存尚可的场景ZeRO-3 能把单卡显存压到极低但每层前向都要把参数 gather 回来通信成为瓶颈训练吞吐明显下降。常见的实现思路是根据卡数和模型规模选阶段卡多、模型大时用 ZeRO-3 配合梯度累积卡少时用 ZeRO-2 更划算。4.2 DP 和 DDP 的区别从参数同步说起DPDataParallel是单进程多线程主卡负责汇总梯度再分发主卡显存和计算成为瓶颈且 Python GIL 限制并行效率。DDPDistributedDataParallel是多进程每张卡一个进程梯度通过 all-reduce 同步没有主卡瓶颈。面试里问这个是想确认你知不知道“为什么现在没人用 DP 训大模型”——答案就是主卡瓶颈和 GILDDP 才是分布式训练的默认选择。4.3 训练时间估计与硬件利用率“模型训练时间如何估计”是个能拉开差距的问题。粗算公式是总训练时间 ≈ 总 token 数 × 每 token 计算量 /卡数 × 单卡有效算力 × 利用率。每 token 计算量约等于 6 × 参数量前向 2 次、反向 4 次。利用率是关键变量大模型训练里 MFU模型浮点利用率能到 40% 到 50% 已经不错。面试官追问“最多用过多少张卡”“硬件利用率”就是在验证你有没有真跑过大集群——没跑过的人会把利用率拍脑袋写成 80%跑过的人知道通信、气泡、数据加载都会吃掉利用率。4.4 模型监控看什么训练过程监控不是只看 loss。要盯梯度范数突增说明可能炸了、学习率曲线、各层激活值分布、显存占用、通信耗时占比、数据加载吞吐。三面问这个是想知道你有没有在训练崩掉时定位过问题。后悔药是提前把关键指标打到日志里出事时才有据可查。5. 推理与结构演进从文本输入到输出的完整链路5.1 decoding 策略的取舍三面问“讲一下文本输入大模型到输出的过程、decoding 策略”。输入先过 tokenizer 变成 token id再过 embedding 加位置编码进多层 Transformer 做注意力与前馈最后出 logits。decoding 阶段贪心解码稳定但容易重复beam search 质量高但成本翻倍top-k 和 top-p 采样在多样性与质量间取平衡。温度参数控制分布锐度温度趋零退化为贪心。面试里能说清“top-p 和 top-k 同时用时的先后顺序”就是加分项——通常先按 top-k 截断再按 top-p 累积概率截断。5.2 encoder-decoder、encoder-only、decoder-only 的分野这个经典问题考的是结构直觉。encoder-only如 BERT双向注意力适合理解类任务decoder-only如主流 LLM因果注意力适合生成encoder-decoder如 T5编码器双向、解码器因果适合序列到序列。主流 LLM 选 decoder-only是因为它在规模化时结构最简单、训练目标统一、推理时 KV 缓存复用最自然。代价是理解类任务不如双向注意力直接但规模化带来的收益盖过了这个短板。5.3 位置编码与工具调用的实现思路位置编码从绝对位置编码演进到 RoPE 这类旋转位置编码核心动机是让注意力分数只依赖相对距离从而支持长度外推。工具调用的实现常见思路是把工具描述塞进 prompt让模型生成结构化调用指令再由外部解析执行结果回填进上下文继续生成。这里的关键是格式约束和失败重试机制模型生成不合规 JSON 时要能兜底。6. 避坑与排查那些面试和实战里都会翻车的地方6.1 现象RMSNorm 手写后数值爆炸原因eps 加在了开根号外面而非里面或者 weight 初始化没按 1 处理。解决eps 必须加在均方根内部weight 初始化为全 1手写后用小张量对拍官方实现。6.2 现象数据配比实验结论无法复现原因没固定数据顺序和随机种子配比实验变成了顺序实验。解决固定采样种子记录完整数据课程配比结论必须绑定训练阶段。6.3 现象ZeRO-3 开启后吞吐断崖下跌原因参数 all-gather 通信与计算没重叠或者 batch 太小导致通信占比过高。解决增大梯度累积步数、开通信重叠、评估是否退回 ZeRO-2。6.4 现象PPL 过滤后数据量骤减且质量没提升原因参考模型与目标数据领域不匹配PPL 打分系统性偏高。解决先用目标领域小样本校准参考模型或改用分类器打分与 PPL 多路投票。6.5 现象训练 loss 正常但下游评估崩盘原因验证集与训练数据分布不一致或评估 prompt 格式与训练格式不匹配。解决评估前对齐 prompt 模板检查验证集是否泄漏进训练集。7. 设计取舍的思考为什么大模型面试最终考的是“账本意识”把三面问题串起来看会发现一条隐藏主线所有问题最终都落到“你算不算得清账”。RMSNorm 省的是归约和通信的账SwiGLU 是参数换表达力的账数据配比是 token 预算的账DeepSpeed 分片是显存换通信的账训练时间估计是算力利用率的账。大模型工程没有免费午餐每一个设计选择都在某个维度上付出代价面试官想确认的是你知不知道代价在哪、能不能在约束下做取舍。我一般会这么理解能背出结构的人是在读说明书能说出“换掉这个组件会多花多少通信、少省多少显存、训练时间涨几个点”的人才是真正做过系统的人。验证方法也很朴素——拿任何一个结构改动逼自己写出它的显存账本和通信账本写不出来就说明还没吃透。从那以后我每次看一个新模型结构都强制先算一遍它的参数账和通信账再去看论文里的收益描述往往能发现被省略的代价。希望帮到你。本文还有配套的精品资源点击获取