第 9 讲总结 · 大规模并行训练的秘诀
本页把 导览 与 9.1–9.7 压成一张可复习的骨架。用法:先只看「核心问题」列做自问,答不全再读「关键结论」列,最后用「典型陷阱」列校核。
节一览
| 节 | 核心问题 | 关键结论 | 典型陷阱 |
|---|---|---|---|
| 9.1 问题设定:超过单卡容量 | 显存被什么占满了?「放不下」有几种? | 五账单 = 参数 + 梯度 + 优化器状态 + 主权重 (再加激活) 字节(方法 9.1.1),7B 即 GB;三堵墙(显存 / 算力 / 通信)联动,唯一可信验收指标是扩展效率 (定义 9.1.3) | 只算参数量、忘了 与主权重;把「放不下」笼统看成一个问题,不拆成模型状态 / 激活 / 单层三种情形 |
| 9.2 数据并行:从 DP 到 FSDP | 每卡一份完整副本为什么浪费?分片省多少、代价是什么? | 梯度同步用环状 All-Reduce,每卡 (bf16 下 )且与批大小无关(结论 9.2.1);ZeRO-1/2/3 逐级分片,8 卡下每卡模型状态 GB(例 9.2.3),通信依次「不变 / 减半 / 升至约 1.5×」 | 以为批越大通信越多(恰好相反);以为分片越彻底越好(ZeRO-3 通信更多、可能更慢) |
| 9.3 张量并行:把一层切开 | 单层放不下时怎么切?为什么列切与行切必须成对? | 列切免通信(分片留在输出)、行切一次 All-Reduce(部分和);「列切 → 逐元素激活 → 行切」使每块前后向各 1 次归约、且与并行度 无关(结论 9.3.1);注意力按头切天然对齐;通信密集 → 必须留在节点内 | 以为 TP 度越大单卡通信越小( 几乎不随 下降);跨节点硬上张量并行 |
| 9.4 流水线并行:把网络切成段 | 按层切分后卡为什么空转?怎么压掉? | 朴素调度气泡占比 (结论 9.4.1): 时 、, 才压到 10% 内;三种手段:增大 、交错调度(等效段数 )、zero-bubble(拆分反向);1F1B 不消气泡,但把峰值激活从 降到 | 以为 1F1B 消除气泡;以为气泡是通信造成的(它是调度造成的);以为 PP 能解决单层放不下 |
| 9.5 显存优化:混合精度、重计算与分片 | 不切模型能省多少?每种手段的代价是什么? | BF16 靠宽指数范围免损失缩放、FP16 必须缩放;混合精度把参数与梯度压到 又被 fp32 主权重 吃回,静态账不变;8-bit 优化器 (省 37.5%);全层重计算每 token 每层约 字节、额外约 前向;QLoRA 把 7B 压到 GB | 以为混合精度「白拿显存」;把 fp16 的损失缩放与 FP8 的逐张量缩放当一回事;把重计算当成能省参数显存 |
| 9.6 通信、容错与工程实践 | 通信量怎么估?万卡规模下坏了怎么办? | All-Reduce 、Reduce-Scatter / All-Gather 、P2P (定义 9.6.1);大消息看带宽、小消息看延迟,吞吐第一杠杆是重叠(分桶 / 预取 / 分块 / 融合);MTBF 随卡数线性缩短(8192 卡 小时);checkpoint 最优间隔由「期望故障损失」与「保存开销」共同决定(7B 约 56 s/次, 时约 7.5% 时间花在故障与保存上) | 只算通信量不算通信时间(漏了带宽与延迟);以为「能重启」就不用设计 checkpoint 策略与恢复一致性 |
| 9.7 动手:为 Lab 3 选一套并行策略 | 手上只有 1–8 张卡时究竟怎么配? | 五步决策:算账 → 是否分片 → 是否 TP/PP → 批大小与梯度累积 → 精度与重计算(方法 9.7.1);两条典型路径:单卡 QLoRA(静态 GB,预算留给激活)与 8×80 GB 的 DDP + ZeRO-2( GB/卡 + 、等效批 256);验收看「同样全局批下的 」与效果对照 | 照搬大厂配置;只调一个旋钮(批 / 累积 / 重计算要成套改);拿总吞吐当验收指标;把 LoRA 的秩 当显存旋钮 |
一条主线:本讲只有两个动作——「切」与「省」。因为混合精度 Adam 的模型状态是 (7B 就是 112 GB),单卡必然装不下(9.1);于是要么切:把数据切开(数据并行 → ZeRO / FSDP,9.2)、把一层内的矩阵切开(张量并行 + 序列并行,9.3)、把层切成段(流水线并行 + 1F1B,9.4);要么省:把每一项做小(混合精度 / FP8 / 8-bit 优化器 / 激活重计算 / LoRA-QLoRA,9.5)。但「切」立刻制造通信墙、气泡与故障面,所以必须把通信重叠、checkpoint 与容错、确定性当成与吞吐并列的设计目标(9.6);最后把两条线索落到自己手上的那台机器上(9.7)。
三句话带走
- 先算账,再选方案。 模型状态(,含 与主权重)与激活()是两本不同的账,处方不可互换:状态靠分片 / 低精度 / 8-bit 优化器 / offload,激活靠梯度累积 / 重计算 / 序列并行(方法 9.1.2)。诊断顺序按处方代价递增:先排除「模型状态放不下」,再看 OOM 出现在前向还是反向,最后才怀疑单层。
- 切分是买显存、卖通信。 环状 All-Reduce 每卡 且与批无关;ZeRO-1 通信不变、ZeRO-2 减半、ZeRO-3 升到约 1.5 倍;张量并行每层都要通信(32 层约 22 GB/卡/步,必须留在 NVLink 内);流水线并行通信最小(GB 量级以下)但要付气泡 。因此「分片越多越好」「并行度越大越好」「加卡一定更快」三句话都是错的。
- 验收只看两件事。 用同样的全局批比扩展效率 (单节点 8 卡常见 0.7–0.9,跨机遇瓶颈会掉到 0.5 以下),再用「微调前 vs 微调后」的效果对照证明收益;总吞吐翻倍而 减半的配置,等于没提速、只是多花了钱。
值得记住的十个可复算数字
| 数字 | 值 | 口径(必须连着说) |
|---|---|---|
| 7B 静态账单 | GB | 混合精度 Adam,含 fp32 主权重; 字节 |
| 8 卡 ZeRO 每卡状态 | GB | ZeRO-1 / 2 / 3,,同上口径 |
| 8-bit 优化器 | ,即 GB | 各压到 1 字节/参数,主权重仍 fp32 |
| 环状 All-Reduce 每卡流量 | GB | 7B、bf16 梯度( GB)、 |
| 同上跨机时间 | s | InfiniBand 400 Gb/s( GB/s),未减重叠、乐观下界 |
| 气泡占比 | ,;前反向等长是教学口径 | |
| 序列并行省下的激活 | GB/卡 | 、、、bf16、(LayerNorm 类 2 份口径) |
| QLoRA 7B 静态占用 | GB | 4 bit(NF4)主干 GB + 适配器 GB;双重量化的额外开销需实测 |
| checkpoint 保存时间 | s/次 | 分片写入 112 GB ÷ 聚合带宽 2 GB/s(128 卡共享) |
| 吞吐预期 | token/s/卡 | 单卡有效算力 FLOP/s、,仅用于判断量级 |
复习路线与验收
- 当天:合上书复述「一条主线」,并手算 7B 的 与 8 卡 ZeRO 三级;写不出就回 9.1.2 与 例 9.2.3。
- 隔天:做 习题集 A 组与 B 组前两题( 逐项、环状 All-Reduce),必须闭卷手写。
- 第 3 天:做 C 组,跑通每题的验收标准;把不通过的验收标准当成「哪一个环节没接上」的证据。
- 第 7 天:综合自测卷 闭卷计时一次;错题按文末漏点定位表回查,再用 回忆卡 补漏。
与后续的连接
- 动手:Lab 3 · 微调一个大语言模型 走「省」路线(QLoRA),9.7.5 排错清单 与 C 组习题 直接对它的 OOM 排查;9.7.6 配置对照表 是它的查表版本。
- 工具:工程工具箱 第四节「显存估算」是本讲账本的简化版,第五节「实验管理」对应 9.6.5 的「一次训练最小记录集」,第六节「性能与吞吐」对应 9.7.4 验收指标。
- 速查:速查背记卡 第 9 讲是本讲的压缩版(注意它用 9.1–9.9 的知识单元编号,与本节号不同);公式卡 与易混对照卡 用于考前速查;附录 C.18 给五账单的复算口径,附录 C.14 给 fp16 / bf16 与 loss scaling。
- 检验:闭卷回忆卡 → 习题集(A/B/C/D 四组)→ 综合自测卷;跨讲自测见 综合自测卷 与 面试与答辩竞技场(本讲的入场题集中在「显存账本 + ZeRO 三级 + 气泡公式」)。
- 闭环:目标对账用学习目标自检表——K9.x / S9.x / A9.x 全部「能」才算通过本讲;本讲是九讲的收尾,之后进入项目提案与答辩环节。