#十八、分布式训练、并行策略与显存优化专项题库
这一块是很多候选人“知道名词,但一追问就容易露馅”的区域。因为它横跨训练系统、通信、显存管理、并行切分与实现工程,不是只背 DP/TP/PP 三个缩写就够了。
#1. 高频笔试题
- 数据并行(
DP)、张量并行(TP)、流水线并行(PP)的区别是什么? ZeRO-1/2/3分别切分了什么?FSDP和传统DDP的核心差别是什么?- 为什么大模型训练常常需要“混合并行”而不是单一并行策略?
- activation checkpointing(激活重计算)为什么能省显存?
- 梯度累积(gradient accumulation)解决了什么问题?
all-reduce、all-gather、reduce-scatter在训练里各常用在哪里?- 为什么
MoE会把分布式通信问题进一步放大?
#就地速答
- 问:数据并行(
DP)、张量并行(TP)、流水线并行(PP)的区别是什么?答:
DP是复制完整模型、切数据;TP是切单层矩阵;PP是按层切网络。三者分别在解决吞吐、单层放不下和整网过深过大的问题。 - 问:
ZeRO-1/2/3分别切分了什么?答:核心就是“切得越来越多”。详见后文“### 31.
ZeRO-1/2/3的核心区别是什么?”。 - 问:
FSDP和传统DDP的核心差别是什么?答:
DDP的前提是每张卡都能放下完整模型,核心是同步梯度;FSDP则是把参数、梯度和优化器状态按 shard 分散到多卡上持有,在需要时再all-gather或聚合。详见后文“### 32.FSDP和DDP最本质的差别是什么?”。 - 问:为什么大模型训练常常需要“混合并行”而不是单一并行策略?
答:因为单一并行策略通常只能解决一个维度的问题,不能同时兼顾显存、算力利用率和通信成本。详见后文“### 22. 为什么大模型训练通常要做混合并行,而不是只用一种并行?”。
- 问:activation checkpointing(激活重计算)为什么能省显存?
答:因为训练时显存大头之一是中间激活值。activation checkpointing 的做法是不把所有中间激活都存下来,而是只保留少量 checkpoint,反向传播时再重新计算缺失部分。详见后文“### 33. activation checkpointing 为什么能省显存?代价是什么?”。
- 问:梯度累积(gradient accumulation)解决了什么问题?
答:它让你在显存放不下大 batch 时,用多次小 batch 的前后向累计梯度,近似获得更大的有效 batch size。
- 问:
all-reduce、all-gather、reduce-scatter在训练里各常用在哪里?答:
all-reduce是各卡先提交自己的张量做规约,再让每张卡都拿到完整结果;all-gather是把各卡分片拼成完整结果;reduce-scatter则是先规约再把结果按分片发回各卡。详见后文“### 39.all-reduce、all-gather、reduce-scatter的区别是什么?”。 - 问:为什么
MoE会把分布式通信问题进一步放大?答:因为 token 需要按路由被派发到不同专家,而专家常常分散在不同卡上,dispatch 和 gather 会把跨卡通信显著放大。
#2. 高频面试题
- 如果一个
70B dense模型单卡放不下,你会如何组合TP/PP/DP? ZeRO-3和FSDP都在做参数切分,它们在工程实现和性能特征上怎么比较?- 为什么有时多卡训练并没有线性加速,瓶颈通常卡在哪?
- 什么情况下你会优先加
PP,什么情况下会优先加TP? - 为什么说大模型训练经常不是“算力瓶颈”,而是“通信瓶颈”或“显存瓶颈”?
- 如果 loss 不收敛,你如何判断问题来自学习率、数值稳定性、并行切分,还是通信错误?
- 为什么
activation checkpointing省显存但会拖慢训练? - 如果你要训练
MoE,专家并行(expert parallel)和普通TP/PP如何协同?
#就地速答
- 问:如果一个
70B dense模型单卡放不下,你会如何组合TP/PP/DP?答:常见做法是先在单机高速互联内用
TP切宽层,再用PP按层切深度,最外层再叠DP/FSDP扩吞吐;核心原则是先保证放得下,再看通信是否可承受。 - 问:
ZeRO-3和FSDP都在做参数切分,它们在工程实现和性能特征上怎么比较?答:两者都属于全分片思路,差别更多在框架实现与调度细节:
FSDP更偏 PyTorch 原生模块级 all-gather/reshard,ZeRO-3更偏 DeepSpeed stage 化管理,真正快慢常取决于 overlap、粒度和互联。 - 问:为什么有时多卡训练并没有线性加速,瓶颈通常卡在哪?
答:常见瓶颈是梯度同步、参数 all-gather、数据加载、stage 不均衡和小 batch 下的调度开销,所以加卡只会放大系统短板,不会自动带来线性收益。
- 问:什么情况下你会优先加
PP,什么情况下会优先加TP?答:当模型按层切更自然、跨机互联较弱时更偏向
PP;当单层太宽、但设备间有很强高速互联时更偏向TP。 - 问:为什么说大模型训练经常不是“算力瓶颈”,而是“通信瓶颈”或“显存瓶颈”?
答:因为理论 FLOPs 之外,真实训练还要同步梯度、聚合参数、存激活和优化器状态,很多时候 GPU 算得动,但系统被通信或显存卡住了。
- 问:如果 loss 不收敛,你如何判断问题来自学习率、数值稳定性、并行切分,还是通信错误?
答:先做最小复现:退回单卡/小模型确认算法本身,再逐步恢复混合精度、并行和通信;同时看梯度范数、是否出现
NaN/Inf、collective 是否一致、以及问题是否只在多卡规模下出现。 - 问:为什么
activation checkpointing省显存但会拖慢训练?答:因为训练时显存大头之一是中间激活值。activation checkpointing 的做法是不把所有中间激活都存下来,而是只保留少量 checkpoint,反向传播时再重新计算缺失部分。详见后文“### 33. activation checkpointing 为什么能省显存?代价是什么?”。
- 问:如果你要训练
MoE,专家并行(expert parallel)和普通TP/PP如何协同?答:通常是 dense 主干继续走
TP/PP,专家层单独做EP,最外层再配DP/FSDP;这样既能让专家自然分布到多卡,也不会把所有层都强行塞进同一种并行策略。
#3. 并行策略到底在解决什么
最稳的理解方式是把问题拆成三类:
- 模型放不下:这是参数/优化器状态/激活显存问题,通常需要
TP、PP、FSDP/ZeRO-3。 - 吞吐不够:这是并行规模和 pipeline 利用率问题,通常需要
DP、micro-batch、调度优化。 - 通信太重:这是网络与 collective 开销问题,需要更合理的切分方式和通信重叠。
#4. DP / TP / PP / FSDP / ZeRO 的一句话定位
DP:每张卡放完整模型,切数据,主要问题是梯度同步。TP:把单层大矩阵拆到多卡上算,主要问题是层内通信。PP:按层切模型,主要问题是流水线气泡和 micro-batch 调度。FSDP:把参数、梯度、优化器状态按 shard 方式切开,前向/反向按需聚合。ZeRO:核心也是切状态,只是通常从 DeepSpeed 语境下按 stage 来讲更常见。
#5. 高频追问:ZeRO-1/2/3 到底区别在哪
#稳定答法
ZeRO-1:切优化器状态。ZeRO-2:在ZeRO-1基础上再切梯度。ZeRO-3:进一步连参数本身也切分。
所以 stage 越高,静态显存越省,但前向/反向时需要更多参数聚合与通信。
#6. 高频追问:FSDP 为什么常拿来对比 ZeRO-3
因为两者本质都在做“全分片”思路:把原本每卡都要完整持有的大模型状态改成分布式持有、按需聚合。
面试里通常不用纠缠框架实现细节,但最好能说出:
- 它们都想解决超大模型单卡放不下的问题;
- 核心代价都是通信增加;
- 是否好用、是否快,和模型结构、硬件互联、实现成熟度、是否能通信重叠强相关。
#7. 显存优化的高频题
#高频笔试题
- 训练显存主要由哪几部分组成?
- 哪些方法可以降低训练显存?
- 为什么
BF16/FP16能省显存? - activation recomputation(激活重计算)会影响什么?
- optimizer state 为什么常常比你想象得更占显存?
#就地速答
- 问:训练显存主要由哪几部分组成?
答:最常见的五块是参数、梯度、优化器状态、前向激活,以及临时通信/workspace buffer。
- 问:哪些方法可以降低训练显存?
答:常见手段包括低精度训练、activation checkpointing、缩短序列和 batch、
ZeRO/FSDP分片、LoRA/QLoRA、以及必要时的 CPU/NVMe offload。 - 问:为什么
BF16/FP16能省显存?答:因为每个元素的字节数比
FP32少一半左右,所以参数、梯度、激活和部分优化器状态都会随之缩小。 - 问:activation recomputation(激活重计算)会影响什么?
答:它能显著省激活显存,但会增加重复前向计算,因此通常会让训练更慢。
- 问:optimizer state 为什么常常比你想象得更占显存?
答:因为像
Adam这类优化器通常要额外保存一阶矩、二阶矩,很多实现还会保留 master weights,所以总开销往往能到参数本体的数倍。
#高频面试题
- 如果你只有有限张
A100/H100,怎么训练更大的模型? - 显存不够时,你的优化顺序是什么?
- gradient checkpointing、
QLoRA、ZeRO-3、offload、sequence parallel 分别适合什么阶段? - 为什么有时显存够了,训练速度却慢到不能接受?
#就地速答
- 问:如果你只有有限张
A100/H100,怎么训练更大的模型?答:优先组合低精度、分片并行、activation checkpointing 和更合理的 batch/序列长度;如果任务适合,再用
LoRA/QLoRA避免全参训练。 - 问:显存不够时,你的优化顺序是什么?
答:先降精度,再看 batch/序列和 checkpointing,然后上
ZeRO/FSDP或 PEFT,最后才考虑 offload,因为 offload 往往最伤吞吐。 - 问:gradient checkpointing、
QLoRA、ZeRO-3、offload、sequence parallel 分别适合什么阶段?答:
checkpointing适合激活过大,QLoRA适合资源受限的微调,ZeRO-3适合全参超大模型,offload适合“先跑起来”,sequence parallel则适合长序列下分摊激活压力。 - 问:为什么有时显存够了,训练速度却慢到不能接受?
答:因为省显存的方法常常在用计算、通信或存储 IO 做交换,比如重计算、offload、频繁 all-gather,都可能把吞吐拖下来。
#8. 一套稳妥的显存优化回答框架
显存优化最好按这 5 层回答:
- 精度层:
FP32 -> BF16/FP16 -> INT8/INT4 - 状态层:
ZeRO/FSDP切参数、梯度、优化器状态 - 激活层:checkpointing、sequence parallel、减少长序列
- 结构层:
LoRA/QLoRA、更小 batch、更短上下文 - 存储层:CPU/NVMe offload
这样答会显得你不是只会喊一个招,而是知道显存来源和对应打法。
#9. 通信与性能瓶颈专项
#高频面试题
- 为什么大模型多机多卡训练常常扩到一定规模后效率骤降?
all-reduce为什么会成为瓶颈?- 为什么
TP往往更依赖高速互联? PP的 bubble(流水线气泡)是什么,怎么缓解?- 为什么 overlap communication and computation(通信计算重叠)这么重要?
#就地速答
- 问:为什么大模型多机多卡训练常常扩到一定规模后效率骤降?
答:因为卡数越多,梯度同步、参数聚合、网络拓扑不均衡和慢节点效应都会被放大,最终通信时间占比越来越高。
- 问:
all-reduce为什么会成为瓶颈?答:因为它要求所有参与设备都完成大规模归约与广播,消息大、同步强、最慢一张卡还会拖住全局。
- 问:为什么
TP往往更依赖高速互联?答:因为
TP是在单层内部切分矩阵,意味着每一层前向和反向都可能跨卡交换中间结果。如果互联慢,层内通信开销会直接卡在主路径上,导致 GPU 算力吃不满。详见后文“### 35. 为什么说TP特别依赖高速互联?”。 - 问:
PP的 bubble(流水线气泡)是什么,怎么缓解?答:pipeline bubble 指的是流水线并行中,一些 stage 在等待前后 stage 时出现的空转时间。它本质上代表 GPU 没有持续被有效计算填满。详见后文“### 43. pipeline bubble 是什么?”。
- 问:为什么 overlap communication and computation(通信计算重叠)这么重要?
答:因为它的目标不是减少通信量,而是把本来必须等的通信时间藏到计算背后,从而降低 step time 里的纯等待时间。
#答题要点
DP主要痛在梯度同步;TP主要痛在层内频繁通信,因此更吃NVLink/NVSwitch;PP主要痛在 stage 不均衡和 bubble;- 真正高性能训练往往靠的是“切得对 + 通信藏起来 + 负载均衡”。
#10. CUDA / kernel / 算子优化为什么会进入面试
因为训练和推理到最后都会落到 kernel 层。很多公司问这块,不是要求你现场写出最强 CUDA,而是看你是否理解:为什么同一个数学算子,不同实现速度差可以非常大。
#高频笔试题
- 算子融合为什么能提速?
- 为什么
FlashAttention主要优化的是IO而不是数学公式? RMSNorm、softmax、GEMM为什么经常是优化热点?- 什么是 memory coalescing(访存合并)?
- shared memory / register / global memory 的速度层次关系是什么?
#就地速答
- 问:算子融合为什么能提速?
答:算子融合就是把原本多个相邻的小算子,合并成更少、更大的 kernel 来执行;它通常能提速,因为能减少 kernel launch 开销、减少中间结果反复写回显存,并提升整体访存效率。详见后文“### 37. 什么叫算子融合?为什么它能提速?”。
- 问:为什么
FlashAttention主要优化的是IO而不是数学公式?答:因为它没有把 attention 的理论复杂度从
O(n^2)彻底变成别的量级,token 两两交互这件事仍然存在。详见后文“### 30. 为什么说FlashAttention的核心是 IO-aware,而不是O(n^2)变没了?”。 - 问:
RMSNorm、softmax、GEMM为什么经常是优化热点?答:
GEMM是绝对大头,softmax/RMSNorm虽然公式简单但调用频繁、常常受访存和同步限制,所以它们一起构成大模型里最值得抠性能的热点。 - 问:什么是 memory coalescing(访存合并)?
答:就是让相邻线程尽量访问连续内存地址,这样 GPU 能把多次小访问并成更高效的大访问。
- 问:shared memory / register / global memory 的速度层次关系是什么?
答:一般寄存器最快,其次是 shared memory / cache,global memory(HBM)最慢,所以高性能 kernel 都在想办法少碰 global memory。
#高频面试题
- 为什么很多大模型算子优化最后都在做“减少 HBM 访问”?
#就地速答
- 问:为什么很多大模型算子优化最后都在做“减少 HBM 访问”?
答:因为很多大模型算子真正慢的不是乘加本身,而是中间结果在高带宽显存和计算单元之间来回搬运。
- 什么叫算子融合?举一个 LLM 中的例子。
- 为什么
RMSNorm、softmax、attention这些看起来简单的算子,优化难度反而很高? - 你如何判断某个算子是 compute-bound 还是 memory-bound?
- 为什么说
FlashAttention成功的关键之一是“不要显式 materialize 整个 attention matrix”?
#就地速答
- 问:为什么
RMSNorm、softmax、attention这些看起来简单的算子,优化难度反而很高?答:因为它们往往算术强度不高,却很吃访存模式、同步、数值稳定和 kernel 调度细节,简单公式并不等于容易写出高性能实现。
- 问:你如何判断某个算子是 compute-bound 还是 memory-bound?
答:最直接的判断方式,是看算子耗时到底更多花在乘加计算还是数据搬运上:如果提升算力利用率能明显加速,它更偏 compute-bound;如果主要在等显存读写和带宽,它更偏 memory-bound。详见后文“### 137. 怎么判断一个算子更偏 compute-bound 还是 memory-bound?”。
- 问:为什么说
FlashAttention成功的关键之一是“不要显式 materialize 整个 attention matrix”?答:因为一旦把完整 attention matrix 落到 HBM,中间结果的读写成本会非常夸张;不显式物化它,才能真正省掉大量显存带宽。
#11. kernel / CUDA 类问题的稳定答法
回答这类题,最稳是围绕 4 个词:
- 访存:减少不必要的 global memory 往返;
- 并行度:让更多线程块 / warp 真正吃满设备;
- 融合:减少 kernel launch 和中间结果落地;
- 重叠:尽量让通信、拷贝、计算并行发生。
#12. 这一块到底在考什么
真正考的不是你能不能背完整框架图,而是:
- 你是否知道大模型训练为什么必须分布式;
- 你是否能分清显存瓶颈、通信瓶颈、算力瓶颈;
- 你是否理解“放得下”和“跑得快”是两个不同问题;
- 你是否能把并行策略、显存优化、kernel 优化串成一条完整链路。
#13. 通信原语强化题单
这一组题非常像训练系统岗和 infra 岗的面试风格,因为它们直接检查你是否理解 collective communication(集合通信)到底在训练图里扮演什么角色。
#高频笔试题
all-reduce、all-gather、reduce-scatter分别做什么?- 为什么
reduce-scatter + all-gather常被拿来替代一次完整all-reduce语义链路? ring all-reduce和tree all-reduce各适合什么场景?- 为什么
FSDP/ZeRO-3经常需要all-gather参数?
#就地速答
- 问:
all-reduce、all-gather、reduce-scatter分别做什么?答:
all-reduce是各卡先提交自己的张量做规约,再让每张卡都拿到完整结果;all-gather是把各卡分片拼成完整结果;reduce-scatter则是先规约再把结果按分片发回各卡。详见后文“### 39.all-reduce、all-gather、reduce-scatter的区别是什么?”。 - 问:为什么
reduce-scatter + all-gather常被拿来替代一次完整all-reduce语义链路?答:因为很多分布式训练场景里,我们并不总需要“每一步立刻让每张卡都拿完整结果”。详见后文“### 40. 为什么
reduce-scatter + all-gather经常一起出现?”。 - 问:
ring all-reduce和tree all-reduce各适合什么场景?答:
ring往往更适合大消息、追求带宽利用率的场景;tree往往更适合小消息或更关注低延迟的场景。 - 问:为什么
FSDP/ZeRO-3经常需要all-gather参数?答:因为每张卡平时只存参数分片,前向或反向真正算某一层之前,必须先把该层需要的完整参数临时拼出来。
#高频面试题
- 反向传播中,哪些通信最容易与计算重叠,哪些最难?
- 为什么有时候通信重叠做不好,反而会负优化?
- 如果
all-reduce很慢,你第一反应会排查什么? - 为什么 bucket size(分桶大小)会影响训练性能?
#就地速答
- 问:反向传播中,哪些通信最容易与计算重叠,哪些最难?
答:梯度 bucket 的
all-reduce/reduce-scatter往往更容易在反向分层完成时逐步重叠;整层参数 all-gather 或强同步点附近的通信通常更难完全藏住。 - 问:为什么有时候通信重叠做不好,反而会负优化?
答:因为 overlap 本身不是零成本的,它会引入额外 buffer、流调度、chunk 切分和竞争开销;如果通信量本来不大,或者切得太碎,反而可能把系统拖慢。详见后文“### 46. 为什么通信重叠有时会负优化?”。
- 问:如果
all-reduce很慢,你第一反应会排查什么?答:先看拓扑和带宽是否正常,再看 bucket 大小、是否有 straggler、是否被数据加载或其他流阻塞,最后再怀疑 NCCL 本身。
- 问:为什么 bucket size(分桶大小)会影响训练性能?
答:bucket 太大,通信启动晚,不利于尽早重叠;bucket 太小,又会让通信过碎,调度和 launch 开销上升。详见后文“### 47. 为什么 bucket size 会影响训练性能?”。
#答题要点
all-reduce更像“大家先汇总再人人拿到完整结果”;all-gather更像“每张卡只拿一部分,但最后要把大家的碎片拼完整”;reduce-scatter更像“先汇总,再把汇总结果按 shard 分发”;- 真正高性能的系统常常不是少通信,而是把通信切碎、提前发、和计算重叠起来。
#14. expert parallel(专家并行)专项
#高频笔试题
- expert parallel(
EP)是什么? - 为什么
MoE比 dense 模型更容易遇到负载不均问题? - 为什么
EP通常要和DP/TP/PP混合使用?
#就地速答
- 问:expert parallel(
EP)是什么?答:expert parallel(
EP)是把不同专家分布到不同设备上,让 token 根据路由结果被派发到对应专家执行,从而把MoE的专家层并行展开。详见后文“### 14. expert parallel(专家并行)专项”。 - 问:为什么
MoE比 dense 模型更容易遇到负载不均问题?答:因为路由器可能把大量 token 挤到少数热门专家,导致有些卡过载、有些卡空闲,这种不均衡在 dense 模型里不会这么尖锐。
- 问:为什么
EP通常要和DP/TP/PP混合使用?答:因为
EP只解决专家层的分布方式,不能单独处理 dense 主干、全局 batch 和整网放不下的问题,所以通常只能作为混合并行的一环。
#高频面试题
- 为什么在
MoE里很多时候优先考虑EP,而不是简单把专家层继续做TP? - top-k 路由为什么会放大跨卡通信?
- capacity factor(容量因子)和 load balancing loss(负载均衡损失)分别在解决什么?
- 如果某些 expert 特别热、某些 expert 几乎不被激活,你会怎么处理?
#就地速答
- 问:为什么在
MoE里很多时候优先考虑EP,而不是简单把专家层继续做TP?答:因为专家天然就是可分区的独立子网络,用
EP让“专家按卡分布”最符合结构本身;如果继续做TP,专家内部通信往往会更重。 - 问:top-k 路由为什么会放大跨卡通信?
答:因为一个 batch 里的 token 可能要被分发到不同卡上的多个专家,top-k 越大,需要 dispatch 和 gather 的路径通常越复杂。
- 问:capacity factor(容量因子)和 load balancing loss(负载均衡损失)分别在解决什么?
答:
capacity factor控的是单个专家最多接多少 token,防止局部过载;load balancing loss则是在训练时约束路由更均匀,减少热点专家塌缩。 - 问:如果某些 expert 特别热、某些 expert 几乎不被激活,你会怎么处理?
答:先看路由分布和熵,再调辅助负载均衡损失、capacity factor、router temperature/noise,必要时还要做专家复制、数据重配或路由正则。
#答题要点
EP的核心是“专家按卡分布,token 按路由跨卡发往对应专家”;- 所以它最本质的问题不是参数存储,而是 token dispatch(分发)和 load balance(负载均衡);
MoE系统优化里,常见关键词就是:路由稳定、容量控制、热点 expert、跨卡交换、通信与计算重叠。
#15. pipeline bubble 与负载均衡专项
#高频笔试题
- pipeline bubble 是什么?
- 为什么 micro-batch 数量会影响 pipeline 利用率?
- 为什么 stage 切分不均会导致整体吞吐下降?
#就地速答
- 问:pipeline bubble 是什么?
答:pipeline bubble 指的是流水线并行中,一些 stage 在等待前后 stage 时出现的空转时间。它本质上代表 GPU 没有持续被有效计算填满。详见后文“### 43. pipeline bubble 是什么?”。
- 问:为什么 micro-batch 数量会影响 pipeline 利用率?
答:因为 micro-batch 更多时,流水线更容易持续有活干,空转比例下降,所以 bubble 会更小。详见后文“### 44. 为什么增加 micro-batch 能减小 pipeline bubble,但不能无限增大?”。
- 问:为什么 stage 切分不均会导致整体吞吐下降?
答:因为 pipeline 的整体速度由最慢 stage 决定,慢 stage 会让其他设备排队或空转,吞吐自然掉下来。
#高频面试题
- 如果
PP训练很慢,你如何判断问题是 bubble 过大还是 stage 切分不均? - 为什么增加 micro-batch 能减轻 bubble,但不能无限增大?
- 如果 embedding 层和最后输出头特别重,stage 应该如何切?
- 什么叫 1F1B(one-forward-one-backward)调度?它为什么常见?
#就地速答
- 问:如果
PP训练很慢,你如何判断问题是 bubble 过大还是 stage 切分不均?答:先看时间线:如果各 stage 周期性大段空闲,更像 bubble;如果某一两个 stage 持续显著更长,更像切分不均。
- 问:为什么增加 micro-batch 能减轻 bubble,但不能无限增大?
答:因为 micro-batch 更多时,流水线更容易持续有活干,空转比例下降,所以 bubble 会更小。详见后文“### 44. 为什么增加 micro-batch 能减小 pipeline bubble,但不能无限增大?”。
- 问:如果 embedding 层和最后输出头特别重,stage 应该如何切?
答:通常要把重头和较轻的中间层重新配平,必要时让 embedding/output head 单独成 stage,或与更少的 Transformer block 配对。
- 问:什么叫 1F1B(one-forward-one-backward)调度?它为什么常见?
答:就是流水线预热后按“一次前向、一次反向”交替推进 micro-batch,常见是因为它能在激活占用和 pipeline 利用率之间取得较好的折中。
#答题要点
- pipeline bubble 本质是:某些 stage 在等数据,GPU 有空转;
- micro-batch 越多,流水线越容易填满,但调度、显存和延迟成本也会上升;
PP调优通常就是在 stage balance、micro-batch 数量和调度策略之间找折中。
#16. 通信重叠(communication overlap)专项
#高频面试题
- 为什么训练系统总在强调 overlap communication and computation?
- PyTorch
DDP/FSDP里通信重叠通常是怎么发生的? - 为什么“计算太快、通信太小、显存太紧”时,通信重叠可能反而不划算?
- 如果一个系统说自己做了 overlap,你怎么验证它不是 PPT 优化?
#就地速答
- 问:为什么训练系统总在强调 overlap communication and computation?
答:因为真正拖慢 step 的常常是“计算完了还在等通信”,重叠的目标就是让 GPU 别闲着等网络。
- 问:PyTorch
DDP/FSDP里通信重叠通常是怎么发生的?答:常见方式是把梯度分桶,某些层一反向完就异步触发对应 bucket 的 collective,让后续层计算和前面桶的通信并行进行。
- 问:为什么“计算太快、通信太小、显存太紧”时,通信重叠可能反而不划算?
答:因为重叠本身也要额外 buffer、调度和流管理,若通信量本来不大,额外复杂度和显存成本可能比收益还高。
- 问:如果一个系统说自己做了 overlap,你怎么验证它不是 PPT 优化?
答:直接看 profiler 时间线和 step breakdown:如果通信真的被藏到计算背后,NCCL 活动应该与 kernel 同时出现,而且总 step time 会实打实下降。
#答题要点
- 通信重叠的目标不是减少通信量,而是隐藏通信时间;
- 常见实现方式是在反向传播分层完成后,尽早触发该层梯度同步;
- 但 overlap 不是总收益:调度开销、流竞争、额外 buffer、chunk 太碎,都可能让它失效。
#17. 训练系统岗最爱问的排障题
- loss 抖得很厉害,但单卡小模型正常,你如何排查是并行切分问题还是数值问题?
- 多机训练吞吐忽高忽低,你先看数据加载、NCCL、还是 stage balance?为什么?
- 一换成
ZeRO-3/FSDP就慢很多,你如何判断慢在参数all-gather、offload、还是未重叠成功? MoE训练不稳定,是路由器、负载均衡,还是 expert capacity 设置问题?
#就地速答
- 问:loss 抖得很厉害,但单卡小模型正常,你如何排查是并行切分问题还是数值问题?
答:先固定随机种子和 batch,把单卡、多卡、混合精度、通信重叠逐项打开;若只在并行规模上坏掉,更像切分/通信问题,若单卡也出现
NaN/Inf,更像数值或学习率问题。 - 问:多机训练吞吐忽高忽低,你先看数据加载、NCCL、还是 stage balance?为什么?
答:我会先看数据加载和 GPU 利用率时间线,因为这是最常见也最便宜排除的外因;若数据稳定,再看 NCCL 与 stage 时间分布判断是通信还是切分。
- 问:一换成
ZeRO-3/FSDP就慢很多,你如何判断慢在参数all-gather、offload、还是未重叠成功?答:先用 profiler 看 all-gather 时间占比和 CPU/磁盘等待,再看通信是否与反向重叠;如果 timeline 上出现长时间纯等待,多半就是 gather 或 offload 没藏住。
- 问:
MoE训练不稳定,是路由器、负载均衡,还是 expert capacity 设置问题?答:先看路由分布、专家利用率、丢 token 比例和辅助损失走势;如果热点专家明显或大量 token 被截断,通常就是路由/容量设置先出问题。
#18. 用“训练状态”把显存来源拆清楚
如果你想把这块讲细,最有效的方式不是直接背框架,而是先把训练时到底在存什么拆开。大模型训练显存通常由下面五块组成:
- 参数(parameters):模型权重本身。
- 梯度(gradients):反向传播后得到,与参数形状相同。
- 优化器状态(optimizer states):以
Adam为例,通常至少还有一阶、二阶矩,再加 master weights,往往比参数本身还大。 - 激活值(activations):前向中间结果,反向要用。
- 临时通信 / workspace / buffer:例如
all-gather、reduce-scatter、kernel workspace、bucket buffer。
这五块里,很多初学者最容易低估的是两点:
- 优化器状态 在全参数训练里可能非常重;
- 激活值 在长序列和大 batch 下会迅速成为主导。
所以不同优化手段,本质上是在打不同对象:
ZeRO/FSDP更偏切参数、梯度、优化器状态;- checkpointing 更偏切激活;
TP/PP更偏从结构上把模型放进更多卡;- 量化/低精度更偏整体缩小每个元素的字节数。
如果你一上来就把这五块讲清楚,后面再讲任何并行策略,逻辑都会非常稳。
#19. 官方实现视角下,FSDP2 到底怎么工作
这一块如果只说“FSDP 会把参数切开”,其实还不够。按 PyTorch 官方 FSDP2 教程,更准确的工作流是:
- 前向 / 反向计算之外:参数是分片存储的,每张卡只持有一部分参数。
- 前向前:需要当前模块计算时,把这一层对应参数
all-gather成完整权重。 - 前向后:如果配置为
reshard_after_forward=True,这一层算完又重新切回分片,以降低峰值显存。 - 反向时:每张卡先拿到本地未切分梯度,再通过
reduce-scatter变回分片梯度。 - 优化器更新时:优化器只更新本 rank 持有的那部分参数和优化器状态。
这就是为什么官方文档会说:FSDP 可以看作把 DDP 里那种“完整 all-reduce”拆解成了 all-gather + reduce-scatter 的组合。
真正该记住的不是 API,而是这条因果链:
DDP:完整复制模型,最后同步梯度;FSDP2:平时不保存完整参数,只在算某层前临时聚齐,算完再切开。
这也是它能训练“单卡根本放不下”的模型的根本原因。
#20. 官方实现视角下,TP 为什么通常落在 Linear/Embedding/Norm
PyTorch 官方 Tensor Parallel 教程给了一个非常好的理解框架:TP 不是随便切,而是优先切那些本来就是大矩阵乘法的层。
最常见的是:
ColwiseParallel:把Linear的输出列方向切开;RowwiseParallel:把Linear的输入行方向切开;SequenceParallel:对LayerNorm/RMSNorm/Dropout等按序列维度分片,以省激活显存。
为什么 TP 经常和 Transformer 的 MLP + Attention 一起讲?因为这些层的主干都是大矩阵乘法,最适合做切分。例如在 MLP 里:
- 第一层投影
w1/w3常做列切分; - 第二层投影
w2常做行切分;
这样中间只需要在关键位置做通信,而不是每一步都全量同步。
所以面试里如果问“为什么 TP 适合 Transformer”,最好的回答不是“因为大家都这么做”,而是:
- Transformer 的计算热点天然集中在可分片的大矩阵乘法上;
- 这些层切开以后,通信模式相对规则;
- 再配合
Sequence Parallel,还能进一步压激活显存。
#21. PP 的本质不是切层,而是“调度 micro-batch”
很多人会把 Pipeline Parallel 简化成“把层切到不同 GPU 上”,但这只说对了一半。真正决定 PP 性能的,是 micro-batch 调度。
按 PyTorch 和 DeepSpeed 的官方说明,PP 训练通常会把一个 batch 切成多个 micro-batch,然后让不同 stage 像流水线一样交替做前向和反向。于是性能上关键就不只是谁负责哪些层,还包括:
- 一个 stage 是否足够忙;
- 不同 stage 计算量是否平衡;
- micro-batch 数是否足够把流水线灌满;
- 调度策略是
GPipe还是1F1B; - 激活通信和反向梯度通信是否平滑。
所以 PP 的本质可以总结成:
- 空间上:切层;
- 时间上:切 batch;
- 系统上:靠调度把空转压小。
这也是为什么面试官一提 PP,很快就会追问 micro-batch、bubble、1F1B,而不是只问“层怎么切”。
#22. pipeline bubble 怎么定量理解
如果你想把这块讲得比普通八股更像真做过,可以给一个简单的定量直觉。
假设:
- 流水线有
p个 stage; - 一个大 batch 被切成
m个 micro-batch;
那么一个常见直觉是:micro-batch 越少,bubble 占比越大;micro-batch 越多,流水线越容易被填满。
在很多介绍里,会把 bubble 理解成大约和 (p-1) 个空档相关,而总时长大约与 (m + p - 1) 同阶,所以常见口语化判断是:
m太小,bubble 很明显;m增大后,bubble 相对占比下降;- 但
m不可能无限增大,因为显存、调度和延迟会变差。
面试里通常不要求你严丝合缝推公式,但如果你能讲出:
PP 的核心不是“有没有 bubble”,而是“bubble 占总时长比例能不能接受”
这一层,就已经比只会背定义的人强很多。
#23. 一个更真实的 70B 训练方案怎么讲
如果面试官问“一个 70B dense 模型怎么训练”,只回答“用分布式”太空了。更稳的说法是分层判断:
- 先问单卡能不能放下:通常不能,所以单靠
DP不够。 - 如果是单机 8 卡高速互联:优先考虑机内
TP,把最重的矩阵算子切开。 - 如果跨多机扩展:通常让
TP尽量留在机内,跨机再叠FSDP或DP,减少高频跨机层内通信。 - 如果层数很深或模型 stage 很自然:再考虑加
PP。 - 如果显存还是扛不住:叠加 mixed precision、checkpointing、
ZeRO/FSDP、必要时 offload。
所以一套比较真实的答法可能是:
- 机内做
TP/SP; - 机间做
FSDP; - 如果规模再大,叠
PP; - 再用 checkpointing 和 mixed precision 控显存。
这类回答的关键不是“唯一正确”,而是体现你知道:并行策略是按硬件拓扑分层落的,不是把名词乱拼起来。