知识库 / 训练与推理
GitHub
← 训练与推理

LAYER 03 / TRAINING & INFERENCE

分布式训练、低精度与显存

所属: 训练推理平台层。本页边界: 怎样在有限显存和通信预算下稳定执行大规模参数更新。

#核心公式

MAdamW≈N (bw+bg+bm+bv+bmaster)+Mact+Mbuffer M_{\mathrm{AdamW}}\approx N\,(b_w+b_g+b_m+b_v+b_{\mathrm{master}})+M_{\mathrm{act}}+M_{\mathrm{buffer}}

#符号说明

符号 含义 单位/条件
MAdamWM_{\mathrm{AdamW}} 全量 AdamW 训练的近似峰值显存组成 Byte
NN 模型参数数量 个
bw,bgb_w,b_g 每个参数对应的权重、梯度存储字节数 Byte/参数
bm,bvb_m,b_v Adam 一阶、二阶动量的存储字节数 Byte/参数
bmasterb_{\mathrm{master}} 可选 FP32 主权重的存储字节数 Byte/参数
MactM_{\mathrm{act}} 前向激活及反向所需中间状态 Byte
MbufferM_{\mathrm{buffer}} 通信、临时算子与碎片缓冲 Byte
MpeakM_{\mathrm{peak}} 训练过程中的峰值显存占用 Byte
Mweights, Mgradients, MoptimizerM_{\mathrm{weights}},\ M_{\mathrm{gradients}},\ M_{\mathrm{optimizer}} 权重、梯度、优化器状态占用 Byte
Mactivations, Mcomm, MtemporaryM_{\mathrm{activations}},\ M_{\mathrm{comm}},\ M_{\mathrm{temporary}} 激活、通信桶与临时工作区占用 Byte
PDP,PTP,PPP,PCP,PEPP_{\mathrm{DP}},P_{\mathrm{TP}},P_{\mathrm{PP}},P_{\mathrm{CP}},P_{\mathrm{EP}} 各并行维度的设备数 正整数
r,αr,\alpha LoRA 秩与缩放系数 正整数、标量
NeffN_{\mathrm{eff}} 低精度训练下的有效参数数量 个
εq\varepsilon_q 量化引入的损失增量 标量

该内存式是显式账本,不同框架是否保留主权重、梯度精度和临时缓冲会改变实际结果。

#技术要点

  • BF16 以更大指数范围避免 FP16 溢出;FP16 以更高尾数精度减少舍入误差,二者在不同训练阶段的最优选择不同。
  • 激活重计算以额外 FLOPs 交换显存。
  • DP/TP/PP/CP/EP 切分的是不同张量维度。
  • loss spike、NaN 和通信 hang 需要区分数值/数据/系统根因。
  • 低精度训练的核心风险不是简单的“数值误差”,而是有方向的数值偏置被训练动态持续放大,最终导致权重谱范数和激活失控。
  • 低精度通过降低“有效参数数量”NeffN_{\mathrm{eff}} 增加损失,精度感知缩放律可量化这一影响。
  • 低比特量化对欠训练模型更友好:训练 token 越多的模型,量化带来的退化越严重。
  • RL 微调阶段 FP16 的稳定性显著优于 BF16,原因是 FP16 的更高尾数精度减少了训练-推理不匹配。

#原理与演进

#为什么“权重放得下”不等于“能训练”

  • BF16 权重约 2N2N 字节;全量训练还需梯度、AdamW 的一阶与二阶动量,部分实现保留 FP32 主权重。仅按这些基础状态分别约 1212 或 1616 字节/参数,再加激活、通信与实现缓冲。
  • 7B 参数的 BF16 权重约 1414 GB;基础状态约 8484–112112 GB(十进制 GB),还未计入激活与临时缓冲。实际容量随框架、优化器和参数共享方式变化。
  • 微批大小、序列长度、层数决定激活量;激活重计算少存中间值,在反向时重算,用计算量换显存。

#各种并行究竟切了什么

方法 切分对象 主要收益 新代价
DP 数据批次 吞吐扩展 每卡仍持有模型状态;梯度同步
ZeRO / FSDP 优化器、梯度、参数状态 降低每卡状态占用 AllGather / ReduceScatter
TP 层内矩阵 单层放不下时可运行 高频层内通信
PP 网络层 层分布到多卡 pipeline bubble 与微批调度
CP 序列位置 长上下文激活分摊 注意力跨设备通信
EP MoE 专家 专家参数分布到多卡 token All-to-All 与负载不均

#低精度与参数高效更新

  • BF16 指数范围大,通常比 FP16 更不易溢出;低精度矩阵乘仍可配合较高精度累积或主状态。但BF16 的宽动态范围以牺牲尾数精度为代价,这一代价在特定场景下会超过其带来的便利。
  • LoRA 冻结原矩阵 WW,只训练下式所示的低秩增量;可减少可训练参数与优化器状态,不减少基座权重本身。原论文
ΔW=BA \Delta W=BA
  • 数值溢出、数据异常和通信故障都会表现为 loss spike 或停滞,需要分别观察梯度、样本与同步行为。

分工: 硬件互联决定链路,集合通信决定传输原语;本页讨论模型状态怎样映射到设备。

#1. 显存账本与显存—吞吐交换

Mpeak≈Mweights+Mgradients+Moptimizer+Mactivations+Mcomm+Mtemporary. M_{\mathrm{peak}}\approx M_{\mathrm{weights}}+M_{\mathrm{gradients}}+M_{\mathrm{optimizer}}+M_{\mathrm{activations}}+M_{\mathrm{comm}}+M_{\mathrm{temporary}}.

对于 BF16 权重+梯度、FP32 Adam 一阶/二阶状态和可选 FP32 主权重,静态状态约为下式所示的 1212 或 1616 字节/参数;若另有影子权重/实现缓冲,可能更高。不能把某个字节数当所有框架的固定值,需检查主权重和梯度存储方式。

2+2+4+4=12,12+4=16(字节/参数) 2+2+4+4=12,\qquad 12+4=16\quad(\text{字节/参数})

激活不是单纯 O(N)O(N):它受批大小 BB、序列长 SS、层数 LL、隐藏维度 dd 及注意力实现影响,可粗略理解为 O(BSLd)O(BSLd) 加中间矩阵。注意力的显式分数矩阵为 O(BHS2)O(BHS^2),而 FlashAttention 类实现通过重排计算避免将完整矩阵写入 HBM,详见Roofline。

#2. 精度对训练效果的影响

#2.1 不同精度格式的数值特性

FP16 与 BF16 都是 16 位格式,但位分配截然不同。FP16 分配 5 位指数、10 位尾数;BF16 分配 8 位指数、7 位尾数。在相同指数区间附近,FP16 的尾数分辨率约为 BF16 的下式所示倍数,因此能更细地区分相邻数值。二者的指数范围不能用 2−32^{-3} 这种简单比例表示:FP16 的最大有限值为 6550465504,最小正规数为 2−142^{-14},最小正次正规数为 2−242^{-24};BF16 的最大有限值约为 3.39×10383.39\times10^{38},最小正规数为 2−1262^{-126}。因此 FP16 更容易上溢或下溢,训练时常配合损失缩放;BF16 的指数范围与 FP32 接近,但较少的尾数位会带来更大的舍入误差。

210−7=8 2^{10-7}=8

精度损失不是均匀噪声,而是有方向的偏置。 清华大学对 FlashAttention + BF16 训练中 loss 爆炸问题的机制分析表明,低精度训练失败不是随机数值误差所致,而是低精度在 FlashAttention 反向传播的下式计算中引入了有方向的数值偏置。借助注意力中涌现的相似低秩更新结构,这一偏置被持续放大,最终把权重谱范数和激活推向失控,导致训练在数千步后突然崩溃。这一发现将低精度训练不稳定的原因从“随机噪声”重新定位为“结构化偏置放大”,提供了可解释的机制链。

δ=rowsum(dO∘O) \delta = \text{rowsum}(dO \circ O)

#2.2 BF16 与 FP16 在不同训练阶段的最优选择

预训练阶段,BF16 凭借与 FP32 一致的动态范围,消除了 FP16 训练中损失缩放的调参负担,成为大规模预训练的事实标准。在这一阶段,梯度值的分布通常不会触及 FP16 的溢出边界,BF16 的宽动态范围优势得以充分发挥。

RL 微调阶段,这一默认选择值得重新审视。 RL 微调面临一个预训练中不突出的问题:训练-推理不匹配(training-inference mismatch)。RL 框架为加速通常使用不同的计算引擎进行 rollout(推理)和梯度计算(训练),二者在数学上等价但数值输出不同。BF16 较低的尾数精度放大了这种不一致性,使训练策略和推理策略逐渐偏离,最终导致训练不稳定甚至崩溃。

在所引用论文测试的 rollout/训练引擎、算法与模型配置中,仅将 RL 微调精度从 BF16 切换为 FP16,就缓解了训练—推理数值不一致:实验覆盖 GRPO、GSPO、TIS、MIS,Qwen 与 OctoThinker,以及 Dense-14B 和 MoE 等设置。在该实验的 AIME 2024 结果中,FP16 得分为 39%,BF16 为 34%;论文还观察到训练侧准确率约 99% 与 95% 的差异。这些是特定实现下的经验结果,不是 BF16 数值格式的理论“准确率天花板”,也不意味着所有 RL 微调任务都应固定选择 FP16。

#2.3 FP8 训练:从短程验证到长程失效

FP8 在 Hopper 及后续架构上提供原生矩阵计算支持。常见混合 FP8 配方会让动态范围较小、精度较高的 E4M3 承担部分前向权重与激活,让动态范围较大的 E5M2 承担部分反向梯度;这不是硬件强制规则,具体格式还取决于缩放策略、张量统计与 microscaling 方案。所引用实验中,缩放 FP8 方案在 H100 上对 Llama 3 8B 实现 1.30 倍加速,对 Llama 3.1 405B 实现 1.53 倍加速。

但 FP8 训练存在一个在短程实验中被掩盖的稳定性问题。 将 FP8 训练扩展到万亿 token 规模后,研究人员发现了短程训练中不可观察的关键不稳定性,并将其根源追溯到 SwiGLU 激活函数对离群值的放大效应。这一放大只在长期训练中才变得显著,与 SwiGLU 权重矩阵的对齐过程有关。通过引入 Smooth-SwiGLU 修改,在不改变函数行为的前提下实现了稳定的 FP8 训练,7B 模型在 256 个 Gaudi2 加速器上训练,达到与 BF16 基线持平的结果,同时获得约 34% 的吞吐提升。

激活离群值是 FP8 训练的核心障碍。当标准 FP8 训练灾难性崩溃时,TWEO 方法通过一个简单的损失项将离群值从 10000+ 降低到 20 以下,实现了与 BF16 基线可比的结果,同时带来 36% 的训练吞吐提升。在 B200 上,MXFP8(块级缩放 FP8,每块覆盖 32 个张量元素)由于针对 Blackwell 架构优化,表现略优于标准 FP8-CS。

FP8 在 RL 场景中的精度损失需要审慎评估。 FP8 rollout 虽然带来 1.2 倍加速并将 rollout 内存减半,但在 Qwen3-8B 上 AIME25 准确率下降约 6.63%。Jet-RL 通过统一训练和推理精度流实现了端到端 16% 加速,在所有设置中保持稳定收敛,精度损失微乎其微。这说明 FP8 在 RL 中的可用性高度依赖于精度流的统一管理。

#2.4 低精度如何改变有效模型容量

精度感知缩放律提供了一个统一视角:低精度训练降低了模型的“有效参数数量”NeffN_{\mathrm{eff}},从而增加了损失。这一框架可以预测在不同精度下训练的额外损失,以及训练后量化引入的退化。对于推理,研究进一步发现,训练后量化引入的退化随模型训练数据量的增加而增加,最终可能使额外的预训练数据变得有害——模型训练得越充分,对低比特量化的脆弱性越高。

低比特量化对欠训练模型更友好。 对 1500+ 量化检查点的系统分析表明,更大的模型或训练 token 更少的模型表现出更小的量化退化,而更小、训练更充分的模型面临显著的性能损失。这一趋势的工程含义是:模型训练得越充分(token 数越多),低比特量化的性能退化越严重。对于预期将训练超过 100 万亿 token 的未来模型,低比特量化的性能可能不容乐观。低比特量化可用于衡量模型的训练水平,这为评估量化研究中的模型选择提供了新的视角。

#2.5 低精度训练的稳定性技术

低精度训练放大对学习率的敏感性,增加梯度突刺和 loss spike 的可能性。针对性的稳定化技术可分为三个层次:

优化器层面。 Stable-SPAM 通过三个关键技术实现 4 比特训练的稳定:AdaClip(自适应突刺识别与裁剪阈值)、AdaGN(梯度归一化)、MoRet(动量正则化),在 LLaMA 各规模模型上不仅稳定了 4 比特训练,性能甚至超越 BF16。

数值格式层面。 随机舍入(Stochastic Rounding)通过将舍入误差建模为无偏随机变量,在理论上提供了隐式正则化效果,在 BF16 下配合随机舍入的策略优于标准 (BF16, FP32) 混合精度,并实现最高 1.54 倍的吞吐提升。单位缩放(unit scaling)通过将权重和激活的尺度归一化到单位方差,消除对动态缩放因子的依赖,实现了无动态缩放的 FP8 训练。

理论层面。 对自适应优化器在浮点量化下的收敛分析表明,只要尾数长度随迭代次数对数增长,Adam 和 Muon 都能保持接近全精度的收敛速率。但 Adam 对权重和二阶矩量化高度敏感(因其依赖 β2→1\beta_2 \to 1 的动量累积),而 Muon 对量化误差的控制要求更弱,潜在鲁棒性更强。这解释了为什么同一精度格式在不同优化器下的表现可能差异显著。

#3. 并行维度的通信约束

设总设备数满足下式,这只是概念分解;真实系统还受专家数、层数、拓扑整除约束。

P=PDPPTPPPPPCPPEP P=P_{\mathrm{DP}}P_{\mathrm{TP}}P_{\mathrm{PP}}P_{\mathrm{CP}}P_{\mathrm{EP}}
并行 每卡模型状态 每步关键通信 常见瓶颈
数据并行 完整副本 梯度 AllReduce 静态显存
ZeRO-1/2/3 依次切优化器/梯度/参数 ReduceScatter、AllGather 参数重建频率与链路
张量并行 层内矩阵分块 层内聚合 低延迟带宽,宜在强互联域
流水并行 层分组 激活传输 空泡、微批调度
上下文并行 序列分块 KV/注意力数据交换 长序列通信
专家并行 专家分布 token All-to-All 热门专家拥塞

若 mm 个微批、pp 个流水阶段,理想化同步 1F1B 的空泡比例约 (p−1)/(m+p−1)(p-1)/(m+p-1);增大 mm 降低空泡,却带来更多激活驻留或调度复杂度。公式忽略阶段不均衡、通信和重计算。

路线:单卡全量状态 → 数据并行扩吞吐但不省显存 → ZeRO/FSDP 切状态 → TP/PP 处理单层/整模装不下 → CP/EP 应对长上下文与 MoE;每一步都把局部显存问题部分转化为通信问题。

#4. 低精度失稳的根因诊断

需区分四类不同根因,它们的表现可能都是 loss spike 或停滞,但处理方式完全不同:

根因 典型特征 诊断信号
数值溢出(FP16 上溢) 非有限值出现在 loss 之前 梯度范数突然增大后出现 Inf/NaN
有方向的数值偏置 loss 在特定步数后突然爆炸 权重谱范数持续增长,注意力头异常
数据极端样本 loss spike 与特定批次相关 重放相同批次可复现
通信 hang 训练停滞但非数值异常 梯度范数正常,集合通信超时

第一类可通过损失缩放和主权重精度缓解。第二类是低精度训练特有的结构性风险,需要修改数值路径(如清华论文对 FlashAttention 中 OO 的高精度计算路径)或采用 TWEO 类损失项抑制离群值。第三类需检查数据过滤与配比。第四类属于集合通信的诊断范畴。

只看 loss 曲线不足以定位根因。 应同时对照梯度范数、非有限值计数、权重谱范数、批次来源和集体通信时间。低精度训练中的 loss spike 往往有先兆——清华的工作发现,loss 爆炸前 1–8 次迭代会出现 RMS 范数的突增。在优化器中加入更新裁剪(update clipping)可缓解 loss spike,效果优于范数为 1 的梯度裁剪。

#5. PEFT 与全量微调的边界

LoRA 写作如下,其中 B∈Rdout×r, A∈Rr×dinB\in\mathbb R^{d_{\mathrm{out}}\times r},\ A\in\mathbb R^{r\times d_{\mathrm{in}}},可训练参数为 r(din+dout)r(d_{\mathrm{in}}+d_{\mathrm{out}}),小于全量 dindoutd_{\mathrm{in}}d_{\mathrm{out}} 当 rr 足够小。

W′=W+αrBA W'=W+\frac{\alpha}{r}BA

LoRA 节约梯度和优化器状态,却仍需读取基座权重,并非自动降低推理计算量。QLoRA 进一步将冻结基座量化,降低微调时权重存储;但反向经过量化权重路径仍有计算与激活成本。QLoRA 原论文

精度的选择需与微调方式协同。 LoRA 的可训练参数少,优化器状态显存远低于全量微调,但基座权重的存储精度仍决定前向计算成本。在 RL 微调场景中,FP16 的稳定性优势同样适用于 LoRA:实验表明 FP16 下 LoRA 微调也优于 BF16。

原始资料: ZeRO;PyTorch FSDP 官方说明;LoRA。

#原始资料

本页由仓库中的 Markdown 生成。具体技术结论请结合正文引用与实验条件理解。

输入关键词,探索整个知识库

↑ ↓ 选择 ↵ 打开36 篇笔记,一次搜索