← 返回书架人工智能 · 交互式 Wiki
模型工程/并行与数值精度资料与边界
训练系统与性能进阶专题讲解

ENGINEERING EXTENSION / TRAINING SYSTEMS

训练系统:分片、精度与通信

参数、梯度、优化器、激活、层、专家和序列都可以被切分,但每一种切法换来不同的 collective、内存和调度。 精度又决定每份状态占多少 bytes。下面按切分对象和通信方式逐项分析。

01

沿哪个维度切?

切换一种并行方式,看权重、梯度、优化器、activation 与 batch 分布怎样变化。

DATA PARALLEL

复制完整模型,让不同 GPU 算不同 batch

每卡有完整权重、梯度和优化器状态,适合单卡放得下训练状态的情况。梯度用 all-reduce 同步;DDP 可在梯度桶就绪后发起通信,与反向计算重叠。

分片

batch

主要通信

all-reduce gradients

主要限制

每卡完整训练状态放不下

replicatedsharded / localcommunication
DP 的每个 GPU 都持有完整参数与 optimizer state;不同 GPU 分担 batch 计算,每卡仍需保存完整训练状态。
02

数值精度与资源成本

bits 减少会同时改变显存、带宽、吞吐与数值稳定性;不同变量可以使用不同精度。

格式bits / 结构常见用途优势主要风险
FP321 sign + 8 exp + 23 fraction · 32bmaster weights、较高精度优化器状态、诊断范围与精度高仍有舍入误差;存储成本高于低位格式
TF32Ampere 为例:8 exp + 10 fraction部分 FP32 矩阵乘/卷积加速该模式以 FP32 存储和累加乘法输入精度低于 FP32;依赖硬件与 kernel
BF161 sign + 8 exp + 7 fraction · 16b训练 activation/参数、KV Cache范围接近 FP32,通常无需传统 loss scaling尾数少,累加和细腻差异仍需注意
FP161 sign + 5 exp + 10 fraction · 16b部分推理、训练 mixed precision正规数的小数位多于 BF16、硬件成熟指数范围小,可能出现 overflow/underflow
FP8E4M3 / E5M2 · 8b受支持的训练与推理 kernel显存/带宽明显下降需要 scaling、分组配置,并检查数值误差
INT8 / INT4整数 + scale / group权重量化、部分激活/KV服务吞吐和内存友好误差累积、outlier 与 kernel/模型结构依赖强
存储

权重、梯度、master copy、Adam m/v、activation、KV Cache 可以各有不同精度,应分别记录各自的字节数。

数值

Softmax、norm、loss 与 accumulation 常需要更高精度;低精度 kernel 是否安全必须用真实数据验证。

系统

量化收益取决于 kernel 支持;格式转换和额外访存可能抵消部分节省。

03

Activation 占用为什么会迅速增长

下面的估算显示单层关键中间张量。实际反传会保留一部分 activation,框架与重算策略差异很大。

未融合 T×T attention 分数 4.00 GiB 单层、单个 materialized score matrix
Q / K / V 三份张量192.0 MiB
SwiGLU gate / up 两路投影448.0 MiB
单份 residual / hidden64.0 MiB
如果使用 FlashAttention / 分块 attention

可以避免显式保存完整 T×T 矩阵,显存更接近随 B·T·d 线性增长;但反向仍需保存/重算部分中间量,通信与 kernel 支持也会影响结果。

计数假设 MHA 的 Q/K/V 都有 H 个头,模型宽度为 H×head dim;元素数分别为 BH T²、3BT H·head dim、2BTF 和 BT H·head dim,再乘每元素字节数。gate/up 只数两路投影,不含 SiLU、逐元素乘积或 down projection 的额外中间量。面板不是反传保存清单或总峰值;GQA、融合算子、重算、临时 workspace 与通信缓冲需另算。FP8 选项仅按 1 byte 计数,不表示这些张量都能使用 FP8 kernel,也未计缩放元数据。

04

四个 collective,先认清再调并行

集合通信会占用带宽并造成等待,需要放进完整执行时间线分析。

ALL-REDUCE

每卡算出局部贡献,求和后人人得到完整结果

典型用于 DP 梯度同步。通信量与模型梯度大小相关,可用 bucket/overlap 与 backward 重叠。

g = Σ_i g_i
REDUCE-SCATTER

规约并只保留自己负责的分片

ZeRO/FSDP 常用来规约梯度并保留本卡分片,再更新本卡拥有的优化器状态;Adam 的 m/v 按各自参数分片维护。计算所需的参数分片之后还可能需要 all-gather。

reduce → shard
ALL-GATHER

把各卡的分片拼成完整张量

ZeRO-3/FSDP 计算层前重聚参数,TP 也常用。频繁 gather 会把参数分片省下的显存换成带宽压力。

shards → full
ALL-TO-ALL

不同 token 发给不同专家/设备

MoE expert parallel 的核心通信。路由不均衡时,某些设备成为热点;需要容量、负载均衡与调度。

tokens ↔ experts
05 / PIPELINE SCHEDULE

每张卡何时前向、何时反向?

Pipeline Parallel 将层分给不同阶段,再把 batch 拆成 microbatch。后阶段等待前阶段的激活,前阶段的反向等待后阶段的梯度。调度改变空闲位置和激活保留时间;本例所有 microbatch 完成反向后才更新权重。

GPipe 与 1F1B 时间线

每次前向/反向各 1 tick,通信时间为 0

依赖操作必须在前一 tick 完成;每个阶段每 tick 至多执行一项。GPipe 采用全前向屏障,1F1B 采用 warmup、交替和 cooldown。

完成 tick
空闲槽位
各阶段激活峰值
阶段前向次数反向次数保留激活峰值

F/B 后数字为 microbatch 编号。激活以每阶段、每 microbatch 一份计数,反向结束后释放;不含张量尺寸、重算和传输缓冲。逻辑 tick 不预测真实时延。

空闲槽位=P T−2PM,空闲比例=P T−2PMP T\text{空闲槽位}=P\,T-2PM,\qquad\text{空闲比例}=\frac{P\,T-2PM}{P\,T}
P 为阶段数,M 为 microbatch 数,T 为本次调度完成 tick。每阶段必须执行 M 次前向和 M 次反向,总工作量相同;表内依赖决定空闲发生在哪些位置。

1F1B 可让已完成前向的激活更早被反向消费,通常能降低某些阶段的保留峰值;在本例同速、零通信假设下,完成时间未必比 GPipe 更短。实际模型阶段耗时不等,通信、重算、虚拟阶段和调度交错都会改变结果。

Microbatch 增多可以更充分填充流水线,但同时改变每次更新的样本组织。比较必须保持全局目标、梯度缩放与权重版本语义一致。异步更新或不同版本权重属于另一类协议,不能直接套用本例的同权重对照。

CASE / OVERLAP WITH DEPENDENCIES

DualPipe:哪些通信能被覆盖,哪些依赖仍要等待?

DeepSeek-V3 的 DualPipe 将前向/反向 chunk 细分为 Attention、专家分派、MLP 与合并;反向再分输入梯度与权重梯度,并用双向流水线和计算—通信重叠改善执行。原报告还给出参数副本与激活的代价;这些条件不能从一个“并行”标签里省略。

先核验一对 chunk 的依赖和资源占用

下面是受该分解思路启发的有限调度教具,不是完整 DualPipe:一个新 microbatch 的前向 F,搭配一个旧 microbatch 的反向 B;一条独占计算通道、一条独占通信通道。计算操作均为 2 tick,四次通信先设为 3 tick,操作不抢占;只允许不同通道重叠。

F 的依赖为 FA→FD→FM→FC。旧反向先经 BC 回传合并端梯度,再产生 MLP 输入梯度 BMI 与权重梯度 BMW;BD 只依赖 BMI,之后 Attention 输入梯度 BAI 与权重梯度 BAW 都可执行。BMW 不必阻塞 BD。相同通道上的操作必须额外串行。

sv≥max⁡u∈pred⁡(v)fu,fv=sv+dv,T≥max⁡ ⁣(∑v∈Cdv,∑v∈Ndv)s_v\ge\max_{u\in\operatorname{pred}(v)}f_u,\qquad f_v=s_v+d_v,\qquad T\ge\max\!\left(\sum_{v\in C}d_v,\sum_{v\in N}d_v\right)
s/f/d 为开始、结束与时长;无前驱时最早为 0,C/N 分别为计算/通信操作集。同通道区间不能相交;工作量下界未必能达到,还要满足依赖。
每次通信 tick显式串行完成双资源最短完成激活峰值限 1 的最短完成双资源工作量下界
116121512
324132212
636243424

每组穷举 6!×4!=17,280 对通道顺序,296 对与依赖相容;为每对计算最早开始时间,再选最短完成。三组通信时长在计算前固定,未按最好结果选择。最短仅指这个有限资源模型,没有 GPU、网络或训练吞吐实测。

计算通信03691213 FABMIBMWFMBAIBAWBCFDBDFC
固定 3 tick 通信的一份最短事件序列,蓝色为计算,暖色为通信。两类资源各有 12 tick 工作量,但依赖和占用使完成时间为 13;图中每个矩形的起点与宽度由核验脚本逐项检查。
十个操作的开始、结束与依赖
操作资源开始结束前驱
BC通信03—
FA计算02—
BMI计算35BC
FD通信36FA
BMW计算57BC
BD通信69BMI
FM计算79FD
BAI计算911BD
FC通信912FM
BAW计算1113BD
为什么可以在这个教具里称为“最短”?

每个不抢占、同通道互斥的可行调度,都给出一份计算顺序和一份通信顺序。把顺序边加入原依赖后,必须无环;对固定顺序,各节点按前驱最晚完成时刻启动,不会比同顺序的其他方案更晚。因此枚举所有通道顺序并取最小值,覆盖了本模型的所有可行完成时间。

激活峰值限 1 另要求所有旧反向计算完成后才能开始 FA。因为它们和 FA 都使用计算通道,该条件等价于相应操作全部排在 FA 之前;枚举中保留这些顺序即可。证明只用于本例的两份激活包规则,没有推广到细粒度张量释放或真实 GPU 调度。

把激活存活规则也写进比较

只计两份逻辑激活包:旧反向包在 t=0 已存在,全部旧反向计算完成后才释放;新前向包在 FA 开始时取得,并留到本对 chunk 之后。相同时刻先释放再取得。该粒度故意简化,不含张量大小、逐层释放、重算、参数副本或通信缓冲。

固定通信 3 tick完成激活包峰值新包取得时刻旧包释放时刻
显式串行242024
双资源最短132013
激活峰值限 12211212

峰值限 1 时,所有旧反向计算必须排在 FA 之前;枚举中一并检查这些通道顺序,得到 22 tick。这个结果只说明指定存活规则下的交换关系,不能作为真实显存或报告中参数副本代价的替代。

一手依据:DeepSeek-V3 v1(2024-12-27)第 3.2.1 节、图 4–5 与表 2。完整 DualPipe 还有双向 microbatch、PP 通信、硬件 SM 分配与参数布局条件;本站不实现这些部分,也不把本例的 24→13 当作作者的加速比。

本例固定同一权重版本,不在这对 chunk 内更新参数。完整训练步仍需等齐对应 microbatch 的权重梯度,并保持目标归约、更新时刻与版本语义一致;异步更新属于另一份协议。

06 / PARAMETER LIFETIME

参数分片之后,完整参数何时出现?

每卡长期保存一部分参数,计算一层时临时聚齐该层。前向后释放完整参数能降低存活量,反向则需要重新获取。把状态分片和计算时的临时缓冲区放在同一条时间线上,才能解释峰值。

本例用两个 DP rank、两层 2×2 矩阵和 tanh 中间激活;每卡持有不同样本。每层按扁平数组分成两个连续片段。目标是两份 ½‖Y−target‖² 的平均;反向先产生本地完整梯度,再求和、除以 2 并保留本卡片段。

Wℓ=AllGather⁡(Wℓ,0,Wℓ,1),gℓ,r=slice⁡r ⁣(gℓ(0)+gℓ(1)2),mℓ,r′=0.9mℓ,r+gℓ,r,Wℓ,r′=Wℓ,r−0.1mℓ,r′.\begin{aligned}W_\ell&=\operatorname{AllGather}(W_{\ell,0},W_{\ell,1}),\\g_{\ell,r}&=\operatorname{slice}_r\!\left(\frac{g_\ell^{(0)}+g_\ell^{(1)}}{2}\right),\\m_{\ell,r}'&=0.9m_{\ell,r}+g_{\ell,r},\qquad W_{\ell,r}'=W_{\ell,r}-0.1m_{\ell,r}'.\end{aligned}
gℓ⁽⁰⁾、gℓ⁽¹⁾ 是两份样本的本地梯度,r 为参数片拥有者。ReduceScatter 实现求和与分发,除以 DP 数的系数需与所选归约约定一致;本例动量初值为零。

两卡、两层的逐事件账本

FSDP 风格逻辑过程 · 无通信时延

初始每卡有 4 个参数元素与 4 个动量元素。图只计参数、动量、完整本地梯度及归约梯度片;临时完整参数另分配缓冲区。字节账本假设每元素 4 B,数值计算使用 JavaScript 双精度。

当前每卡逻辑存活量
截至当前的峰值
已完成 AllGather / ReduceScatter

Rank持久参数片临时完整参数完整本地梯度归约后的梯度片逻辑字节
完整事件序列的存活元素数(高亮当前事件)

    ReduceScatter 事件同时计入其输入梯度与输出片,随后释放输入。不计 activation、通信 workspace、分配器碎片及缓冲区别名。预取是提前聚合的逻辑顺序,不据此估计真实速度或物理显存峰值。

    完整运行后的梯度与一次更新校验

    各策略完成全部事件后,与未分片参考的最大参数差:。此结果独立于当前步进位置。

    参数规约梯度分片更新后重建未分片参考更新

    释放策略影响重新聚合次数

    本例两层前向后都释放时,共四次 AllGather;保留时共两次。两种策略计算相同目标,交换的是完整参数存活量与再次聚合的工作。

    预取提前占用缓冲区

    下一层参数先到位可能减少实际运行的等待,也可能使多层参数同时存活。这里只展示后一个可计数关系;重叠收益需要 profiler 证据。

    06

    调参顺序:先 profiler,后学习率

    训练系统的问题要先用可观测信号定位:计算、显存、dataloader 还是通信。

    01

    确认数值闭环

    单 batch loss 下降、checkpoint 可恢复、grad 非零/不爆炸。

    02

    看 tokens/s 与等待

    区分 compute、dataloader、collective、checkpoint 写入的等待。

    03

    看显存峰值

    拆出参数、optimizer、activation、临时 workspace 与碎片。

    04

    再改并行/batch

    每次改一项;验证全局 batch、学习率、warmup 与收敛证据。

    适用范围与一手资料

    原 GPipe/1F1B 为单位 tick、零通信;新增固定前向/旧反向对的双资源 DAG,枚举顺序与逻辑激活包,不含完整双向 DualPipe、PP 通信、SM 分配或测速。原 FSDP 仍为双精度两卡两层 MLP 的逻辑参数/状态账本,不测真实分布式框架或物理峰值。

    公式与机制的原始依据 · 9 项
    知识目录
    搜索知识库