← 返回书架人工智能 · 交互式 Wiki
模型工程/并行计算正确性资料与边界
训练系统与性能进阶计算演示

TRAINING ENGINEERING / CORRECTNESS

并行正确性:每一步的平均与归一化

同一组样本从单卡搬到多卡,目标函数不应因切分方式悄悄改变。先定义全局分母,再追踪每个 microbatch、数据并行副本和框架规约的系数。

01 / DEFINE THE DENOMINATOR

先写出一次 optimizer update 的目标

Srk=∑t∈Mrkℓrkt,nrk=∣Mrk∣,N=∑r∑knrk,Lglobal=∑r∑kSrkN,N>0.\begin{aligned} S_{rk}&=\sum_{t\in\mathcal M_{rk}}\ell_{rkt},\qquad n_{rk}=|\mathcal M_{rk}|,\\ N&=\sum_r\sum_k n_{rk},\\ \mathcal L_{\mathrm{global}}&=\frac{\sum_r\sum_k S_{rk}}{N},\qquad N>0. \end{aligned}
r 是数据并行副本,k 是累积 microstep,Mᵣₖ 是有效监督位置集合。分子是 loss 总和,分母是同一更新窗口的全局有效 token 数。

r 是 DP 副本,k 是累积 microstep。N 必须覆盖这一次更新的全部有效标签。padding、被 mask 的 prompt、截断后不存在的标签不计入 N;SFT response-only 的分母也不是输入长度。若目标是“每条序列等权”,应另写序列平均目标,并按该目标计算样本权重。

标准 DDP 梯度规约通常对副本求平均。若每个副本回传自己的 local mean,最终得到的是副本等权平均。各副本有效 token 数相等且非零时,可保证它与全局 token 平均一致;计数不等时一般不同,特定梯度可能碰巧相等。各 microbatch 的均值再等权平均,也有同样的计数问题。

02 / CHECK THE UPDATE

两份样本,错误平均甚至能把方向反过来

把两种切分放进同一可微目标。θ=0,A 的每 token loss 为 ½(θ−2)²,B 为 ½(θ+1)²,所以梯度分别是 −2 与 +1。

两副本梯度账本

单参数二次损失 · 无 optimizer 历史状态
正确全局梯度
当前实现梯度
SGD 后 θ(η=0.1)
副本有效数量 n每 token 梯度梯度和正确全局权重

默认 A=2、B=8:正确梯度 (2×−2+8×1)/10=+0.4,错误副本平均 (−2+1)/2=−0.5。空副本的 local mean 未定义;此时错误方案显示不可用,不把空均值默认为零。N=0 时无有效训练目标,所有副本应协调跳过。

03 / MATCH FRAMEWORK SEMANTICS

DDP 已经除以 P,局部 loss 该怎样缩放?

L~rk=PNSrk,=PnrkN ℓ‾rk(nrk>0),1P∑r∑k∇θL~rk=1N∑r∑k∇θSrk.\begin{aligned} \widetilde{\mathcal L}_{rk}&=\frac{P}{N}S_{rk},\\ &=\frac{Pn_{rk}}{N}\,\overline\ell_{rk}\quad(n_{rk}>0),\\ \frac1P\sum_r\sum_k\nabla_\theta\widetilde{\mathcal L}_{rk} &=\frac1N\sum_r\sum_k\nabla_\theta S_{rk}. \end{aligned}
P 是 DDP 副本数,局部回传的目标带 P/N 系数,DDP 再除 P,恰好还原全局目标。ℓ̄ᵣₖ=Sᵣₖ/nᵣₖ 仅在非空 microbatch 上定义。

分母 N 在这次更新内统一,且只是数据计数,不对它求参数梯度。可以预先统计整个累积窗口,或按等价方式在累积完后归一化梯度,但必须处理 mixed precision 和通信顺序。全局 N 已覆盖累积窗口,再除 accumulation_steps 会重复缩放。若损失另有类别权重、样本权重或其他 reduction,分母可能是权重和而非 token 数,必须重新写目标。

若通信原语只求和、不做平均,则局部系数是 1/N;若框架或 trainer 已按 token 数归一化,不应再手动叠加。使用 FSDP、ZeRO 或自定义 communication hook 时,应核对其规约方式与本页推导的系数。

01 / COUNT

确定有效窗口

DP 副本内各 microbatch 的有效数量,汇总全局 N;定义零标签处理。

02 / BACKWARD

累计同一目标梯度

按正确系数反传;no_sync 场景需覆盖相应 forward/backward,最后同步。

03 / NORMALIZE

检查尺度与范数

完成归约、unscale 和约定的归一化后,检查 finite 与正确的 global norm,再裁剪。

04 / UPDATE

更新一次

optimizer/scheduler/计数按约定推进,清空梯度,保存可恢复状态。

正则项需要单独确定权重。若完整目标是 Ltoken+λR(θ),复制到每副本的 λR 在副本平均后保留一次即可;每个 microstep 都重复加整项会改变强度。AdamW 的解耦衰减则发生在 optimizer update,而非每条 token 的 loss 中。

04 / EQUIVALENCE LIMITS

梯度累积什么时候等价于大 batch?

条件等价需要什么常见破坏因素
同一加法目标所有样本 loss 可按约定权重相加,参数在累积窗口中保持不变。microstep 内先 optimizer.step、不同分母、重复正则项。
同一前向语义样本间的计算关系不因切分变化。BatchNorm 统计、in-batch negatives、跨样本 attention;累积不自动扩大负例池。
同一非线性处理在全局归一化后的梯度上做相同裁剪与 optimizer。先逐 microbatch clip,再求和;clip(sum g) 通常不等于 sum clip(g)。
同一数值和随机轨迹在容差下比较;明确 dropout RNG、precision、规约顺序。浮点非结合性、kernel 差异、随机数分配;数学等价不意味着逐 bit 一致。

对比学习跨卡 all-gather 时,还要检查远端文档表示是否保留梯度,以及每张卡计算哪些 query 的 loss。简单 detach 远端特征可能改变梯度目标;反传支持与补偿策略必须和完整目标一起看。

分片状态下的 global norm 也有所有权问题:只把本地 shard 范数当全局会低估,重复计算副本又会高估。使用知道参数分片布局的范数/裁剪接口,确保每个独立参数贡献只计一次。

05 / GLOBAL NEGATIVES

跨卡负例一样,梯度就一定一样吗?

固定 q=[1,2]、d=[1,−1],每个 rank 拥有一对正样本。使用单向点积相似度与温度 τ,不做向量归一化。每个 query 以自己的 document 为正例,另一份为负例。

pij=exp⁡(qidj/τ)∑kexp⁡(qidk/τ),L=−12∑i=01log⁡pii,∂L∂dj=12τ∑i(pij−1[i=j])qi.\begin{aligned} p_{ij}&=\frac{\exp(q_i d_j/\tau)}{\sum_k\exp(q_i d_k/\tau)},\\ \mathcal L&=-\frac12\sum_{i=0}^{1}\log p_{ii},\\ \frac{\partial\mathcal L}{\partial d_j}&=\frac{1}{2\tau}\sum_i(p_{ij}-\mathbf 1[i=j])q_i. \end{aligned}
同一个 dⱼ 在两个 query 的候选集中出现,所以它的梯度需要汇总两行贡献。表格中的表示梯度已经包含全局平均系数 ½。

前向概率与文档梯度贡献

两个逻辑 rank · 同一组表示
当前全局平均 loss
完整目标参考 loss
文档梯度最大差
Queryd0=1:logit / 概率d1=−1:logit / 概率
文档表示来自 query 0来自 query 1实际保留的梯度完整目标梯度

τ=1 时,保留和切断远端梯度的两种方案都有 loss≈2.072539;d0 的梯度分别为 +0.922412 和 −0.059601。这个差异发生在明确的“每卡只计算本地 query、远端表示无梯度、没有补偿”的实现中。若每卡重复计算完整目标或采用其他 gather backward,必须重新核对系数与拥有关系。

06 / FROM REPRESENTATIONS TO PARAMETERS

表示梯度汇合之后,DDP 还平均什么?

再加两个共享标量参数:qᵢ=wq·aᵢ,dᵢ=wd·bᵢ,在 wq=wd=1 处计算。每卡回传未除以 2 的本地 query loss;可微 gather 的反向按 document 拥有者求和。得到本卡源输入对共享参数的贡献后,DDP 再平均两卡参数梯度。

拥有者本地 query lossDDP 前的 wq 梯度DDP 前的 wd 梯度

表示汇合与参数平均各有作用

先把不同 query 对同一远端 document 的导数送回拥有者,再由各 rank 反传到共享编码器参数。最后的 DDP 平均定义了这里的两样本平均目标,不能再额外除一次 2。

累积不改变已经计算的候选集合

每次只放一对样本时,本例没有负例,loss 和梯度都是零。跨 microbatch 保留全局候选需要额外设计;梯度缓存类方法分开表示计算、全局损失与编码器重算,还需匹配随机状态。

独立框架实验会启动两个 CPU Gloo 进程,分别运行可微 gather、远端 detach 与单样本候选三种方案,并比较 DDP 后的参数梯度和一次 SGD 更新。页面本身只执行可检查的逻辑计算,不在浏览器创建进程或预测通信时延。

CPU EXPERIMENT / FULL TRANSFORMER

完整模型里,拆成微批和两进程后还是同一次更新吗?

复用自然语言项目 seed 11 的最终权重、387-token 词表和四个真实 96-token 窗口,保持全部输入不变,人工指定各条末尾有多少标签提供监督。比较完整 batch、按全局标签归一化的累积、微批均值等权,以及实际两个 CPU Gloo 进程中的默认 DDP 平均。

这组监督后缀用来隔离分母变化,没有套用聊天模板或训练新的回答能力。所有分支从同一权重开始;AdamW 恢复同一第 800 步状态,SGD 使用同一权重和全新状态,两种优化器各自与自己的参考比较。

计数相等时,错误规则可能碰巧通过

每个微批都是相同数量的标签时,微批均值等权与 token 均值一致。仍需要不等量监督和非完整尾窗口来验证实现;不能只拿一个均匀 batch 作为证据。

空监督需要比较完整状态

全局 N=0 时没有定义 token 均值,应协调跳过。把零损失送进反向后仍调用 optimizer,可能因为权重衰减或历史矩继续改变参数和步数。相同的零梯度并不证明这次更新没有副作用。

完整来源保存初值、优化器初始状态、原窗口、监督规则、每条实际梯度、双进程独立输出哈希和一次更新的状态。正确路径以 2e−10 为容差核对全部参数;保留负例和等量对照。实验使用 CPU float64、固定无 dropout 前向,不做 CUDA/NCCL、AMP、裁剪或训练质量结论。

07 / VALIDATION

怎样证明并行改动没有悄悄改目标?

固定初始权重、完整样本集合、mask 与 loss 定义,用单卡作为参考。分别比较聚合 loss、选定层梯度、全局 norm、一次更新后的参数差。先去掉随机性并提高精度隔离公式问题,再恢复目标精度/随机机制检查容差和训练趋势。

覆盖不同长度、空标签副本、尾 batch、重复 token、非整除切分与累积窗口。分布式 sampler 为整除而复制样本也会改变一次 epoch 的统计;实际消费样本与 token 才是证据。即使各卡 loss 相同,也应继续比较聚合梯度和更新后的参数。

08 / GLOBAL GRADIENT NORM

梯度分散在多张卡,裁剪系数怎样统一?

先完成约定的梯度同步与归一化,并对缩放梯度 unscale。随后对所有独立参数的梯度计算一个范数。这里的复制参数已具有相同的同步后梯度;每个独立元素指定一个统计拥有者,其余副本不重复计数。

sr=∑j∈Urgj2,n=∑rsr,c={1,n=0,min⁡(1,τ/n),n>0,gj′=c gj.\begin{aligned} s_r&=\sum_{j\in\mathcal U_r}g_j^2,\qquad n=\sqrt{\sum_r s_r},\\ c&=\begin{cases}1,&n=0,\\\min(1,\tau/n),&n>0,\end{cases}\\ g'_j&=c\,g_j. \end{aligned}
Uᵣ 是 rank r 负责计数的独立梯度集合;每个独立元素出现一次。τ 为非负 L2 阈值;示例用精确比例,不添加框架可能使用的 epsilon。

两 rank:拥有关系、统一系数与更新

Scale=8 · 初始参数=1 · SGD η=0.1
正确全局范数
实际裁剪后的独立梯度范数
更新决策

Rank参数 ID缩放值 → unscale正确统计归属实际系数应用的梯度更新后参数

默认梯度 [3,4] 的全局范数是 5,阈值为 1,统一系数是 0.2,结果为 [0.6,0.8]。各卡独立裁剪则得到 [1,1],整体范数 √2。加入复制梯度 12 后,正确范数为 13;把两个副本都计入会得到 √313,改变裁剪强度。

09 / COORDINATE THE STEP

一张卡溢出时,哪些状态一起停下?

01 / UNSCALE

还原与检查

累积窗口完成后,以同一个 scale 还原梯度;每卡计算非有限标志。

02 / AGREE

先统一有效性

归约非有限标志。任何 rank 无效,全部 rank 执行相同的跳步决策。

03 / REDUCE

归约独立平方和

有限时按拥有关系统计,得到全局范数和统一裁剪系数。

04 / UPDATE

推进同一训练步

有限更新才改变参数、优化器历史和成功更新计数;scaler 变化按自己的策略处理。

面板的跳步只显示无动量 SGD 参数;并不模拟完整 GradScaler。独立 Gloo 验证为对照方便按固定顺序完成三个小标量归约;真实训练可以在全局无效之后协调跳过平方和归约,但各 rank 的 collective 顺序必须一致。

这里是“按独立元素指定统计拥有者”的明确协议,不调用 FSDP 的裁剪 API。实际 DP×TP/FSDP 布局应依据参数分片元数据选择对应接口;复制、分片和未同步梯度不能混为一谈。

适用范围与一手资料

token 目标、对比学习和裁剪分别声明归约。新增固定 298,176 参数 Transformer 的 CPU float64 累积、两进程 Gloo/DDP、SGD 与保存 AdamW 状态的一步更新,保留尾窗口、空监督和错误归一化。监督后缀人工指定以隔离分母,不评估聊天模板、训练质量或 GPU 性能。裁剪另用独立元素拥有者和协调跳步协议,不调用 FSDP API 或完整 scaler。

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