#十八、分布式训练、并行策略与显存优化专项题库

这一块是很多候选人“知道名词,但一追问就容易露馅”的区域。因为它横跨训练系统、通信、显存管理、并行切分与实现工程,不是只背 DP/TP/PP 三个缩写就够了。

#1. 高频笔试题

  1. 数据并行(DP)、张量并行(TP)、流水线并行(PP)的区别是什么?
  2. ZeRO-1/2/3 分别切分了什么?
  3. FSDP 和传统 DDP 的核心差别是什么?
  4. 为什么大模型训练常常需要“混合并行”而不是单一并行策略?
  5. activation checkpointing(激活重计算)为什么能省显存?
  6. 梯度累积(gradient accumulation)解决了什么问题?
  7. all-reduceall-gatherreduce-scatter 在训练里各常用在哪里?
  8. 为什么 MoE 会把分布式通信问题进一步放大?

#就地速答

  • 问:数据并行(DP)、张量并行(TP)、流水线并行(PP)的区别是什么?

    答:DP 是复制完整模型、切数据;TP 是切单层矩阵;PP 是按层切网络。三者分别在解决吞吐、单层放不下和整网过深过大的问题。

  • 问:ZeRO-1/2/3 分别切分了什么?

    答:核心就是“切得越来越多”。详见后文“### 31. ZeRO-1/2/3 的核心区别是什么?”。

  • 问:FSDP 和传统 DDP 的核心差别是什么?

    答:DDP 的前提是每张卡都能放下完整模型,核心是同步梯度;FSDP 则是把参数、梯度和优化器状态按 shard 分散到多卡上持有,在需要时再 all-gather 或聚合。详见后文“### 32. FSDPDDP 最本质的差别是什么?”。

  • 问:为什么大模型训练常常需要“混合并行”而不是单一并行策略?

    答:因为单一并行策略通常只能解决一个维度的问题,不能同时兼顾显存、算力利用率和通信成本。详见后文“### 22. 为什么大模型训练通常要做混合并行,而不是只用一种并行?”。

  • 问:activation checkpointing(激活重计算)为什么能省显存?

    答:因为训练时显存大头之一是中间激活值。activation checkpointing 的做法是不把所有中间激活都存下来,而是只保留少量 checkpoint,反向传播时再重新计算缺失部分。详见后文“### 33. activation checkpointing 为什么能省显存?代价是什么?”。

  • 问:梯度累积(gradient accumulation)解决了什么问题?

    答:它让你在显存放不下大 batch 时,用多次小 batch 的前后向累计梯度,近似获得更大的有效 batch size。

  • 问:all-reduceall-gatherreduce-scatter 在训练里各常用在哪里?

    答:all-reduce 是各卡先提交自己的张量做规约,再让每张卡都拿到完整结果;all-gather 是把各卡分片拼成完整结果;reduce-scatter 则是先规约再把结果按分片发回各卡。详见后文“### 39. all-reduceall-gatherreduce-scatter 的区别是什么?”。

  • 问:为什么 MoE 会把分布式通信问题进一步放大?

    答:因为 token 需要按路由被派发到不同专家,而专家常常分散在不同卡上,dispatch 和 gather 会把跨卡通信显著放大。

#2. 高频面试题

  1. 如果一个 70B dense 模型单卡放不下,你会如何组合 TP/PP/DP
  2. ZeRO-3FSDP 都在做参数切分,它们在工程实现和性能特征上怎么比较?
  3. 为什么有时多卡训练并没有线性加速,瓶颈通常卡在哪?
  4. 什么情况下你会优先加 PP,什么情况下会优先加 TP
  5. 为什么说大模型训练经常不是“算力瓶颈”,而是“通信瓶颈”或“显存瓶颈”?
  6. 如果 loss 不收敛,你如何判断问题来自学习率、数值稳定性、并行切分,还是通信错误?
  7. 为什么 activation checkpointing 省显存但会拖慢训练?
  8. 如果你要训练 MoE,专家并行(expert parallel)和普通 TP/PP 如何协同?

#就地速答

  • 问:如果一个 70B dense 模型单卡放不下,你会如何组合 TP/PP/DP

    答:常见做法是先在单机高速互联内用 TP 切宽层,再用 PP 按层切深度,最外层再叠 DP/FSDP 扩吞吐;核心原则是先保证放得下,再看通信是否可承受。

  • 问:ZeRO-3FSDP 都在做参数切分,它们在工程实现和性能特征上怎么比较?

    答:两者都属于全分片思路,差别更多在框架实现与调度细节: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. 并行策略到底在解决什么

最稳的理解方式是把问题拆成三类:

  1. 模型放不下:这是参数/优化器状态/激活显存问题,通常需要 TPPPFSDP/ZeRO-3
  2. 吞吐不够:这是并行规模和 pipeline 利用率问题,通常需要 DP、micro-batch、调度优化。
  3. 通信太重:这是网络与 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. 显存优化的高频题

#高频笔试题

  1. 训练显存主要由哪几部分组成?
  2. 哪些方法可以降低训练显存?
  3. 为什么 BF16/FP16 能省显存?
  4. activation recomputation(激活重计算)会影响什么?
  5. optimizer state 为什么常常比你想象得更占显存?

#就地速答

  • 问:训练显存主要由哪几部分组成?

    答:最常见的五块是参数、梯度、优化器状态、前向激活,以及临时通信/workspace buffer。

  • 问:哪些方法可以降低训练显存?

    答:常见手段包括低精度训练、activation checkpointing、缩短序列和 batch、ZeRO/FSDP 分片、LoRA/QLoRA、以及必要时的 CPU/NVMe offload。

  • 问:为什么 BF16/FP16 能省显存?

    答:因为每个元素的字节数比 FP32 少一半左右,所以参数、梯度、激活和部分优化器状态都会随之缩小。

  • 问:activation recomputation(激活重计算)会影响什么?

    答:它能显著省激活显存,但会增加重复前向计算,因此通常会让训练更慢。

  • 问:optimizer state 为什么常常比你想象得更占显存?

    答:因为像 Adam 这类优化器通常要额外保存一阶矩、二阶矩,很多实现还会保留 master weights,所以总开销往往能到参数本体的数倍。

#高频面试题

  1. 如果你只有有限张 A100/H100,怎么训练更大的模型?
  2. 显存不够时,你的优化顺序是什么?
  3. gradient checkpointing、QLoRAZeRO-3、offload、sequence parallel 分别适合什么阶段?
  4. 为什么有时显存够了,训练速度却慢到不能接受?

#就地速答

  • 问:如果你只有有限张 A100/H100,怎么训练更大的模型?

    答:优先组合低精度、分片并行、activation checkpointing 和更合理的 batch/序列长度;如果任务适合,再用 LoRA/QLoRA 避免全参训练。

  • 问:显存不够时,你的优化顺序是什么?

    答:先降精度,再看 batch/序列和 checkpointing,然后上 ZeRO/FSDP 或 PEFT,最后才考虑 offload,因为 offload 往往最伤吞吐。

  • 问:gradient checkpointing、QLoRAZeRO-3、offload、sequence parallel 分别适合什么阶段?

    答:checkpointing 适合激活过大,QLoRA 适合资源受限的微调,ZeRO-3 适合全参超大模型,offload 适合“先跑起来”,sequence parallel 则适合长序列下分摊激活压力。

  • 问:为什么有时显存够了,训练速度却慢到不能接受?

    答:因为省显存的方法常常在用计算、通信或存储 IO 做交换,比如重计算、offload、频繁 all-gather,都可能把吞吐拖下来。

#8. 一套稳妥的显存优化回答框架

显存优化最好按这 5 层回答:

  1. 精度层FP32 -> BF16/FP16 -> INT8/INT4
  2. 状态层ZeRO/FSDP 切参数、梯度、优化器状态
  3. 激活层:checkpointing、sequence parallel、减少长序列
  4. 结构层LoRA/QLoRA、更小 batch、更短上下文
  5. 存储层:CPU/NVMe offload

这样答会显得你不是只会喊一个招,而是知道显存来源和对应打法。

#9. 通信与性能瓶颈专项

#高频面试题

  1. 为什么大模型多机多卡训练常常扩到一定规模后效率骤降?
  2. all-reduce 为什么会成为瓶颈?
  3. 为什么 TP 往往更依赖高速互联?
  4. PP 的 bubble(流水线气泡)是什么,怎么缓解?
  5. 为什么 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,而是看你是否理解:为什么同一个数学算子,不同实现速度差可以非常大。

#高频笔试题

  1. 算子融合为什么能提速?
  2. 为什么 FlashAttention 主要优化的是 IO 而不是数学公式?
  3. RMSNormsoftmaxGEMM 为什么经常是优化热点?
  4. 什么是 memory coalescing(访存合并)?
  5. shared memory / register / global memory 的速度层次关系是什么?

#就地速答

  • 问:算子融合为什么能提速?

    答:算子融合就是把原本多个相邻的小算子,合并成更少、更大的 kernel 来执行;它通常能提速,因为能减少 kernel launch 开销、减少中间结果反复写回显存,并提升整体访存效率。详见后文“### 37. 什么叫算子融合?为什么它能提速?”。

  • 问:为什么 FlashAttention 主要优化的是 IO 而不是数学公式?

    答:因为它没有把 attention 的理论复杂度从 O(n^2) 彻底变成别的量级,token 两两交互这件事仍然存在。详见后文“### 30. 为什么说 FlashAttention 的核心是 IO-aware,而不是 O(n^2) 变没了?”。

  • 问:RMSNormsoftmaxGEMM 为什么经常是优化热点?

    答:GEMM 是绝对大头,softmax/RMSNorm 虽然公式简单但调用频繁、常常受访存和同步限制,所以它们一起构成大模型里最值得抠性能的热点。

  • 问:什么是 memory coalescing(访存合并)?

    答:就是让相邻线程尽量访问连续内存地址,这样 GPU 能把多次小访问并成更高效的大访问。

  • 问:shared memory / register / global memory 的速度层次关系是什么?

    答:一般寄存器最快,其次是 shared memory / cache,global memory(HBM)最慢,所以高性能 kernel 都在想办法少碰 global memory。

#高频面试题

  1. 为什么很多大模型算子优化最后都在做“减少 HBM 访问”?

#就地速答

  • 问:为什么很多大模型算子优化最后都在做“减少 HBM 访问”?

    答:因为很多大模型算子真正慢的不是乘加本身,而是中间结果在高带宽显存和计算单元之间来回搬运。

  1. 什么叫算子融合?举一个 LLM 中的例子。
  2. 为什么 RMSNormsoftmaxattention 这些看起来简单的算子,优化难度反而很高?
  3. 你如何判断某个算子是 compute-bound 还是 memory-bound?
  4. 为什么说 FlashAttention 成功的关键之一是“不要显式 materialize 整个 attention matrix”?

#就地速答

  • 问:为什么 RMSNormsoftmaxattention 这些看起来简单的算子,优化难度反而很高?

    答:因为它们往往算术强度不高,却很吃访存模式、同步、数值稳定和 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 个词:

  1. 访存:减少不必要的 global memory 往返;
  2. 并行度:让更多线程块 / warp 真正吃满设备;
  3. 融合:减少 kernel launch 和中间结果落地;
  4. 重叠:尽量让通信、拷贝、计算并行发生。

#12. 这一块到底在考什么

真正考的不是你能不能背完整框架图,而是:

  1. 你是否知道大模型训练为什么必须分布式;
  2. 你是否能分清显存瓶颈、通信瓶颈、算力瓶颈;
  3. 你是否理解“放得下”和“跑得快”是两个不同问题;
  4. 你是否能把并行策略、显存优化、kernel 优化串成一条完整链路。

#13. 通信原语强化题单

这一组题非常像训练系统岗和 infra 岗的面试风格,因为它们直接检查你是否理解 collective communication(集合通信)到底在训练图里扮演什么角色。

#高频笔试题

  1. all-reduceall-gatherreduce-scatter 分别做什么?
  2. 为什么 reduce-scatter + all-gather 常被拿来替代一次完整 all-reduce 语义链路?
  3. ring all-reducetree all-reduce 各适合什么场景?
  4. 为什么 FSDP/ZeRO-3 经常需要 all-gather 参数?

#就地速答

  • 问:all-reduceall-gatherreduce-scatter 分别做什么?

    答:all-reduce 是各卡先提交自己的张量做规约,再让每张卡都拿到完整结果;all-gather 是把各卡分片拼成完整结果;reduce-scatter 则是先规约再把结果按分片发回各卡。详见后文“### 39. all-reduceall-gatherreduce-scatter 的区别是什么?”。

  • 问:为什么 reduce-scatter + all-gather 常被拿来替代一次完整 all-reduce 语义链路?

    答:因为很多分布式训练场景里,我们并不总需要“每一步立刻让每张卡都拿完整结果”。详见后文“### 40. 为什么 reduce-scatter + all-gather 经常一起出现?”。

  • 问:ring all-reducetree all-reduce 各适合什么场景?

    答:ring 往往更适合大消息、追求带宽利用率的场景;tree 往往更适合小消息或更关注低延迟的场景。

  • 问:为什么 FSDP/ZeRO-3 经常需要 all-gather 参数?

    答:因为每张卡平时只存参数分片,前向或反向真正算某一层之前,必须先把该层需要的完整参数临时拼出来。

#高频面试题

  1. 反向传播中,哪些通信最容易与计算重叠,哪些最难?
  2. 为什么有时候通信重叠做不好,反而会负优化?
  3. 如果 all-reduce 很慢,你第一反应会排查什么?
  4. 为什么 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(专家并行)专项

#高频笔试题

  1. expert parallel(EP)是什么?
  2. 为什么 MoE 比 dense 模型更容易遇到负载不均问题?
  3. 为什么 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 和整网放不下的问题,所以通常只能作为混合并行的一环。

#高频面试题

  1. 为什么在 MoE 里很多时候优先考虑 EP,而不是简单把专家层继续做 TP
  2. top-k 路由为什么会放大跨卡通信?
  3. capacity factor(容量因子)和 load balancing loss(负载均衡损失)分别在解决什么?
  4. 如果某些 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 与负载均衡专项

#高频笔试题

  1. pipeline bubble 是什么?
  2. 为什么 micro-batch 数量会影响 pipeline 利用率?
  3. 为什么 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 会让其他设备排队或空转,吞吐自然掉下来。

#高频面试题

  1. 如果 PP 训练很慢,你如何判断问题是 bubble 过大还是 stage 切分不均?
  2. 为什么增加 micro-batch 能减轻 bubble,但不能无限增大?
  3. 如果 embedding 层和最后输出头特别重,stage 应该如何切?
  4. 什么叫 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)专项

#高频面试题

  1. 为什么训练系统总在强调 overlap communication and computation?
  2. PyTorch DDP/FSDP 里通信重叠通常是怎么发生的?
  3. 为什么“计算太快、通信太小、显存太紧”时,通信重叠可能反而不划算?
  4. 如果一个系统说自己做了 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. 训练系统岗最爱问的排障题

  1. loss 抖得很厉害,但单卡小模型正常,你如何排查是并行切分问题还是数值问题?
  2. 多机训练吞吐忽高忽低,你先看数据加载、NCCL、还是 stage balance?为什么?
  3. 一换成 ZeRO-3/FSDP 就慢很多,你如何判断慢在参数 all-gather、offload、还是未重叠成功?
  4. 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. 用“训练状态”把显存来源拆清楚

如果你想把这块讲细,最有效的方式不是直接背框架,而是先把训练时到底在存什么拆开。大模型训练显存通常由下面五块组成:

  1. 参数(parameters):模型权重本身。
  2. 梯度(gradients):反向传播后得到,与参数形状相同。
  3. 优化器状态(optimizer states):以 Adam 为例,通常至少还有一阶、二阶矩,再加 master weights,往往比参数本身还大。
  4. 激活值(activations):前向中间结果,反向要用。
  5. 临时通信 / workspace / buffer:例如 all-gatherreduce-scatter、kernel workspace、bucket buffer。

这五块里,很多初学者最容易低估的是两点:

  • 优化器状态 在全参数训练里可能非常重;
  • 激活值 在长序列和大 batch 下会迅速成为主导。

所以不同优化手段,本质上是在打不同对象:

  • ZeRO/FSDP 更偏切参数、梯度、优化器状态;
  • checkpointing 更偏切激活;
  • TP/PP 更偏从结构上把模型放进更多卡;
  • 量化/低精度更偏整体缩小每个元素的字节数。

如果你一上来就把这五块讲清楚,后面再讲任何并行策略,逻辑都会非常稳。

#19. 官方实现视角下,FSDP2 到底怎么工作

这一块如果只说“FSDP 会把参数切开”,其实还不够。按 PyTorch 官方 FSDP2 教程,更准确的工作流是:

  1. 前向 / 反向计算之外:参数是分片存储的,每张卡只持有一部分参数。
  2. 前向前:需要当前模块计算时,把这一层对应参数 all-gather 成完整权重。
  3. 前向后:如果配置为 reshard_after_forward=True,这一层算完又重新切回分片,以降低峰值显存。
  4. 反向时:每张卡先拿到本地未切分梯度,再通过 reduce-scatter 变回分片梯度。
  5. 优化器更新时:优化器只更新本 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 像流水线一样交替做前向和反向。于是性能上关键就不只是谁负责哪些层,还包括:

  1. 一个 stage 是否足够忙;
  2. 不同 stage 计算量是否平衡;
  3. micro-batch 数是否足够把流水线灌满;
  4. 调度策略是 GPipe 还是 1F1B
  5. 激活通信和反向梯度通信是否平滑。

所以 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 模型怎么训练”,只回答“用分布式”太空了。更稳的说法是分层判断:

  1. 先问单卡能不能放下:通常不能,所以单靠 DP 不够。
  2. 如果是单机 8 卡高速互联:优先考虑机内 TP,把最重的矩阵算子切开。
  3. 如果跨多机扩展:通常让 TP 尽量留在机内,跨机再叠 FSDPDP,减少高频跨机层内通信。
  4. 如果层数很深或模型 stage 很自然:再考虑加 PP
  5. 如果显存还是扛不住:叠加 mixed precision、checkpointing、ZeRO/FSDP、必要时 offload。

所以一套比较真实的答法可能是:

  • 机内做 TP/SP
  • 机间做 FSDP
  • 如果规模再大,叠 PP
  • 再用 checkpointing 和 mixed precision 控显存。

这类回答的关键不是“唯一正确”,而是体现你知道:并行策略是按硬件拓扑分层落的,不是把名词乱拼起来。