分布式训练
第1章:分布式训练总论
从模型规模瓶颈出发,手算训练显存账本,总览五大并行策略,并落到 rank/torchrun/NCCL 的环境搭建与第一个 DDP 脚本
分布式训练 显存分析 并行策略 3D并行 通信拓扑 torchrun NCCL DDP rank
📖 本章概述
本章是分布式训练模块的总纲,建立三层认知框架:为什么需要分布式训练 → 训练到底需要多少显存 → 有哪些并行策略怎么分;随后落到工程地基,讲清多卡如何”组队”、如何用 torchrun 一条命令拉起、如何跑通第一个 DDP 训练脚本。读完本章,既有了后续每一章”在解决什么问题”的坐标系,也具备了亲手跑通多卡训练的能力。
本章由两部分构成:前半是认知总论(显存账本 + 并行全景),后半是工程地基(进程模型 + torchrun + NCCL + 最小 DDP 脚本),对应下面两篇正文。
📑 章节结构
第一部分:认知总论(对应正文 1.1)
1. 为什么需要分布式训练
- 显存瓶颈:以 LLaMA 系列为例(7B → 70B → 405B),展示模型规模与显存需求的增长,单卡 80GB 的 H100 在 7B 以上就装不下完整训练状态
- 时间瓶颈:70B 模型在 1T token 上训练,单卡需要数年;多卡并行可近线性缩短训练时间
- 核心结论:分布式训练解决”装不下”(显存)和”跑不完”(时间)两个问题
2. 训练状态显存分析(本章重点)
- 显存四大组成:
- 参数显存(FP16: Bytes)
- 梯度显存(FP16: Bytes)
- 优化器状态显存(Adam: FP32 参数副本 + 一阶动量 + 二阶动量 = Bytes)
- 激活值显存(与 batch size、序列长度、模型宽度相关)
- 手算实例:7B 模型 BF16 混合精度训练的完整显存账本
- 静态显存 = Bytes ≈ 112 GB
- 激活值显存估算(以 seq_len=2048, batch=1 为例)
- 显存公式总结:每参数 16-18 Bytes(混合精度 + Adam)+ 激活值
3. 并行策略全景
- 数据并行(DP/DDP):每卡完整模型,切分数据,AllReduce 同步梯度——解决”跑不完”
- ZeRO / FSDP:切分优化器状态/梯度/参数,按需聚合——解决”装不下”
- 张量并行(TP):层内矩阵运算切分到多卡——解决”单层太大”
- 流水线并行(PP):不同层分配到不同卡——解决”层数太多”
- 序列并行(SP)/ 上下文并行(CP):沿序列维度切分——解决”序列太长”
4. 并行策略选择原则
- 通信带宽决定作用域:TP 限制在 NVLink 互联的机内(需高带宽低延迟),PP 可跨机(只传激活值),DP 对带宽要求最低
- 决策树:单卡装得下 → DDP;单卡装不下 → FSDP/ZeRO;单层装不下 → TP;模型层数太多 → PP;综合使用 → 3D 并行
- 通信拓扑与硬件的映射关系:NVLink(900 GB/s)vs InfiniBand(400 Gbps)vs 以太网对策略选择的影响
第二部分:环境搭建与分布式启动(对应正文 1.2)
5. 进程组与核心概念
- 单机单卡 / 单机多卡 / 多机多卡三种规模与带宽分层(NVLink vs InfiniBand)
- 进程模型:为什么是”一卡一进程”(绕开 GIL、独占 CUDA 上下文)
- 核心概念:
rank/local_rank/world_size,以及为什么set_device必须用local_rank - 进程组
init_process_group与后端选择(nccl / gloo) - 子通信组
new_group:为 3D 并行铺路
6. torchrun 启动机制
- 为什么需要专门的启动器;
torch.distributed.launch→torchrun的演进 - torchrun 注入的环境变量(RANK / LOCAL_RANK / WORLD_SIZE / MASTER_ADDR / MASTER_PORT)
- 单机多卡启动、多机多卡启动与 Rendezvous(c10d 弹性会合)
- torchrun 的弹性与容错能力(详见第 14 章)
7. NCCL 环境变量与通信调试
NCCL_DEBUG=INFO排障第一招NCCL_SOCKET_IFNAME/NCCL_IB_HCA指定网卡NCCL_P2P_DISABLE/NCCL_SHM_DISABLE二分排障开关CUDA_VISIBLE_DEVICES与设备绑定
8. 动手写第一个多卡训练脚本
- 最小 DDP 脚本的五段式骨架:init → set_device → DDP 包裹 → 训练循环(带 Sampler)→ destroy
- 完整可运行模板与逐段拆解
- 仅 rank 0 干活的工程惯例、
DistributedSampler+set_epoch - 首次跑多卡的常见踩坑
🎯 本章学习目标
- 能计算任意规模模型(给定参数量)的 BF16 混合精度训练显存需求
- 能画出五大并行策略的”切什么 × 怎么通信”对比表
- 能根据模型规模和集群拓扑选择合适的并行策略组合
- 能准确区分 rank / local_rank / world_size,并写出 torchrun 单机、多机启动命令
- 能独立写出并用 torchrun 跑通一个最小 DDP 训练脚本
- 能说出遇到多卡通信问题的第一个动作(开
NCCL_DEBUG=INFO)及常见排查手段