
第4章 并行策略与自动并行搜索
并行策略决定了一个模型如何在 N 张 GPU 上分布——这是显存 vs 通信 vs 计算三者的权衡。本章覆盖从手工并行(DP/TP/PP/ZeRO/FSDP/CP)到自动并行搜索(Alpa/Galvatron/Unity/TorchTitan)的完整谱系。
4.1 数据并行(DP/DDP)
PyTorch DDP 在构造时创建本地 Reducer,将参数梯度组织成 buckets,按 bucket 逐个 reduce。桶大小由 bucket_cap_mb 控制(默认 25MB)。参数按 Model.parameters() 的逆序分配到桶中,因为反向传播中梯度大致按此顺序就绪 [A]。反向传播时,每个参数注册的 autograd hook 在梯度就绪后触发,启动对应 bucket 的 all-reduce,实现通信与计算重叠。DDP 与 TorchDynamo(torch.compile)配合时,先 wrap DDP 再 compile,Dynamo 的 DDPOptimizer 基于 bucket 大小做图优化。
4.2 ZeRO:Zero Redundancy Optimizer
核心论文:Rajbhandari et al., “ZeRO: Memory Optimizations Toward Training Trillion Parameter Models,” SC 2020 [B]。开源代码:github.com/microsoft/DeepSpeed。
三阶段分片策略:
- ZeRO-1(优化器状态分片):将 Adam 优化器状态(FP32 master weights 4P + momentum 4P + variance 4P = 12P bytes)按数据并行度 N 分片。每卡仅更新自己负责的部分,再 all-gather 广播。显存节省 4×;
- ZeRO-2(+梯度分片):在 ZeRO-1 基础上,16-bit 梯度也分片存储,仅保留对应优化器状态部分的梯度。再节省 2×;
- ZeRO-3(+参数分片):16-bit 模型参数也分片。前向/反向时自动 all-gather 收集、用完即释放。总显存从标准 DP 的 16P bytes 降至 ~2P/N bytes(N = DP 度)。
显存公式(混合精度 + Adam):每参数 16 bytes = 参数(FP16, 2B) + 梯度(FP16, 2B) + FP32 master copy(4B) + momentum(4B) + variance(4B) = 16P bytes/GPU。ZeRO-3 后降至 ~2P/N bytes/GPU [A]。
4.2.1 ZeRO-Offload / ZeRO-Infinity / ZeRO++
ZeRO-Offload(arXiv:2101.06840):将优化器状态和梯度卸载到 CPU,参数和前向/反向计算保留在 GPU。单 V100 可训练 13B 参数模型,吞吐 40 TFlops/GPU。三流异步架构:GPU 计算流 + CPU-GPU 传输流 + CPU 计算流,重叠隐藏 ~95% 传输延迟。
ZeRO-Infinity(arXiv:2104.07857):利用 GPU + CPU + NVMe 三级存储,支持训练数十到数百万亿参数模型。引入 memory-centric tiling(将大层切分为小块逐块计算,免去 TP 改写模型代码)和 bandwidth-centric partitioning。在 512 V100 上达 25+ PFLOPS(40% peak),支持超线性扩展,可在单 DGX-2 节点微调万亿参数模型。
ZeRO++(arXiv:2306.10209):三项技术:(1) ZHO(量化权重 all-gather, qwZ)block-quantized INT8 权重,all-gather 通信量减 50%;(2) ZHI(层级分区, hpZ)节点内二级权重分区,消除反向传播中跨节点 all-gather;(3) ZGD(量化梯度 reduce, qgZ)all-to-all + INT4 量化梯度聚合,替代 reduce-scatter,梯度通信减 75%。总通信量降 4×,端到端吞吐提升 2.4×(384 GPU 规模)[B]。
4.3 FSDP:Fully Sharded Data Parallel
| 特性 | FSDP1 (FullyShardedDataParallel) | FSDP2 (fully_shard) |
|---|---|---|
| 分片表示 | flat-parameter(展平+拼接+切块) | DTensor dim-0 per-parameter sharding |
| 内存管理 | record_stream(非确定性) | 不用 record_stream,确定性内存 |
| 冻结参数 | 需额外内存处理 | 同组混合冻结/非冻结无需额外内存 |
| State Dict | 全量需 all-gather | 分片 state dict 无通信 |
| API | 包装式(wrap module) | 原地类型修改(type(model) unioned with FSDPModule) |
FSDP2 使用 torch.chunk(dim=0) 按参数维度 0 分片,参数表示为 DTensor(Shard(0) placement)。reshard_after_forward=True(默认):前向后释放未分片参数,反向前重新 all-gather;梯度计算后 reduce-scatter 到分片梯度。Meta init:模型先在 meta device 上创建(不消耗实际内存),再分片并用真实参数初始化,使超出单卡显存的模型初始化成为可能 [A]。FSDP2 与 ZeRO-3 的关系:FSDP2 是 PyTorch 原生实现,功能等价于 ZeRO-3(参数 + 梯度 + 优化器状态全分片),但用 DTensor 提供更好的可组合性和更简单的初始化流程。
4.4 张量并行(TP):Megatron-LM
核心论文:Shoeybi et al., arXiv:1909.08053(2019)[B]。
- ColumnParallel:权重矩阵 A 按列切分,每卡持 A_i,输出
Y = GeLU(X·A_i)局部计算,GeLU 可在各卡独立执行; - RowParallel:权重矩阵 B 按行切分,各卡局部结果
Y_i = GeLU(X·A_i)·B_i,AllReduce 求和得最终输出; - MLP 层:先 ColumnParallel 再 RowParallel → 中间无需通信,一层只需 1 次 AllReduce(前向)+ 1 次(反向)= 每层 2 次 AllReduce;
- Attention 层:Q/K/V 投影按注意力头切分(等价 ColumnParallel),输出投影 RowParallel + AllReduce;
- 通信量:每次前向 AllReduce 通信量 =
2 × batch × seq × hidden_size。TP 适合节点内 NVLink 高带宽环境,TP=4–8 是实践最优区间。
4.4.1 Sequence Parallel (SP)
论文:Korthikanti et al., arXiv:2205.05198(2022, “Reducing Activation Recomputation in Large Transformer Models”)[B]。将 LayerNorm/Dropout/residual 等未被 TP 切分的操作沿序列维度切分,激活内存降 TP 倍。f 操作变为 AllGather(前向)/ ReduceScatter(反向),g 操作变为 ReduceScatter(前向)/ AllGather(反向)。总通信字节数不变(AllReduce = ReduceScatter + AllGather),但峰值激活内存降低。配合 selective activation recomputation,激活内存降 5×,530B 模型 MFU 从 42.1% 提升至 54.2%。
4.4.2 FlashAttention-3
论文:arXiv:2407.08608(NeurIPS 2024 Spotlight)[B]。三项 Hopper GPU 优化:(1) warp-specialization 异步重叠 Tensor Core/TMA 数据传输与计算;(2) 交错 block-wise GEMM 与 softmax;(3) block 量化 + incoherent processing 支持 FP8。FP16 达 740 TFLOPS/s(75% H100 利用率),FP8 达 ~1.2 PFLOPS/s,FP8 误差比基线低 2.6×,比 FA2 快 1.5–2.0×。
4.5 流水线并行(PP)
| 调度 | 气泡公式 | 激活内存 | 论文 |
|---|---|---|---|
| GPipe | (P-1)/(M+P-1) | ∝ M(高) | arXiv:1811.06965 NeurIPS 2019 |
| 1F1B | (P-1)/(M+P-1) | ∝ P(低) | PipeDream, OSDI 2019 |
| Interleaved 1F1B | ~1/v × (P-1)/(M+P-1) | ∝ P×v | arXiv:2104.04473 SC 2021 |
| Zero Bubble | (P-1)(F+B-2W)/M → 0 | ∝ P(可控) | arXiv:2401.10241 ICLR 2024 |
| DualPipe | (P/2-1)(F&B+B-3W) | 2×P+1 | arXiv:2412.19437 DeepSeek-V3 |
- GPipe:全部前向完成后统一反向,激活内存与 micro-batch 数 M 成正比。气泡率 = (P-1)/(M+P-1),M ≫ P 时趋近 0;
- 1F1B(PipeDream):warm-up 后每卡交替 1 次 forward + 1 次 backward,峰值在飞 micro-batch 数 = P,激活内存仅与 P 成正比。权重版本管理解决 staleness 问题;
- Interleaved 1F1B(Megatron-LM v2):每卡负责 v 个非连续 virtual stage,气泡降为 1/v。GPT-3 175B 复现中 P=16, M=32 时气泡率仅 4.1%;
- Zero Bubble(ZB):将反向拆为 B(input gradient,下游依赖)和 W(weight gradient,可延后),重排 F/B/W 使气泡降到理论 0。吞吐比 1F1B 提升 23%(等内存)/ 31%(放松内存约束)。开源:github.com/sail-sg/zero-bubble-pipeline-parallelism;
- DualPipe(DeepSeek-V3):双向流水,两股反向数据流交错执行前向/反向,将 MoE all-to-all 通信隐藏到计算背后。气泡因子从 (P-1) 降到 (P/2-1),约为 1F1B/ZB1P 的一半。代价:每 rank 持有 2 份参数副本(适用 MoE 稀疏结构)。H800 上划 20/132 个 SM 专门做通信(自写 PTX 级 kernel,非 NCCL)。DualPipeV 变体将激活内存降至 PP/2。
*来源:DeepSeek-V3 Technical Report arXiv:2412.19437、DualPipe GitHub、Zero Bubble arXiv:2401.10241、Megatron-LM v2 arXiv:2104.04473 B*
4.6 3D并行与序列并行
Megatron 3D 并行(DP×TP×PP),论文 arXiv:2104.04473(Narayanan et al., SC 2021)[B]:N = DP × TP × PP。TP 放节点内(NVLink),PP 跨节点(IB P2P),DP 为最外层。通信模式:TP = 每层 AllReduce(频繁,需 NVLink);PP = stage 间 P2P send/recv(量小,跨节点友好);DP = 每 batch 梯度同步 AllReduce(量大但频率低)。
Context Parallel(Ring Attention),Liu et al. 2023:序列切分为块,KV 块在环形拓扑上轮转,每卡算局部 attention 后传 KV 到下一节点。通信量 O(n·d)/GPU(P-1 跳 P2P),不受 head 数限制,支持百万级 token,无并行度上限。
DeepSpeed Ulysses:在 attention 内部做 all-to-all:将 (B, S/P, H) → (B, S, H/P),每卡算完整序列的部分 head,再 all-to-all 换回。通信量 O(n·d/P)/GPU,比 Ring Attention 少 P 倍。并行度受 attention head 数限制(Parallelism ≤ Heads),需高带宽低延迟互联。
4.7 专家并行MoE
Expert Parallel(EP)通信模式:流程 token routing → all-to-all dispatch → local expert 计算 → all-to-all combine。通信量 = 2 × batch × seq × d_model × sizeof(dtype) per layer。每层有独立的 all-to-all,不同 MoE block 之间不直接通信(强局部性)。
DeepSeek MoE(V3):671B 总参数,37B active/token。256 个细粒度 routed expert + 1 shared expert,top-8 routing。EP=64(8 节点),PP=16,ZeRO-1。2048 H800 GPU。无辅助损失的负载均衡(complementary sequence-wise bias)。总训练成本 2.788M H800 GPU 小时 [B]。
Mixtral 8x7B:46.7B 总参数,12.9B active/forward(8 expert, top-2)。EP 配置示例:DP=36, TP=4, PP=1, EP=8,总 1152 GPU。EP=8 时每 expert 独占一个设备组,消除 expert 内 all-to-all。
4.8 自动并行策略搜索
4.8.1 Alpa (OSDI 2022)
论文:Zheng et al., “Alpa: Automating Inter- and Intra-Operator Parallelism for Distributed Deep Learning,” OSDI 2022, pp. 559–578 [B]。开源:github.com/alpa-projects/alpa。
层级化搜索:
- Intra-operator pass(算子内并行):用**整数线性规划(ILP)**为每个算子搜索最优分片策略(DP/TP/EP),目标函数 = 计算 + 通信 cost(node cost)+ 重分区通信 cost(edge cost),one-hot 变量枚举分片策略;
- Inter-operator pass(算子间并行):用**动态规划(DP)**将计算图切分为子图、设备集群切分为 submesh,最小化总执行延迟。先 flatten 计算图,枚举所有可能的设备集群分区,分析性能后 DP 求最优;
- Runtime orchestration pass:生成静态执行计划,排序计算和通信,在真实设备上执行。
评估:8×AWS p3.16xlarge (64 V100),GPT 上匹配 Megatron-LM;GShard MoE 上比 DeepSpeed 快 9.7×;WideResNet 上自动发现非平凡策略。编译时间随模型大小线性增长,GPT-39B 在 64 GPU 上编译 <40 分钟,可通过搜索空间剪枝再降 50%。
4.8.2 Galvatron / Galvatron-BMW (VLDB 2023)
论文:Miao et al., “Galvatron: Efficient Transformer Training over Multiple GPUs Using Automatic Parallelism,” VLDB 2023。BMW 版本:arXiv:2307.02031 [B]。
- 决策树搜索空间:将 DP/SDP(Sharded DP)/TP/PP 组合表示为决策树,每层对应一种并行方式,不可重复。8 卡场景从数百种候选降至 22 种(剪枝规则:禁止 DP+SDP 同时使用等);
- 动态规划优化:外层逐步增加 batch size;对每种 PP 划分,构建决策树生成候选策略集 S;用 DP 在内存约束下为每个模型阶段搜索每层最优混合策略。复杂度 O(L·E·|S|);
- 混合代价建模:内存 = 张量形状 × dtype 理论计算;计算时间 = 单设备 profiling + 拟合;通信时间 = 通信量 ÷ 实测带宽。纳入计算-通信重叠对 GPU 利用率的影响。
4.8.3 FlexFlow (MLSys 2019) 与 Unity (OSDI 2022)
FlexFlow 论文:Jia et al., arXiv:1807.05358 [B]。SOAP 搜索空间:Sample(数据并行)、Operator(算子间)、Attribute(特征维度)、Parameter(模型并行)。MCMC 搜索:Metropolis-Hastings 随机搜索,每次随机改变一个算子的并行配置,用执行模拟器(基于 Dijkstra 变体的 delta simulation)快速评估代价,接受/拒绝新策略。比 SOTA 快 3.3×。
Unity 论文:Unger et al., OSDI 2022, pp. 267–284 [B]。统一并行计算图(PCG):将代数变换和并行化统一为图替换(substitution),用 Z3 定理证明器验证正确性。层级化搜索算法联合优化两者,比现有框架快 3.6×(192 GPU),优化时间 <20 分钟。
4.8.4 PyTorch DTensor / TorchTitan
论文 arXiv:2410.06511 [B]。DTensor + DeviceMesh作为统一抽象:DeviceMesh 是 N 维网格,每轴对应一种并行类型;DTensor 持有全局 shape 和 sharding 元数据,自动分片传播和 collective dispatch。TorchTitan 支持 1D→4D 可组合并行:FSDP2(1D)→ +TP/SP(2D)→ +PP(3D)→ +CP(4D)。Llama 3.1 8B/70B/405B 在 128/256/512 GPU 上加速 65%/+12.6%/+30%。PP 调度支持:1F1B, GPipe, Interleaved 1F1B, ZeroBubble, Flexible Interleaved 1F1B。Float8 训练、SymmetricMemory、AsyncTP、区域编译(torch.compile on TransformerBlock)等硬件协同优化。
4.8.5 其他自动并行系统
- Auto-MAP(Alibaba, 2020):在 HLO IR 上用 Linkage Group 剪枝搜索空间,用 DQN(Rainbow DQN)RL 搜索 DD/MP/PP 策略(arXiv:2007.04069);
- GSPMD(Google):用简单 tensor sharding annotation 统一表达不同并行范式,基于 XLA/GSPMD;
- 自动并行策略规划算法(arXiv:2501.00254):将训练时间解耦为计算、通信、重叠三部分建立仿真模型,剪枝搜索空间,多节点实验中训练时长估计准确率 96%。
4.9 核心搜索算法总结
| 算法 | 使用系统 | 适用场景 |
|---|---|---|
| 整数线性规划(ILP) | Alpa (intra-op) | 算子内分片策略,精确求解 |
| 动态规划(DP) | Alpa (inter-op), Galvatron, Tofu | 流水线切分,阶段间最优分配 |
| MCMC(Metropolis-Hastings) | FlexFlow | 大搜索空间随机优化 |
| 层级化搜索 | Unity, Alpa | 联合代数变换+并行化 |
| 决策树剪枝 + DP | Galvatron | 混合并行策略空间缩减 |
| RL(DQN/Rainbow DQN) | Auto-MAP | 自适应并行策略选择 |
| 执行模拟器 + delta simulation | FlexFlow | 快速评估候选策略代价 |
| profile 启发式 | Galvatron, Auto-Parallel Planner | 实测计算/通信时间建模 |
| ILP + DP 组合 | Alpa | 两层级联:intra-op ILP → inter-op DP |
搜索空间复杂度:给定 L 层模型、N GPU、K 种并行方式,朴素组合空间 = K^L × C(N, 分区方式)。Alpa/Galvatron 通过层级分解和剪枝将指数空间降至多项式可解。Alpa 的 ILP 求解在 64 GPU 上可在分钟级完成。
第5章 智能调度与资源管理算法
"把 N 张 GPU 调度给 M 个作业"看似简单,但当作业是万卡级训练任务、且要求 gang all-or-nothing、拓扑亲和、弹性伸缩、多租户公平时,它就变成了一个 NP-hard 的组合优化问题。本章梳理从 K8s/Slurm 基础调度到 Pollux/AntMan/Varuna 智能调度的演进。
5.1 拓扑感知调度
5.1.1 Kubernetes Topology Manager
K8s kubelet 级别的 Topology Manager 协调 CPU Manager、Memory Manager、Device Manager,做出 NUMA 最优分配。四种策略:none(默认)、best-effort(尽力对齐不阻塞)、restricted(不满足拓扑则 Pod 进入 Terminated)、single-numa-node(所有资源必须来自同一 NUMA)。Scope 可选 container(默认)或 pod(所有容器共享 NUMA hint)。需配合 cpuManagerPolicy: static + memoryManagerPolicy: Static + reservedMemory 才能实现完整内存对齐 [A]。
5.1.2 HAMi(原 k8s-vgpu-scheduler)
CNCF Incubating 项目,通过 CUDA API 劫持(libvgpu.so + LD_PRELOAD)在软件层实现显存/算力双隔离。四层组件:MutatingWebhook(准入)、Scheduler-Extender(调度)、Device Plugin(设备注册)、HAMi-Core(运行时隔离)。支持 nvidia.com/gpumem(显存 MB)和 nvidia.com/gpucores(算力百分比)扩展资源。200+ 企业生产使用。支持 Binpack/Spread 双维度策略 [A]。
5.1.3 Volcano Gang Scheduling
CNCF 批处理调度器,提供 Job/Queue/PodGroup 抽象。minAvailable 实现 all-or-nothing 调度,支持 backfill、preemption、DRF fair-share、拓扑亲和。PodGroup 可让标准 K8s Job 获得 gang 语义。支持 schedulerName: volcano + PriorityClass 抢占 [A]。
5.1.4 NVIDIA MPS / MIG / Time-Slicing
| 共享方式 | 隔离 | 上下文切换 | 适用场景 |
|---|---|---|---|
| Time-Slicing | 无(软件级时间片轮转) | ~25μs | 开发/低并发 |
| MPS | 部分(kernel 并发执行) | 无(空间共享) | 多进程并发推理 |
| MIG | 完全(硬件级切分) | 无 | 生产推理/故障隔离 |
MIG(Multi-Instance GPU)Ampere+ 硬件级切分,最多 7 实例,每个实例独立 SM/HBM/L2 cache,故障完全隔离,作为 K8s 扩展资源 nvidia.com/mig-1g.10gb [A]。
5.1.5 Slurm GRES
Slurm 通过 GRES(Generic Resource)管理 GPU。GresTypes=gpu,mps + gres.conf 配置设备。--gpu-bind=closest 实现 GPU-CPU NUMA 亲和。支持 MIG 细粒度切分调度(--gres=gpu:1g.5gb)。AutoDetect=nvml 自动检测 [A]。
5.2 弹性训练调度
5.2.1 PyTorch Elastic / TorchRun
torchrun 提供容错和弹性训练。支持 --nnodes=1:8(弹性范围)、--max-restarts、--rdzv-backend=c10d。节点加入/退出时,所有 worker 被 kill 并以新 RANK/WORLD_SIZE 重启。RANK 不稳定,不可硬编码。支持 --numa-binding NUMA 绑定。快照需保存 model state + optimizer state + epoch [A]。
5.2.2 Pollux (OSDI 2021)
提出 goodput 指标(结合系统吞吐量与统计效率),co-adaptive 调度同时动态调整资源分配和训练超参(batch size、学习率)。相比最优固定配置调度器平均 JCT 减少 37–50%。开源:github.com/petuum/adaptdl [B]。
5.2.3 AntMan (OSDI 2020)
阿里生产系统。Dynamic Memory Scaling(监控显存使用、动态设限、burst 时 swap 到 CPU)+ Opportunistic Computation Management(GpuOpManager 在空闲 slot 启动 opportunistic job kernel)。训练 job mini-batch 短且模型小,适合共享 [B]。
5.2.4 Varuna (EuroSys 2022)
微软。支持 spot VM 动态伸缩,通过 profile-driven simulator 自动选择最优并行配置(P×D)。自适应 batch size,支持 2.5B–200B 参数模型。比 DeepSpeed 快 20–26%。开源:github.com/microsoft/varuna [B]。
5.3 多租户与公平性
5.3.1 DRF (Dominant Resource Fairness)
多资源维度公平分配的经典算法。在 GPU 场景下,DRF 违反 sharing incentive (SI)、envy-freeness (EF) 和 Pareto efficiency (PE),因 ML job 需要 gang scheduling 且对 placement 敏感 [B]。
5.3.2 Tiresias (NSDI 2019)
2DAS 调度器:同时考虑空间(GPU 数)和时间维度。无先验知识时用 LAS(优先级反比于已获服务),有分布信息时用 Gittins index。MLFQ 优先级离散化(K 个队列)。Placement 基于模型 skew level 决定是否 consolidate [B]。
5.3.3 Themis (NSDI 2020)
提出 finish-time fairness:ML 作业在共享集群中的完成时间与 1/N 独立集群相当。两级拍卖式架构,中央 Arbiter + Agent 投标。公平性提升 2.25×,效率提升 5–250% [B]。
5.3.4 Salus (MLSys 2020)
细粒度 GPU 共享原语:fast job switching + memory sharing。以 iteration 为调度粒度(kernel 粒度开销过大)。需修改 TensorFlow 代码。通过 Adaptor 合并 GPU 请求到同一 context,消除上下文切换开销 [B]。
5.4 调度策略对比
| 策略 | 特点 | 适用 |
|---|---|---|
| FIFO | 简单 | head-of-line blocking 风险 |
| SJF/SRTF | 需预知作业时长 | DDL 场景不适用 |
| Gang | all-or-nothing | 避免部分启动 |
| Fair/DRF | 多资源公平 | 对 ML gang scheduling 不友好 |
| LAS/2DAS | 无需先验知识 | 优先短作业 |
5.5 GPU碎片整理与重放
- Cocktail (NSDI 2022):多维优化 model serving,不同精度模型组合,根据 SLO 和负载动态选择最优模型精度组合;
- Graviton (2021):GPU 虚拟化与碎片整理,将 GPU 共享工作负载的碎片化调度问题建模为优化问题;
- MIG as Packing:MIG 硬件分区作为 packing 策略,每个 MIG 实例是独立可调度单元,减少碎片化。Volcano + MIG 实现"匹配离散资源池"调度;
- Proteus (ASPLOS 2024):高吞吐推理服务系统,通过 accuracy scaling(动态调整模型精度)实现多维度优化。
第6章 自适应优化与混合精度
"自适应"是分布式训练从"调参炼金术"走向"工程自动化"的关键。本章覆盖自适应混合精度(AMP/FP8)、自适应优化器谱系(LAMB/Sophia/Muon/Schedule-Free)以及它们如何与分布式训练系统协同。
6.1 自适应混合精度(AMP)
PyTorch torch.cuda.amp 自动 FP32→FP16/BF16 转换。FP16 需 GradScaler 防止梯度下溢;BF16 与 FP32 同指数范围(8 位指数),无需 scaling,是当前大模型训练的事实标准。
6.2 FP8 Transformer Engine
NVIDIA Transformer Engine 支持 E4M3(forward activation,更多 mantissa 精度)和 E5M2(gradient,更宽动态范围)。Delayed Scaling:跟踪 amax(16 步滚动窗口)设置缩放因子。Hopper/Ada GPU 上 FP8 相比 BF16 吞吐量约翻倍。通过 te.fp8_autocast() 启用 [A]。
6.3 PyTorch Native FP8 (torchao)
torchao.float8 模块替换 nn.Linear → Float8Linear,通过 torch._scaled_mm 发起 FP8 GEMM。与 FSDP2 兼容(参数 bf16 分片,FP8 cast per-rank)。必须 torch.compile 才能融合 cast/scale kernel [A]。
6.4 DeepSeek-V3 FP8混合精度训练
DeepSeek-V3 是工业界首次在 trillion 参数规模上成功跑通 FP8 混合精度训练的模型。采用 hybrid 精度方案:
- FP8 用于 dense GEMM 与计算密集 kernel,显存砍掉一半、训练 throughput 提升 30%,loss 退化不到 0.01%;
- 敏感模块(LayerNorm、attention、embeddings、MoE gating)保持 BF16/FP32 维持数值稳定性;
- 量化粒度:activations group-wise (1×128),weights block-wise (128×128)。GEMM 中间结果在 FP32 CUDA cores 累加,防溢出;
- 结果:每训练 1 万亿 token 只需 18 万 H800 GPU 小时 [B]。
6.5 量化训练
- QAT(Quantization Aware Training):训练中模拟量化噪声;
- LSQ(Learned Step Size Quantization):可学习量化步长;
- SmoothQuant:激活值平滑迁移到权重端;
- AWQ:Activation-aware 权重量化。
6.6 自适应超参/优化器谱系
| 优化器 | 年份 | 核心思想 | 内存(vs Adam) |
|---|---|---|---|
| LARS (You 2017) | 2017 | 逐层 trust ratio,归一化 gradient by layer norm for SGD | <1.0× |
| LAMB (You 2019) | 2019 | LARS + Adam,逐层 trust ratio。BERT 64K batch 76 分钟训练 | 1.0× |
| Adafactor (Shazeer 2018) | 2018 | 分解二阶矩为低秩矩阵,省内存 | ~0.5× |
| Sophia (Liu 2023) | 2023 | 对角 Hessian 估计,二阶信息 | ~1.0× |
| Shampoo (Gupta 2018) | 2018 | 结构化 preconditioning,维护 m×m 和 n×n 预条件矩阵 | >1.0× |
| Muon (Jordan 2024) | 2024 | 动量矩阵正交化(Newton-Schulz 迭代),仅用于 2D 权重。NanoGPT 速度记录提升 1.35× | ~0.5× |
| Lion (Chen 2023) | 2023 | 程序搜索发现,用 sign(momentum),仅一个状态 | 0.5× |
| Schedule-Free AdamW (Defazio 2024) | 2024 | 消除学习率调度,通过 iterate averaging。无需 warmup | 1.0× |
| Adopt | 2024 | Adam 改进,解决收敛性问题 | 1.0× |
| SAM (Sharpness-Aware Minimization) | 2020 | 优化 loss 的平坦区域,提高泛化 | 2× |
| Lookahead | 2019 | 双时间尺度:slow weights + fast weights 动量更新 | 2× |
AlgoPerf 2024 基准:分布式 Shampoo 赢得外部调优赛道,证明预条件方法可超越调优的 AdamW [B]。
💡 大 batch 训练的两大算法支柱 :LAMB(逐层 trust ratio)+ DualPipe(双向流水)共同支撑了 DeepSeek-V3 在 2048 H800 上的高效训练——前者解决"batch 越大学习率越难调",后者解决"流水线气泡随 stage 数线性增长"。
第7章 容错、弹性与可观测性
当集群规模到万卡级,故障不再是"是否发生"而是"何时发生"。Llama 3 405B 预训练 54 天内 16K GPU 发生 419 次意外中断,平均每 9 天 1 次 SDC(Silent Data Corruption)[A]。本章梳理检查点、故障检测、可观测性三层防护。
7.1 检查点与快照
7.1.1 PyTorch Distributed Checkpoint (DCP)
Sharded 格式:每个 rank 写自己的 shard 到目录,附 .metadata 文件描述全局 tensor-to-shard 映射。Reshard-on-load 是一等公民:TP=8 PP=4 保存的 checkpoint 可加载到 TP=4 PP=8 布局。
7.1.2 FSDP2 + DTensor
FSDP2(2024 发布)用 per-parameter DTensor 替代 FSDP1 的 FlatParameter。checkpoint 按 per-parameter 分片,DCP 原生处理,reshard-on-load 无需手动配置。FSDP1 checkpoint 不直接兼容 FSDP2。
7.1.3 DeepSpeed Universal Checkpoint
拓扑无关格式,加载时重新分区适配目标 TP/PP/DP 配置。ZeRO-1/2/3 各有不同的 checkpoint 布局。zero_to_fp32.py 可将 ZeRO-3 shard 合并为完整模型。
7.1.4 Async Checkpointing
PyTorch 2.3+ torch.distributed.checkpoint.async_save。两阶段:Stage 1 GPU→CPU copy(~1s,pinned memory + async DMA);Stage 2 后台线程 serialize + disk write(分钟级,不阻塞训练)。
7.1.5 Safetensors
Hugging Face 格式,比 pickle 更安全(无代码执行)、更快。save_safetensors=True 成为标准实践。
7.2 故障检测与恢复
7.2.1 SDC (Silent Data Corruption)
硬件 bit 翻转导致计算错误但不触发告警。Meta Llama 3 405B 预训练 54 天发生 6 次 SDC(16K GPU 每 9 天 1 次)。Google Gemini 每 1–2 周遭遇 1 次 SDC。SDC 概率随 GPU-hour 线性增长。
7.2.2 Google Gemini SDC检测
确定性执行(XLA 编译器保证可重放)+ SDC scanner + 热备份节点。发现梯度异常时回退几步重放:相同结果→数据问题;不同结果→硬件故障。通过确定性回放定位故障节点,分钟级隔离。
7.2.3 Meta Llama 3 SDC防护
三层防护:
- 硬件层:HBM 扩展 ECC;
- 系统层:Fleetscanner 工具每 45–60 天扫描;
- 应用层:梯度裁剪 + 超检查点机制(Hyper checkpointing)。
7.2.4 NVIDIA DCGM诊断
dcgmi diag -r 4 可检测 GPU CUDA/Tensor Cores、Memory、NVLink 问题,但万卡集群需停机 4+ 小时。
7.2.5 Bauer et al. (MLSys 2022)
NVDLA 故障注入实验:82–90% bit 翻转不显著影响训练 loss;9.7–17.7% 影响训练(NaN/INF、loss 骤降等 pattern)。梯度计算中的错误沿反向传播放大 [B]。
7.2.6 OCP SDC规范 (2025)
三级防护:硬件级(ECC 扩展)、系统级(冗余计算/影子节点)、应用级(算法容错/ABFT)。
7.3 可观测性
7.3.1 NVIDIA DCGM
Data Center GPU Manager,提供 REST API + Prometheus exporter,支持 K8s 集成。实时监控 NVLink 带宽/错误率、ECC 错误、功耗、温度。
7.3.2 Nsight Systems (nsys)
系统级时间轴分析,统一 CPU/GPU timeline。捕获 CUDA kernel 启动、内存传输、NCCL 通信。核心原则:nsys before ncu(先系统级定位热点 kernel,再 kernel 级深入分析)。
7.3.3 Nsight Compute (ncu)
Kernel 级 profiler,Roofline analysis、SM occupancy、stall reasons、tensor core utilization。但会破坏 kernel overlap(kernel-replay 序列化),不适用于 FlashAttention-3 / NCCL collectives。
7.3.4 PyTorch Profiler / Perfetto / CUPTI
PyTorch Profiler 集成 Kineto + NVTX,operator-to-kernel 映射。torch.profiler.profile(activities=[ProfilerActivity.CUDA]) + export_chrome_trace("trace.json")。Chrome trace 格式与 Perfetto 兼容。Perfetto 是 Google 的系统级 tracing 框架,HolisticTraceView (Meta) 基于 PyTorch profiler trace 做大规模分析。CUPTI 是 CUDA Profiling Tools Interface,底层计数器采集 API,支撑 nsys/ncu 的数据采集。
📊 **[图示]** 图7-1:Llama 3 405B 预训练 54 天内 419 次意外中断原因分布,硬件故障占 35%(含 GPU/主机),网络占 24% A
💡 工程启示 :分布式训练可用率从 99% 推到 99.9%+ 的关键,不是单点优化,而是 检查点频率 + 故障检测速度 + 自动恢复链路 三者的乘积。Llama 3 团队的实践是:每 30 分钟异步 checkpoint + Fleetscanner 周期扫描 + torchrun 弹性重启,三者协同把 MTTR 压到分钟级。
1638

被折叠的 条评论
为什么被折叠?



