Skip to content

【No.11】训练慢卡诊断与平台上报设计(RFC) #357

Description

@shanyulu

提案人:@shanyulu · 导师:@Lemon-412 · 实现:Draft PR #378

1. 目标与边界

训练变慢时,首先要回答:哪个 rank、哪个阶段出现持续偏差,比较对象是否可比,证据能支持到哪一步。 本提案复用 Megatron timer,记录 host 与 CUDA stream 区间,在后台汇总窗口,并接入 Relax 现有日志和 TensorBoard。

功能默认关闭。公开产品版本为 a48a23b,当前头 CI 8/8 通过;性能与诊断验收仍未完成,PR 保持 Draft。CI 证明回归检查通过,不替代下文的 C1/C2/C3 实验。

官方 Task 11要求:整体性能开销小于 0.5%;真实 E2E 不影响训练精度、loss 和既有通算重叠收益;通过现有平台实时、清晰地定位慢卡。下文的置信区间、配对实验和参数比较是本提案采用的验证方法,不是额外声称的官方条款。

2. 接入架构

flowchart TB
  subgraph capture["各训练 rank · 采样与读回"]
    direction LR
    T["Megatron timer<br/>host 计时 / CUDA event"] --> Q["有界队列<br/>区间结束时绑定上下文"]
    Q --> R["后台读回<br/>事件就绪后读取耗时"]
  end
  subgraph aggregate["global rank 0 · 进程内汇总"]
    direction LR
    C["Collector<br/>去重 / 迟到 / 丢弃计数"] --> D["Detector<br/>可比集合 / 连续窗口"]
    D --> J["JSONL<br/>计时事实与判定"]
  end
  R -->|"本 rank 直送;其他 rank 经后台 TCP"| C
  D --> S["rollout 节奏读取摘要"]
  S --> L["既有日志 / TensorBoard<br/>确认告警归属仍需修复"]
  classDef blue fill:#eaf2ff,stroke:#4778b8,color:#142d4e
  classDef green fill:#eaf6ee,stroke:#488766,color:#173c29
  classDef amber fill:#fff4dd,stroke:#bc8734,color:#51360b
  style capture fill:#f3f6fa,stroke:#9eacc1,color:#203651
  style aggregate fill:#f3f6fa,stroke:#9eacc1,color:#203651
  class T,Q,R blue
  class C,D,J green
  class S,L amber
Loading

图示为启用 CUDA 计时、配置共享 collector 地址的路径。Collector 位于 global rank 0 的训练进程内,不是独立服务;未配置共享地址时,各 rank 仅本地汇总,不能获得完整跨 rank 诊断。

层次 职责 不承担的职责
Timer shim 沿用 Megatron 计时挂点;记录 host 区间、CUDA event 和上下文 不开启全程 profiler,不据此宣称开销已经达标
Observer 有界排队、后台设备读回、记录降级与丢弃 不保证无损采集;不等待所有 rank 到齐
Collector 汇总 envelope,按运行、拓扑版本、rank、序号去重 不新增训练 collective,不负责训练调度
Detector 按拓扑与工作量选参照,判断持续异常与恢复 不把耗时差异直接归因为硬件、网络或算子故障
Reporter 导出已有性能日志与 TensorBoard 指标 当前不是逐事件实时推送;平台告警归属仍有缺口

源码入口:timer shim、observer、runtime。

为什么选择这条路径

沿用 timer 可以覆盖训练阶段而不要求持续开启 Kineto;将 CUDA event 读回移到后台,避免为观测显式等待设备。但采样、排队、序列化和汇总仍有成本,必须实测。Kineto 仅用于独立检查 overlap,不能用其 trace 反证本功能的常驻开销已低于 0.5%。

CUDA event 给出的是流上可观察区间,可能包含等待,不等于纯 kernel 时间或纯 NCCL 通信时间。嵌套或重叠阶段也不能直接相加为整步耗时。

3. 记录顺序与失败行为

区间结束时绑定 workload 和 step 上下文,再进入读回队列;不能在读回时取“当前 step”,否则会把第 N 步计时与第 N+1 步工作量拼接。序号按区间完成顺序分配,不按开始顺序分配。

情况 当前行为与限制
CUDA event 尚未就绪 后台轮询;超出读回限制后降级,设备耗时不可用,不填成 0
设备计时路径中出现 host-only 记录 仍走同一待处理队列,避免越过更早的设备记录
纯 host-only / 无 CUDA 模式 可在调用线程直接交付;不能概括为“所有汇总都在后台”
队列耗尽、记录迟到或重复 有界处理并独立计数;丢失不等于正常样本
后续没有新记录 窗口不会仅因墙钟到期就自动结算;需后续记录推进或显式 flush
摘要读取 当前公开实现仍有日志副作用;“训练线程完全无日志 I/O”不是已实现保证

默认窗口为 5 秒,但这不是“5 秒内平台可见”的 SLA:窗口推进、连续判定、导出节奏和平台接收是不同环节,必须分别测量。

4. 如何判断慢 rank

先按拓扑与阶段建立 cohort,再为每个 rank 选择工作量可比的参照成员。比较值为该 rank 的窗口 host 耗时中位数,相对其可比集合中最快成员的偏差;不是相对全体 rank 最快值,也不是相对 cohort 平均值。

工作量使用单样本 token 数的窗口中位数,避免“慢 rank 在窗口内完成更少样本”被误当成工作量不同。判定实现保留参照成员、有效覆盖和工作量证据。

flowchart LR
  N["未告警"] -->|"慢窗口满足门槛"| C["候选<br/>累计连续窗口"]
  C -->|"默认连续 3 窗"| A["已告警<br/>straggler"]
  C -->|"不确定或窗口间隙<br/>中断连续性"| N
  A -->|"证据不足<br/>保留告警"| A
  A -->|"有效证据回到阈值内<br/>recovered"| N
  classDef neutral fill:#eaf2ff,stroke:#4778b8,color:#142d4e
  classDef candidate fill:#fff4dd,stroke:#bc8734,color:#51360b
  classDef alert fill:#fcebed,stroke:#b85e6a,color:#59232c
  class N neutral
  class C candidate
  class A alert
Loading

图示为有足够参照成员、未触发有界状态淘汰时的告警生命周期。默认相对阈值为 5%,并有绝对耗时门槛;低于门槛的相对偏差不能单独触发告警。候选连续计数与已生效告警分开维护:不确定窗口会打断新告警的连续性,但不能作为恢复证据。

工作量缺失与不可比必须区分:

  • 有工作量、但找不到足够可比参照:不作有效慢卡判断,记录不确定或不足原因。
  • 工作量缺失:当前实现退回 cohort 时间比较,并标记 workload_evidence_degraded=true;仍可能产生判定。它不是“已证明等工作量”,也不是一律输出 uncertain。
  • host_only_stall、gpu_stream_stall 是诊断提示;根因仍需结合训练、通信或设备证据确认。

5. 当前验收与实验结果

所有数据固定在证据分支(tip b9c01f2,含复核更正记录、严格验收门禁工具、测量臂原始日志与 16 件原始 trace 归档)。实验结论只适用于对应 manifest 的产品版本;旧版本 pilot 不迁移为当前头性能验收。

验收 产品版本 结果 尚缺什么
C1:整体开销 <0.5% e961661 INCONCLUSIVE;6 对 pilot 均值 +0.417%,95% CI [-1.295%, +2.023%] 主指标裁决;最终产品上的固定样本量确认实验
C2:loss 等训练指标 a48a23b 两对 ON/OFF 的 loss、梯度范数、学习率和 token 检查通过 这些检查不能代替参数比较
C2:参数等价 a48a23b 未证明;两对 checkpoint 树哈希不同 保留可比较 checkpoint,实际执行参数比较
C2:通算重叠 a48a23b NOT PASS;冻结包络超界约 6.2e-5 独立 OFF/OFF 跨会话校准与新预注册验证
C3:定位与平台上报 a48a23b 部分完成;6 条 straggler:rank 3 五条、rank 2 一条 非目标告警解释、平台确认告警归属、事件延迟与末窗验证

C1:点估计不是通过结论

%%{init: {"themeVariables": {"xyChart": {"plotColorPalette": "#2969a6,#bd6530"}}}}%%
xychart-beta
  title "C1 pilot:配对开销与验收阈值"
  x-axis ["S1 AB", "S2 BA", "S3 AB", "S4 BA", "S5 AB", "S6 BA"]
  y-axis "相对 OFF(%)" -3.5 --> 3
  line [2.177, 1.779, -2.308, 2.433, 1.393, -2.970]
  line [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
Loading

A 为 OFF,B 为 ON;每臂 48 步。折线各点为每对整段 perf/train_time 均值的相对差,横线为 0.5% 参考线;连线仅便于辨认配对,不作趋势拟合。最终判定使用配对差的均值及其区间上界,不是数有几个配对低于横线。

Δᵢ = 100 × (mean(ONᵢ) / mean(OFFᵢ) − 1);6 个 Δᵢ 的均值为 +0.4174268%。按 pair 重采样的 bootstrap 95% CI 上界为 +2.0227648%,因此不能证明开销小于 0.5%。原始判定与配对值。

C2:分清指标一致、参数等价和 overlap

两对训练指标对照中,loss 最大绝对差分别为 0.10148、0.03789,均在预先固定的 0.13927 包络内;学习率序列一致,token 差为 0。但旧分析器在 checkpoint 不同的非确定分支未实际比较张量,顶层 PASS 不能解释为参数等价通过;复核后的正式判定为 C2_COMPARE_REVIEWED.json:INCOMPLETE——0 项指标违规、2 项参数证据缺失,干净克隆复算命令按预期退出码 1。

DP4 overlap 结果中,OFF 为 0.428402,ON 为 0.428249;下降约 1.5291e-4,大于冻结允许下降 9.0912e-5。原 NOT PASS 保留。跨会话波动是待检验解释,不能在看过 ON 后放宽旧容差。

四臂 cudaDeviceSynchronize 计数均为 68,只支持该 API 计数一致,不能写成“排除了所有新增全局同步”。测量臂原始 job.log 已入库存档(原始件 + RFC1918 脱敏公开件 + 双哈希台账 + 扫描报告,f69343f8);16 件原始 chrome trace 亦已入库存档(b9c01f2,gitleaks 全量扫描 16/16 PASS、零发现、无需脱敏,附双哈希台账),干净克隆可复算 overlap 判定(已验证 exit 1、NOT_PASS、13/13 字段一致)。

C3:已检出异常,不等于平台验收完成

减速臂原始判定显示注入目标 rank 3 有五条告警,非注入 rank 2 有一条;该条是误报还是次生影响,尚不能定性。健康对照本轮没有 straggler,不能推广为总体误报率为零。

平台摘要的 worst_rank 目前从各类判定中选最大偏差,uncertain 可能遮蔽确认告警。旧“p50 0.60 s / p95 1.20 s”来自日志与文件增长间隔,已撤回,不是事件端到端延迟(复核记录 c3_summary_slow_reviewed.json:延迟字段记 UNMEASURED,旧时间差保留供审计)。后续需用同一事件身份关联区间结束、判定、落盘和平台接收,保留原始时延,并覆盖最后一个窗口及停止产生日志的场景。

6. 支持范围与待决定事项

范围 当前实现 / 证据 本期边界
训练阶段 既有 forward/backward、通信、optimizer timer 挂点 区间与提示,不承诺硬件根因定位
Attention / MoE schema 预留 没有对应真实插桩验收,是否接受须由导师确认
拓扑与规模 当前真机证据集中在单机 dense DP4 不外推为多机、MoE 或复杂 PP 已验收
平台导出 rollout 节奏接入现有日志 / TensorBoard 是否满足“实时”待裁决
PP > 1 汇总者为 global rank 0,导出主 rank 可能位于末 PP stage 平台汇总归属未闭合,不宣称完整支持

以下三项待导师确认,决策与后续结果统一维护在本节:

  1. C1 主指标:以 perf/train_time 还是 whole-job wall-clock 判定整体开销;另一项保留为辅助指标。
  2. C3 实时语义:现有 rollout-cadence 导出是否可接受;若不可接受,先审最小异步导出设计。
  3. Attention/MoE 范围:本期是否要求实际粗粒度插桩,而非仅 schema。

下一阶段先补公开产品中的确认告警导出与摘要读取问题,再补参数比较、独立 overlap 验证、C3 事件链与可下载输入。C1 在主指标、产品版本、样本量、分析器和停止规则冻结后运行,不增加试次直到通过。未通过项只有完成验证或取得维护者明确认可的替代验收,才能作为转正式审查的依据。

早期设计与机制实验(不计入当前产品验收)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions