跳到主要内容
分布式训练

第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: 2Ψ2\Psi Bytes)
    • 梯度显存(FP16: 2Ψ2\Psi Bytes)
    • 优化器状态显存(Adam: FP32 参数副本 4Ψ4\Psi + 一阶动量 4Ψ4\Psi + 二阶动量 4Ψ4\Psi = 12Ψ12\Psi Bytes)
    • 激活值显存(与 batch size、序列长度、模型宽度相关)
  • 手算实例:7B 模型 BF16 混合精度训练的完整显存账本
    • 静态显存 = (2+2+12)×7×109(2 + 2 + 12) \times 7 \times 10^9 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.launchtorchrun 的演进
  • 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)及常见排查手段