第 9 讲 · 综合自测卷(100 分 · 建议 60 分钟)
闭卷计时;做完先按文末评分标准自评,再按漏点定位表回查。 范围:本讲 9.1–9.7 与导览。题目与习题集尽量不重叠;第三部分与 B 组同源但不同题(代入的数字与追问不同),需要时可直接对照。 凡概念判断题,只写对错不给分,必须给理由或反例;凡涉及数字,必须带口径(精度 + 优化器 + 是否含主权重 + 卡数)。
时间分配建议:第一部分 12 分钟(每题约 70 秒)→ 第二部分 10 分钟 → 第三部分 25 分钟(每题约 8 分钟,推导宁慢勿跳步)→ 第四部分 13 分钟(每题约 6 分钟,四项都写)。留最后 2 分钟只做一件事:回头检查第一部分的十条判断里有没有只写了对错的。
- 0–12 分钟:第一部分 10 条判断。先写机制词、再写对错;卡住的条目立刻跳过(每题上限 90 秒),不要在一道判断上停留超过 2 分钟。
- 12–22 分钟:第二部分 5 题填空简答。这一步测的是「账本与公式的检索速度」;想不起就写占位符(如「逐项账:参数 14 / 梯度 14 / …」),回头再补。
- 22–47 分钟:第三部分 3 道推导。每题按「形状或账表 → 链条 → 代入 → 讨论」四段写,宁慢勿跳步;跳过账表的答案会被扣分。
- 47–58 分钟:第四部分 2 道开放题。只写四件套(方案 / 理由 / 失败判据 / 验证计划),不要写背景铺垫;每道 ≤ 5 分钟。
- 58–60 分钟:只做一件事——检查第一部分有没有「只写了对错」的条目,以及所有数字旁有没有口径。
- 判断必须带机制词:写「错」不给分,写「错,因为逐项账里主权重把省下的 吃回去了」才拿满。本讲常用机制词:主权重、批大小无关、reduce-scatter、all-gather、气泡、延迟主导、重叠、一致性。
- 数字必须带口径: GB 必须能拆成 并说明是「混合精度 + Adam + 含 fp32 主权重」;只说「112 GB」按半对计。
- 形状与账本先行:推导题先把形状 / 逐项账表写出来再动手;跳过账表核对的,从「链条完整」里扣分。
- 工程题给判据:凡涉及取舍(分片级数、重计算、并行度、checkpoint 间隔),必须写出验证方式与失败判据,否则第四部分上限 6 分。
- 开放题四件套:方案 + 理由 + 失败判据 + 验证计划,缺一项扣 2 分(每题 10 分)。
第一部分 · 概念判断(10 题 × 3 分 = 30 分)
1. 纯 fp32 Adam 与混合精度 Adam 的静态显存账都是 ,但两者的组成并不相同。
解答
对。 纯 fp32:参数 + 梯度 + (参数本身是 fp32,无需独立主权重);混合精度:参数 + 梯度 + + fp32 主权重 ——低精度参数上做小步更新会被舍入吃掉,所以必须另存一份高精度副本(方法 9.1.1)。7B 时两者都是 GB。给分:判断 1 分 + 说出「主权重 4N」2 分。
2. 数据并行能让每张卡装下更小的模型,所以它是显存受限时的第一选择。
解答
错,方向反了。 数据并行要求每卡都装得下完整模型状态();它让计算变快、批变大,不省显存。显存受限要看分片(ZeRO / FSDP)、低精度、8-bit 优化器或 PEFT(9.2.5 的判据表)。给分:判断 1 分 + 理由 2 分。
3. 梯度累积 次会把梯度通信量放大到 倍。
解答
4. ZeRO-2 的通信量约为基线的一半,原因是它用 reduce-scatter 替代了 All-Reduce。
5. 把张量并行度从 4 提到 8,每卡通信量也随之减半。
解答
错。 中的 是完整输出的大小,与 无关,所以每卡通信量几乎不变,变的只是消息更小、次数更多(延迟受限时反而更糟)(例 9.3.1)。给分:判断 1 分 + 指出「 与 无关」2 分。
6. 交错调度(virtual pipeline)把等效段数变成 ,气泡约按 下降,代价是段间通信次数增至 。
解答
对。 每张卡持有 个不连续的层块,于是任意时刻总有一块「可算」,原本的空档被填上;但边界数从 增到 (方法 9.4.1)。适用场景是「通信便宜、气泡贵」;段间通信已吃紧时应先恶化通信。给分:判断 1 分 + 至少一条代价 2 分。
7. 流水线并行的每卡每步通信量比数据并行小一个数量级,这是它有资格跨机的原因。
解答
对。 段边界传的是激活( 量级,几十 MB),每步每卡约 GB 以下量级;而 DDP 的梯度 All-Reduce 是 GB/卡/步(例 9.4.3)。代价转移到了气泡与调度复杂度上。给分:判断 1 分 + 量级对比 2 分。
8. 用 FP8 训练时必须把优化器状态也压成 8 位,否则省不了显存。
解答
错。 FP8 省的是「存 FP8 的那部分」(激活、部分权重副本);优化器状态与主权重仍是 fp32(),一分不减——与混合精度是同一个道理。同时 FP8 需要缩放管理与相应硬件(Hopper 及之后),配方需匹配(9.5.2)。给分:判断 1 分 + 「 不减」2 分。
9. 打开激活重计算可以降低优化器状态的显存占用。
解答
错。 重计算只管激活那半本账:前向只保存检查点激活,反向缺什么重算什么(全层额外约 前向,选择性只多个位数百分比)。模型状态要靠分片、低精度或 8-bit 优化器(定义 9.5.3)。给分:判断 1 分 + 「对象不同」2 分。
10. 多卡训练很难做到「逐位可复现」,根本原因之一在于浮点归约顺序随卡数与拓扑变化。
解答
对。 跨卡归约的实现顺序由拓扑决定,不同卡数下浮点求和顺序不同,结果在最低位就有差异,随后被放大;此外还有非确定性算子(原子加等)。工程上实际追求的是统计可复现(损失曲线形态一致)(方法 9.6.5)。给分:判断 1 分 + 至少一个来源 2 分。
第二部分 · 填空与简答(5 题 × 4 分 = 20 分)
11. 填空:、混合精度 Adam 下,逐项账单为参数 ___ GB、梯度 ___ GB、 ___ GB、 ___ GB、主权重 ___ GB,合计 ___ GB;换成 8-bit 优化器后合计 ___ GB。(每空 0.5 分;多写一句「为什么只省 37.5%」另得 0.5 分)
解答
12. 简答:环状 All-Reduce 为什么是「两遍」?每遍各做什么?写出每卡流量。
解答
第一遍 reduce-scatter:沿环转 轮,每轮发送 ,每一块的总和最终落在某一张卡上;第二遍 all-gather:把已算好的块沿环传开,每张卡收齐 块得到完整结果。两遍各 ,合计 (结论 9.2.1)。要点是「流量守恒」:每个字节至少要每张卡看见一次, 是下界,环状只用两倍下界且并发走满链路。
13. 简答:写出气泡占比公式,并用直觉解释 与 两个极限。
解答
(结论 9.4.1)。:首尾各 个时间片的填充 / 排空被足够多的 micro-batch 摊薄到零;:几乎全程只有少数几段在干活,气泡趋近 (等于白买卡)——这也是「加段必加 micro-batch」的来源。
14. 简答:三堵墙各写一条判据;再说明为什么「为了绕开显存墙而切分」会立刻加剧另一堵墙。
解答
判据:显存墙 ;算力墙 单步时间远大于 且 GPU 利用率高;通信墙 (定义 9.1.2)。切分把状态 / 层 / 数据散到更多卡上,但每张卡都要与别人交换中间结果(梯度、参数、激活),因此加卡同时缓解显存与算力墙、却加剧通信墙——于是最优卡数落在「算力墙还紧、通信墙还没到」的区间,验收只能用扩展效率 。
15. 简答:ZeRO-3 / FSDP 的「按需聚齐、用完即散」循环三步是什么?它换来了什么、付出了什么?
解答
三步:① 进入第 层前对该层参数做 all-gather,得到完整参数;② 计算;③ 立即释放完整副本(只保留分片),反向时再来一次 all-gather,算完梯度做 reduce-scatter(定义 9.2.4)。换来:每卡模型状态从 降到 (7B、8 卡即 GB),于是「放不下」变成「放得下」。付出:每层都要通信,净通信量升至约 1.5 倍,且预取需要多留参数分片(显存换重叠)——所以调优重点在「调书能否与读书重叠」。
第三部分 · 推导与计算(3 题 × 10 分 = 30 分)
16. (10 分)推导朴素调度下的气泡占比公式 ,写出三个步骤各在算什么;代入 、 求气泡率;再求「气泡 ≤10%」所需的 ,并解释为什么「加段(增大 )必须同时加 micro-batch」。
解答
(i)有效工作量:每个 stage 都要处理全部 个 micro-batch(前向一次、反向一次),折算为 个时间片。(ii)墙钟由末段决定:第 1 个 micro-batch 跑到末段要 个时间片,此后每 1 个时间片有下一个进入,故末段处理完 个需 ;反向对称且可部分重叠,故 (更严格的论证:第 段的启动延迟 ,任何 stage 完工时刻 ,故下界为 ,GPipe 把空闲压到最小取等号)。(iii)气泡 = 墙钟 − 有效:每卡空闲 ,占比 。 代入: → 。10% 条件:。 为什么加段必加 micro-batch:气泡的分子是 ,增大 直接抬高分子;而 、 时气泡变成 ,比 时翻了一倍多。因此「 的正确取法是刚好让每段放得下」,而不是越大越好(例 9.4.1)。 给分:三步推导 6 分(每步 2 分)+ 代入 2 分 + 与解释 2 分。
17. (10 分)推导环状 All-Reduce 的每卡通信量;代入 7B(bf16 梯度)、 算出流量与 InfiniBand( GB/s)下的时间;再算出 ZeRO-2 的 reduce-scatter 版本;最后说明「大消息看带宽、小消息看延迟」在 FSDP 上的体现。
解答
推导:张量切 块;reduce-scatter 阶段每卡发出 ,all-gather 阶段同样 ,故 (结论 9.2.1)。 代入: GB → GB/卡, s(未减重叠、未计延迟,是乐观下界)。 ZeRO-2 版本:只需自己那 份梯度 → reduce-scatter, GB → s,正好省一半。 大消息看带宽、小消息看延迟:跨机的 GB 级 All-Reduce 是秒级开销(),只能靠「更大的计算量摊薄」或「与计算重叠」隐藏;而 FSDP 每层的参数 all-gather 是 KB–MB 量级的小消息,受每次通信的固定延迟(握手、kernel 启动)支配——所以「把多个小消息打包成大消息」(梯度分桶)、参数预取与算子融合都能显著提速(例 9.6.1、方法 9.6.1)。 给分:推导 4 分 + 两处代入 3 分(24.5 GB/0.49 s、12.25 GB/0.25 s)+ 大小消息判据 2 分 + 与 FSDP/分桶的联系 1 分。
18. (10 分)硬件 8 × 80 GB(同节点)。模型 、、、、,混合精度 Adam。(1) 求 ZeRO-1 / 2 / 3 每卡模型状态;(2) 目标等效批 256, 时求 ,并估算激活量级;(3) 判断是否需要 TP / PP,并说明理由;(4) 给出你的最终配置与一条验收指标。
解答
(1) ZeRO-1: GB;ZeRO-2: GB;ZeRO-3: GB(例 9.2.3)。
(2) 。激活按「每 token 每 hidden 元素约 34 字节」口径: 字节 GB(例 9.1.2; 这一项不能漏)。
(3) 都不需要。 单层最大是 FFN: 参数,bf16 下 GB,单卡轻松放下 → 不需要 TP;显存问题被 ZeRO-2 解决、层数也不是瓶颈 → 不需要 PP。配平原则是先满足硬约束(显存 / 整除性 / 拓扑)再优化软目标,同节点时越简单风险越低(方法 9.6.4)。
(4) 推荐配置:DDP × ZeRO-2(8 卡同节点),bf16 参数与梯度 + fp32 主权重(不开 fp16、不需要损失缩放),、、等效批 256,重计算先关(激活紧张再开 selective),AdamW + 学习率线性缩放 ×4 + warmup 3%,分片 checkpoint 每 500–1000 步。验收指标:用同样的全局批测扩展效率 (并用 max_memory_allocated 对账 GB 与留 15%–30% 余量)。
给分:(1) 3 分 + (2) 2 分 + (3) 2 分 + (4) 3 分(配置 2 分、验收指标 1 分)。
第四部分 · 开放题(2 题 × 10 分 = 20 分)
19. (10 分)场景:只有一张 24 GB 卡,要在一个 7B 级开源模型上做指令微调,数据量中等、不能上多卡。给出方案,并写清理由、失败判据与验证计划。
解答
方案:QLoRA——4 bit(NF4)主干 + 低秩适配器(、target_modules=[q_proj, v_proj]、lora_alpha=16、bf16 计算),max_length 从 1024 起手, 用梯度累积把等效批凑到 64–128,选择性重计算按需开。
理由(必须给出账):全参混合精度 Adam 的模型状态 GB、8-bit 优化器 GB,单卡都放不下;QLoRA 下主干以 4 bit 驻留 GB,适配器只有 4.2M 参数(,五账单合计 GB)→ 静态 GB,24 GB 卡上还剩约 20 GB 给激活、KV cache 与临时张量(例 9.5.4、定义 9.5.5)。被彻底绕开的是主干的梯度与优化器状态(),它们正是基线里最贵的部分。
失败判据:① 训练侧 OOM(先降 max_length,再降 并用 补等效批);② 可训参数比例 >0.5%(说明 target_modules 挂多了,显存与容量都跑偏);③ 效果不达标且提高 后仍无改善 → 说明任务需要满秩更新,此时应回到全参 + 分片,而不是继续加秩;④ 峰值显存逼近上限(>80%)时任何「调大序列」的尝试都先被否决。
验证计划:先小模型 + 小数据跑通 10 步(只验链路:分词、mask、保存)→ 用 9.7.4 的四个指标建基线(峰值显存 / 每步耗时 / token/s / 效果)→ max_length 512 → 1024 → 2048 扫一遍记录峰值与 token/s → 做「微调前 vs 微调后」的效果对照(固定问题集与解码参数)→ 报告里写清权重口径与结论三行。
给分:方案具体 4 分 + 账本数字 2 分 + 失败判据 2 分 + 验证计划 2 分。
20. (10 分)场景:8192 卡、计划训练 30 天。设计容错方案,并给出 checkpoint 间隔的定量依据;说明你会用什么判据判断「这套容错是失败的」。
解答
方案:① 检错——NCCL 超时 + 健康检查(小 all-reduce + 矩阵乘自测),目标是把「哪张卡坏了」在几分钟内定位,而不是整机挂掉才发现;② 恢复——分片 checkpoint + 完整元数据(分片布局、优化器步数、已消费样本数、随机状态、学习率调度器位置);③ 弹性——坏卡就绪后重配进程组继续(各框架支持度不同,需核实);④ 静默损坏——周期性抽样校验(手工计算的损失值 / 梯度范数是否落在期望范围);⑤ 确定性——固定数据顺序与种子,让「恢复后」与「未中断」等价(方法 9.6.3、方法 9.6.5)。
定量依据:/小时(量级,需核实)→ MTBF 小时,即约每 1.7 天中断一次、30 天内约 18 次;分片保存一次 s;/小时时
取 h 时 分钟/小时 ——与「每 2 小时存一次」的 同量级,说明该规模下保存开销与故障损失相当,两者都要计入预算。硬约束:恢复时间必须远小于间隔;故障呈批次性时先修机器。
失败判据:① 每小时额外时间 >8%;② 恢复后一致性校验失败(步数 / 数据流 / 随机状态对不上)——「悄悄换了实验条件」比丢进度更危险;③ 演练中恢复时间 > 间隔的 10%;④ 静默损坏抽样始终无法与基准对齐(说明对照基准本身不可靠)。
验证计划:小规模故障注入演练(kill 一个 rank,测恢复时间与一致性)→ 每 100 步记录「已消费样本数 + grad_norm」作为一致性证据 → 用 2× 规模对照训练确认「恢复后曲线」与「不中断曲线」在预期噪声内(例 9.6.3、9.6.4)。
给分:方案覆盖检错 / 恢复 / 弹性 / 静默 / 确定性 4 分 + 定量间隔 3 分 + 失败判据 2 分 + 验证计划 1 分。
交卷前 30 秒自检(四个必查项)
| 检查 | 一句话判据 |
|---|---|
| 数字带口径了吗? | 写下 GB 时,旁边必须出现「混合精度 + Adam + 含 fp32 主权重」;只写数字按半对计 |
| 通信量写的是哪个式子? | 代入计算用 ,口算用 ;写 却说「这就是 24.5 GB」是错的 |
| 气泡题代入选值了吗? | 只写 不给分,必须写出 与 各取多少、结果是多少 |
| 开放题有四件套吗? | 方案 / 理由 / 失败判据 / 验证计划——缺一项扣 2 分 |
评分标准
| 部分 | 题量 | 分值 | 给分要点 |
|---|---|---|---|
| 一 · 概念判断 | 10 | 30 | 判断 1 分 + 理由 / 反例 2 分;只写对错得 1 分 |
| 二 · 填空简答 | 5 | 20 | 每空 / 每个要点 0.5–1 分;数字必须带口径,否则按半对计 |
| 三 · 推导计算 | 3 | 30 | 账表或形状先行 3 分 + 链条完整 4 分 + 代入正确 2 分 + 前提与讨论 1 分;只写结论最多 3 分 |
| 四 · 开放题 | 2 | 20 | 方案具体 4 分 + 账本数字 2 分 + 失败判据 2 分 + 验证计划 2 分 |
段位换算: 优秀(可以给同学讲清 ZeRO 与气泡); 良好(能独立写出并行配置); 及格(需补推导与账本); 回到对应节的「即时自测」与习题集重做。
自评纪律:① 判断理由必须包含关键机制词(主权重、批大小无关、reduce-scatter、all-gather、延迟主导、一致性……),否则按半对给 1 分;② 推导题凡是跳过账表 / 形状核对的,从「链条完整」里扣 1 分;③ 凡把正文标「需核实」的数字(34 / 18 / 2 字节、1.5× 通信、offload 慢化倍数)当绝对值报价且不加限定的,第三部分扣 1 分;④ 开放题只写方案不写失败判据的,第四部分上限 6 分。
漏点定位表
| 错题 | 回去读 | 立刻补做 |
|---|---|---|
| 1、11 | 方法 9.1.1、例 9.1.1、例 9.5.1、附录 C.18 | 习题集 A1、B1、C1 |
| 2、4、5、15 | 定义 9.2.1、定义 9.2.3、定义 9.2.4、方法 9.2.2 | 习题集 A4、A5、B6、C4 |
| 8、9 | 定义 9.5.2、定义 9.5.3、方法 9.5.1 | 习题集 A8、C5 |
| 7、12、17 | 结论 9.2.1、例 9.4.3、定义 9.6.1、方法 9.6.1 | 习题集 B2、B4、C6 |
| 6、13、16 | 结论 9.4.1、方法 9.4.1、例 9.4.1 | 习题集 B3、D2 |
| 3、14 | 9.1.4、定义 9.1.2、定义 9.2.2、例 9.2.1 | 习题集 A3、C3 |
| 5、18 | 例 9.3.1、方法 9.3.2、例 9.7.2 | 习题集 C1、D1 |
| 10、20 | 9.6.3、方法 9.6.2、9.6.4、方法 9.6.5 | 习题集 B5、D4 |
| 19 | 9.5.5、例 9.5.4、9.7.3、9.7.5 | 习题集 C5、D3 |
最后一句:本卷的目的不是打分,而是把你以为会的地方暴露出来。凡「写得出来但讲不清机制」的题,回到对应节的 intuition 与回忆卡当天再练一遍;连续两轮仍错的条目,写进勘误与补注第四节的待核实条目单独跟踪。
自评记录表(抄在纸上,比分数更重要)
| 部分 | 得分 | 错题号 | 错因分类(概念 / 账本 / 推导 / 设计) | 下一步动作 |
|---|---|---|---|---|
| 一 · 概念判断 | /30 | |||
| 二 · 填空简答 | /20 | |||
| 三 · 推导计算 | /30 | |||
| 四 · 开放题 | /20 | |||
| 合计 | /100 |
四种典型错因的处方:
- 错因集中在「概念」 → 回回忆卡 的 D 组(陷阱卡)当天补;本讲的陷阱几乎都长一个样:「把两本不同的账混成一本」或「把两个不同的手段当成可互换」。
- 错因集中在「账本」 → 把 习题集 C1 的估算脚本跑一遍,让五账单与 ZeRO 三级跑出来而不是背下来;再手算一次 、 的三级账作为交叉验证。
- 错因集中在「推导」 → 按 B3 的三步重推气泡公式、按 B2 的两阶段重推环状 All-Reduce,两条各写三遍;写完后立刻套进 例 9.4.1 与 例 9.2.2 对答案。
- 错因集中在「设计」 → 回 9.7.5 排错清单 与 习题集 D 组,用「只改一个变量」的方式把方案重写一遍,并补上失败判据与验证计划。