mindspore-ai / mindspore-ai/hyper-parallel
MindFormers 训练调试能力与 HyperParallel Trainer 差距分析
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 53
- Forks
- 63
- Avg merge
- 23h 45m
- Merged PRs (30d)
- 63
Description
1. 范围与统计口径
- 分析快照:MindFormers
d38171030(2026-07-18),HyperParallelee839216(2026-07-24)。 - MindFormers 静态图:传统
Trainer、mindspore.Model、GRAPH_MODE/training_graph链路。 - MindFormers 动态图:
mindformers.pynative.trainer.Trainer的 MindSpore PyNative 链路。 - HyperParallel:特指
/home/fdw/code/hyper-parallel/hyper_parallel/trainer。它当前实际是 PyTorch eager Trainer;核心并行库存在某项能力,不等于 Trainer 已经接入。 - 本文只统计训练调试、监控、性能/显存分析和高可用能力,不统计普通训练算法或纯显存优化能力。
状态说明:
- ✅:Trainer 主链路已经接入,可通过正式配置或 callback 使用。
- ⚠️:部分支持、依赖特定模型/底层组件,或存在配置接线缺陷。
- ❌:当前 Trainer 不支持。
- “使用频率”统一预留为“待补充”,后续可按实际业务情况填写“高/中/低”或使用次数。
2. 精度与训练状态监控
| 功能点 | 含义与作用 | 典型使用场景 | MindFormers 静态图 | MindFormers 动态图 | HyperParallel | 使用频率 | 使能方式与限制 |
|---|---|---|---|---|---|---|---|
| Loss 监控 | 输出训练 loss,确认收敛趋势和异常跳变 | 日常训练看盘、版本回归 | ✅ | ✅ | ✅ | 待补充 | 静态图使用 MFLossMonitor;动态图使用 LossCallback;HyperParallel 使用 train.logging.log_steps |
| 学习率监控 | 输出当前 optimizer learning rate,辅助判断 loss 变化是否符合调度策略 | warmup、衰减和断点续训检查 | ✅ | ✅ | ✅ | 待补充 | 三者均随基础训练日志输出 |
| Global grad norm | 观察全局梯度规模,定位梯度爆炸、消失和并行规约错误 | 混合并行训练稳定性检查 | ✅ | ✅ | ✅ | 待补充 | MindFormers 随 loss callback 输出;HyperParallel 训练循环提供 DTensor-aware global norm |
| Overflow 状态监控 | 记录数值溢出状态,辅助定位低精度训练不稳定 | fp16 训练出现 loss 抖动或停滞 | ✅ | ⚠️ | ❌ | 待补充 | 静态图 MFLossMonitor 直接输出;动态图基础日志没有与静态图等价的独立 overflow 指标 |
| 分项 Loss | 分离主 loss、MoE auxiliary loss、MTP loss、indexer loss | MoE、MTP、DSA 精度问题归因 | ✅ | ✅ | ⚠️ | 待补充 | 静态图 MFLossMonitor(print_separate_loss=true);动态图 LossCallback;HyperParallel 仅 MoE aux loss 有实现且 MoE callback 配置路径有缺陷 |
| Micro/local loss | 记录每个 micro-batch 的局部 loss,定位梯度累积过程中的异常样本或 stage | 梯度累积、PP loss 分叉 | ✅ | ✅ | ✅ | 待补充 | 静态图 monitor_config.local_loss_format;动态图 monitor.train_state.local_loss;HyperParallel train.monitor.monitor_on: true、local_loss_format: [log, tensorboard],从 on_substep_end 采集 raw micro loss |
| Device-local/rank-local 累积 loss | 在当前 rank 内按 token 加权汇总一个 step 的 micro loss,识别局部卡异常 | 单卡正常、多卡 loss 分叉 | ✅ | ✅ | ✅ | 待补充 | MindFormers 使用 device loss 配置;HyperParallel train.monitor.device_local_loss_format 输出 loss/device_accum_local_loss,当前不做跨 rank 聚合 |
| 参数级 local grad norm | 在通信规约前按参数记录本地梯度 norm,并支持目标参数筛选 | 定位具体层梯度爆炸或消失 | ✅ | ✅ | ✅ | 待补充 | MindFormers 使用 local_norm 配置;HyperParallel train.monitor.local_norm_format,并可配 target 正则和 invert |
| Device-local/rank-local grad norm | 聚合当前设备所有被监控参数的本地梯度 norm | 定位 rank 或并行 stage 间精度不一致 | ✅ | ✅ | ✅ | 待补充 | MindFormers 使用 device norm 配置;HyperParallel train.monitor.device_local_norm_format 输出 grad/device_local_norm,当前不做跨 rank 聚合 |
| Loss/梯度 NaN、Inf 检查 | 在异常值污染后续权重前终止训练并报告 | 算子异常、数值不稳定、脏数据 | ✅ | ❌ | ⚠️ | 待补充 | 静态图 check_for_nan_in_loss_and_grad: true;动态图未接入;HyperParallel 已修复 train.debug.check_nan_inf 接线,但只检查 global grad norm,且只有 rank 0 抛异常 |
| Global norm spike 检测 | 按阈值识别梯度尖峰,可累计异常次数、跳过异常数据或触发错误 | 偶发脏样本和训练自动治理 | ✅ | ❌ | ❌ | 待补充 | 静态图配置 check_for_global_norm、global_norm_spike_threshold、global_norm_spike_count_threshold |
| Weight norm | 记录参数权重 L2 norm,观察参数漂移或层间异常 | loss 正常但权重更新异常 | ✅ | ❌ | ❌ | 待补充 | 静态图 monitor_config.weight_state_format |
| Optimizer moment norm | 记录 Adam 一、二阶矩 norm,排查优化器状态污染或恢复不一致 | checkpoint 续训精度不一致 | ✅ | ❌ | ❌ | 待补充 | 静态图 monitor_config.optimizer_state_format |
| Stable rank/最大特征值 | 估计矩阵 stable rank 和最大特征值,观察权重退化或表征塌缩 | 长周期训练稳定性和 MoE expert 退化分析 | ✅ | ❌ | ❌ | 待补充 | 静态图 monitor_config.stable_rank_config,支持参数筛选、聚合和采样周期 |
| Attention max logits | 输出逐层、逐 head 的 attention logits 最大值及整体最大值,识别 QK 放大和 softmax 饱和 | Attention 数值稳定性、QK clip 调优 | ✅ | ✅ | ❌ | 待补充 | 静态图 monitor_config.max_attention_logit_format;动态图加入 MaxLogitsMonitor(step_interval=N);均依赖模型支持 track_max_attention_logit |
| Attention mean_sum | 记录 attention mean_sum,与 max logits 结合判断整体分布和局部极值 |
Attention 稳定性趋势分析 | ❌ | ❌ | ❌ | 待补充 | 当前源码没有名为 mean_sum 的指标;MindFormers 两种模式现有的是各层/各 head 最大值的整体 mean,不能直接等同于 mean_sum |
| MoE max_vio | 衡量最热 expert 相对理想均衡负载的最大偏离,常用定义为 max(load_i) / mean(load) - 1,直接反映路由稳定性 |
Loss-Free Balancing、路由偏置和热点 expert 调优 | ⚠️ | ⚠️ | ⚠️ | 待补充 | 三者均未直接输出名为 max_vio 的指标;静态图可从 expert_load、动态图可从 tokens-per-expert、HyperParallel 可从核心 tokens_per_expert 推导。HyperParallel Trainer 的 MoE callback 还存在配置路径缺陷 |
| Tokens per expert/expert load | 记录各 MoE expert 接收的 token 数或负载 | 路由热点、负载不均和容量规划 | ✅ | ✅ | ⚠️ | 待补充 | 静态图 MoE callbacks;动态图 monitor.moe_monitor.save_tokens_per_expert_interval;HyperParallel 核心能同步计数,但 Trainer callback 错读配置且未输出完整直方图 |
| MoE drop rate | 记录容量不足造成的 token drop 比例 | MoE 容量因子和路由调优 | ✅ | ❌ | ❌ | 待补充 | 静态图加入 MoEDropRateCallback |
| Expert 冷热与迁移监控 | 识别长期冷热 expert,并观察 expert 调整/迁移状态 | MoE 长尾负载和热点治理 | ✅ | ❌ | ❌ | 待补充 | 静态图 ColdHotExpertMonitor、ExpertMigrateCallback |
| TensorBoard 指标落盘 | 将训练指标写入统一事件文件,支持曲线对齐和实验比较 | 长训练监控、版本对比 | ✅ | ✅ | ⚠️ | 待补充 | 静态图配置 tensorboard.tensorboard_dir;动态图配置 monitor.tensorboard.output_dir;HyperParallel train.monitor.*_format: [tensorboard] 已能写 local/device loss/norm 和 rank 0 global loss/norm,但通用 TensorBoardCallback 仍是 stub |
| 确定性与复现开关 | 固定随机种子并打开计算/通信确定性,缩小并行精度问题排查范围 | 单卡/多卡对齐和回归复现 | ✅ | ✅ | ✅ | 待补充 | 静态图 train_precision_sync: true;动态图使用确定性训练配置;HyperParallel train.debug.deterministic: true |
主要源码入口:
- 静态图:
mindformers/core/callback/callback.py:348、:805、:993、:1172、:1411、:2853。 - 动态图:
mindformers/pynative/callback/loss_callback.py:33、mindformers/pynative/tools/monitor.py:145、:288、:534、mindformers/pynative/callback/max_logits_monitor.py:38。 - HyperParallel:
hyper_parallel/trainer/callbacks/base.py:156、:679、:758、:1101、:1176,hyper_parallel/trainer/base.py:1023、:1437,hyper_parallel/core/moe_utils.py:37。
3. 性能监控与 Profiler
| 功能点 | 含义与作用 | 典型使用场景 | MindFormers 静态图 | MindFormers 动态图 | HyperParallel | 使用频率 | 使能方式与限制 |
|---|---|---|---|---|---|---|---|
| Step time | 记录单步耗时,发现性能回退和周期性抖动 | 日常性能看盘、版本对比 | ✅ | ✅ | ✅ | 待补充 | 三者均随训练日志输出 |
| Samples/tokens throughput | 输出 samples/s 或 tokens/s,衡量端到端训练效率 | 并行策略和 batch size 调优 | ✅ | ✅ | ✅ | 待补充 | MindFormers 基础 loss callback;HyperParallel train.logging.report_throughput: true |
| TFLOPS | 按模型 FLOPs 和 step time 估算设备计算吞吐 | 算力利用率和实现性能比较 | ✅ | ✅ | ⚠️ | 待补充 | MindFormers 可自动结合模型计算量;HyperParallel 必须手工填写 model_flops_per_token |
| MFU | 计算模型 FLOPs 相对设备理论峰值的比例 | 判断计算、通信或调度瓶颈 | ⚠️ | ⚠️ | ⚠️ | 待补充 | MindFormers 可由 TFLOPS 与设备峰值换算;HyperParallel 还需手工填写 peak_tflops |
| ETA/训练进度 | 根据近期 step time 估计剩余训练时间 | 长任务排期和异常停滞发现 | ✅ | ⚠️ | ✅ | 待补充 | 静态图 MFLossMonitor;HyperParallel Progress callback 使用 tqdm |
| Profiler 按 step 调度 | 只采集指定训练区间,降低采集开销 | warmup 后抓取稳定 step | ✅ | ✅ | ❌ | 待补充 | MindFormers 配置 start/stop step;HyperParallel ProfilerCallback 目前没有创建或驱动 torch.profiler |
| Profiler rank 筛选 | 只在指定 rank 采集,控制多卡 trace 规模 | PP stage 或异常 rank 定点分析 | ✅ | ✅ | ❌ | 待补充 | 静态图支持 profile_rank_ids/每 PP stage 取卡;动态图 profiler 支持 rank 配置 |
| CPU/NPU activity | 同时采集主机和设备侧执行活动 | host launch、数据准备和设备计算关联分析 | ✅ | ✅ | ❌ | 待补充 | MindFormers Profiler activity 配置 |
| 通信性能采集 | 记录集合通信事件及耗时,定位 DP/TP/PP/EP 通信瓶颈 | 扩卡效率差、通信等待高 | ✅ | ✅ | ❌ | 待补充 | MindFormers profiler 打开 profile_communication |
| DTensor 算子/Collective 通信追踪 | 记录 DTensor op、模块层级、collective 类型/次数、参数和 sharding 信息,生成层次化调用表 | 定位某个模型模块引入了哪些隐式通信 | ❌ | ❌ | ⚠️ | 待补充 | HyperParallel 核心可使用 with CommDebugMode(model) as mode,再调用 generate_comm_debug_tracing_table() 或 get_comm_counts();支持 Torch/MindSpore,但尚未接入 Trainer 配置和按 step/rank 调度 |
| Profiler 显存事件 | 将分配释放事件写入 trace,关联算子和显存峰值 | 显存峰值和泄漏定位 | ✅ | ✅ | ❌ | 待补充 | MindFormers profiler 打开 profile_memory |
| Profiler level | 通过 Level 0/1/2 控制采集粒度和开销 | 快速概览与深度根因分析切换 | ✅ | ✅ | ❌ | 待补充 | MindFormers 配置 profiler_level |
| Python stack | 记录事件对应 Python 调用栈 | 将热点算子映射回模型代码 | ✅ | ✅ | ❌ | 待补充 | MindFormers profiler 打开 with_stack |
| MSTX 标记 | 写入训练 step、模块或用户区间标记,改善时间线可读性 | 复杂并行时间线分段 | ✅ | ✅ | ❌ | 待补充 | MindFormers profiler 打开 MSTX 相关配置 |
| 数据简化 | 删除大体积冗余 trace 数据,降低落盘与解析开销 | 大规模多卡 profiler | ✅ | ✅ | ❌ | 待补充 | MindFormers profiler 使用 data_simplification |
| 并行策略 metadata | 将 DP/TP/PP/CP/EP 等并行信息随 trace 保存 | 分析通信事件属于哪个并行维度 | ✅ | ✅ | ❌ | 待补充 | MindFormers profiler/Trainer 自动补充并行 metadata |
| 吞吐基线与线性度 | 对比基准吞吐,判断当前吞吐是否异常及扩卡是否线性 | 持续性能回归和扩卡验收 | ✅ | ❌ | ❌ | 待补充 | 静态图 TrainingStateMonitor 配置 throughput baseline/linearity |
| 数据等待时间 | 单独统计 dataloader/取数等待,区分数据瓶颈和计算瓶颈 | step time 抖动、设备空闲 | ❌ | ❌ | ❌ | 待补充 | 三套 Trainer 当前没有统一的一等指标,需新增 step 分段计时 |
| PP bubble/stage imbalance | 统计 pipeline bubble 和各 stage 前后向耗时差异 | PP 切层、micro-batch 数量调优 | ❌ | ❌ | ❌ | 待补充 | 可从 trace 人工分析,但尚无直接汇总指标 |
主要源码入口:
- 静态图:
mindformers/core/callback/callback.py:348、:805、:2264,mindformers/trainer/trainer.py:1115。 - 动态图:
mindformers/pynative/tools/profiler.py:40、mindformers/pynative/trainer/trainer.py:884。 - HyperParallel:
hyper_parallel/trainer/callbacks/base.py:156、:592,hyper_parallel/trainer/config.py:293,hyper_parallel/core/dtensor/debug/_comm_debug_mode.py:47。
4. 显存分析
本节只统计显存观测和问题定位能力,不统计降低显存占用的训练策略。
| 功能点 | 含义与作用 | 典型使用场景 | MindFormers 静态图 | MindFormers 动态图 | HyperParallel | 使用频率 | 使能方式与限制 |
|---|---|---|---|---|---|---|---|
| Profiler memory trace | 采集分配、释放和峰值相关事件,并与执行时间线关联 | 显存峰值来源和生命周期分析 | ✅ | ✅ | ❌ | 待补充 | MindFormers profiler 设置 profile_memory: true;HyperParallel memory profiler 未实现 |
| 算子/调用栈显存归因 | 结合 memory trace 和 stack 将显存事件定位到算子与 Python 代码 | 找出高占用算子或模块 | ✅ | ✅ | ❌ | 待补充 | MindFormers 同时打开 profile_memory 和 with_stack |
| Current allocated/reserved | 周期输出当前已分配和已预留显存,观察常驻占用和碎片趋势 | 长训练疑似泄漏、reserved 持续增长 | ❌ | ❌ | ❌ | 待补充 | MindFormers 只能通过重型 profiler 间接分析;HyperParallel MemoryMonitorCallback 为 stub |
| Step peak allocated/reserved | 每 step 记录峰值并 reset,快速关联突增 step | 动态 shape、长序列或偶发 batch 引发峰值 | ❌ | ❌ | ❌ | 待补充 | 三者均缺少轻量级逐 step peak monitor |
| Rank 间显存对比 | 汇总各 rank 峰值,定位 PP/EP 切分不均或单卡热点 | 某个 rank OOM、其他 rank 空闲 | ❌ | ❌ | ❌ | 待补充 | 可分别抓 profiler 后人工对比,但没有训练期统一聚合指标 |
| 显存碎片指标 | 输出 allocated、reserved、inactive split 等碎片信息 | 有空余但申请失败、运行时间越长越易 OOM | ❌ | ❌ | ❌ | 待补充 | 当前无 Trainer 级轻量指标 |
| OOM 自动诊断包 | 捕获 OOM 时保存最近 step 指标、显存摘要、快照和相关配置 | 难复现的长训练 OOM | ❌ | ❌ | ❌ | 待补充 | 三者均没有完整自动化链路 |
| Memory snapshot/timeline | 保存可离线查看的分配调用栈、生命周期和对象关系 | 深度分析泄漏和生命周期过长 | ⚠️ | ⚠️ | ⚠️ | 待补充 | MindFormers profiler 能提供 trace 级信息;HyperParallel 新增离线 memory_analysis.html,可读取 block CSV 展示无碎片/理论/含碎片显存曲线,但 Trainer 不负责采集和自动打开 |
| 峰值解释与激活点差异分析 | 查看峰值时存活内存块,按维度解释峰值,并比较两个时间点的新增、释放和共同存活块 | 查找峰值构成、生命周期过长和显存净增长来源 | ⚠️ | ⚠️ | ⚠️ | 待补充 | HyperParallel 使用 hyper_parallel/tools/memory_visualizer/memory_analysis.html 离线导入 block CSV;支持峰值明细、解释器、A/B diff 和 CSV/JSON 导出,但尚未接入 Trainer/OOM 自动诊断链路 |
主要源码入口:
- MindFormers:
mindformers/core/callback/callback.py:2264、mindformers/pynative/tools/profiler.py:40。 - HyperParallel:
hyper_parallel/trainer/callbacks/base.py:1197、hyper_parallel/trainer/config.py的MemoryMonitorConfig、hyper_parallel/tools/memory_visualizer/memory_analysis.html。
5. 高可用、快速恢复与 Checkpoint
| 功能点 | 含义与作用 | 典型使用场景 | MindFormers 静态图 | MindFormers 动态图 | HyperParallel | 使用频率 | 使能方式与限制 |
|---|---|---|---|---|---|---|---|
| 周期 checkpoint | 按 step 保存模型和训练状态,限制故障回退长度 | 常规长训练保护点 | ✅ | ✅ | ✅ | 待补充 | 静态图 CheckpointMonitor;动态图 checkpoint config;HyperParallel train.checkpoint.save_steps |
| Final checkpoint | 正常训练结束时保存最终状态 | 确保最后一次更新可交付 | ✅ | ✅ | ✅ | 待补充 | 三者 callback 均支持训练结束保存 |
| 异步 checkpoint | 将写盘放到后台执行,降低保存阻塞时间 | checkpoint 较大、共享存储较慢 | ✅ | ✅ | ⚠️ | 待补充 | MindFormers 配置 async save;HyperParallel 线程只浅拷贝 state,仍读取 live model/optimizer,存在跨 step 一致性风险 |
| 去冗余保存 | 不重复保存可由其他 shard 恢复的数据,降低容量和写盘量 | 大规模分布式 checkpoint | ✅ | ✅ | ⚠️ | 待补充 | MindFormers 支持 remove redundancy;HyperParallel 依赖 DCP shard,但没有等价的 Trainer 策略配置 |
| Checkpoint 数量保留 | 自动删除过旧 checkpoint,控制存储增长 | 高频保存和长期训练 | ✅ | ✅ | ❌ | 待补充 | MindFormers keep_checkpoint_max/save_max;HyperParallel 无 keep-max |
| 模型与 optimizer 恢复 | 恢复参数和优化器状态,保持更新轨迹连续 | 手工重启、抢占恢复 | ✅ | ✅ | ✅ | 待补充 | 三者通过 checkpoint load path 恢复 |
| Global step/scheduler 恢复 | 恢复 step 和学习率调度位置 | 避免 warmup 或衰减阶段错位 | ✅ | ✅ | ✅ | 待补充 | HyperParallel 独立保存 scheduler/step;MindFormers 恢复 common info |
| RNG 状态恢复 | 恢复随机数状态,保证 dropout、采样等序列连续 | 精确复现和无损续训 | ⚠️ | ⚠️ | ✅ | 待补充 | HyperParallel 显式保存 Python/NumPy/Torch RNG;MindFormers 依赖训练框架及 checkpoint 状态,需按模型链路验证 |
| Dataloader 游标恢复 | 恢复已消费数据位置,避免重复或漏数 | 大数据集精确续训 | ✅ | ✅ | ✅ | 待补充 | MindFormers 按 consumed samples/step 跳数;HyperParallel 保存 StatefulDataLoader |
| 动态 GBS 续训 | global batch size 改变后仍按已消费样本恢复数据 | 扩缩卡或 batch 配置变化 | ⚠️ | ✅ | ❌ | 待补充 | 动态图 Trainer 有专门 consumed-sample 处理;其他链路需固定数据语义 |
| 新格式 checkpoint 完整性校验 | 校验 metadata 引用的 safetensors 文件是否齐全,拒绝明显残缺目录 | 写盘中断、文件丢失 | ✅ | ✅ | ❌ | 待补充 | MindFormers 新格式 loader 自动调用 verify_ckpt_valid |
| Metadata 原子更新 | 临时文件完成后原子替换 metadata,降低读到半写文件的概率 | 进程或存储中断 | ✅ | ✅ | ❌ | 待补充 | MindFormers 新格式 metadata 使用临时文件与 replace;HyperParallel 无 Trainer 完成 manifest |
| 完成 manifest/hash | 显式标记整个 checkpoint 完成并校验内容,避免把半 checkpoint 当作恢复点 | 多 shard 部分写入成功 | ❌ | ❌ | ❌ | 待补充 | 三者均缺少完整的内容 hash、失败回滚和完成协议 |
| Online reshard | 根据源、目标 ShardedTensor metadata 在线重切分,支持并行策略变化后加载 | DP/TP/PP/FSDP 切分变化 | ✅ | ⚠️ | ⚠️ | 待补充 | 静态图 checkpoint.reshard_worker_num;动态图复用 loader,但 load_worker_number 未传入,worker 实际仍为默认值;HyperParallel DCP 能处理部分 world-size 变化,缺少 Trainer 级显式流程和验收 |
| Balanced load | 在 rank 间平衡 checkpoint 文件读取任务,缓解存储热点 | shard 数量不均、共享存储瓶颈 | ✅ | ✅ | ❌ | 待补充 | MindFormers checkpoint.load_balanced: true |
| Weights-only load | 只加载模型,不恢复 optimizer,并正确处理 master weight | 微调、切换优化器、权重转换 | ✅ | ✅ | ⚠️ | 待补充 | 动态图 checkpoint.no_load_optim: true;HyperParallel 可通过状态选择实现,但无完整用户配置 |
| Exception checkpoint | 普通训练异常时尝试额外保存一次 | Python 异常或可控错误减少丢步 | ✅ | ❌ | ❌ | 待补充 | 静态图 CheckpointMonitor.exception_save: true |
| 健康 checkpoint 标记 | 根据 loss、global norm 等健康指标标记可恢复权重,避免从污染点继续训练 | NaN、梯度尖峰和精度劣化后的回退 | ✅ | ❌ | ❌ | 待补充 | 静态图健康 checkpoint 配置与选择链路已接入;动态图只有 HealthCheckpointConfig 声明,没有运行时消费 |
| Latest healthy 自动选择 | 启动时自动选择最近且健康、完整的 checkpoint | 无人值守故障恢复 | ✅ | ❌ | ❌ | 待补充 | 静态图 tools/resume_ckpt.py 参与筛选;其他 Trainer 需显式路径 |
| TFT 统一故障恢复接入 | 向底层容错框架注册同步 save/load hook,协调故障发现、重启和恢复 | 节点、进程、通信故障 | ✅ | ❌ | ❌ | 待补充 | 静态图 TrainFaultTolerance,通过 MS_ENABLE_TFT 打开相应能力 |
| 进程级快速恢复 ARF | 单进程或节点内进程故障后快速拉起并重建训练状态 | 局部进程退出、节点内恢复 | ✅ | ❌ | ❌ | 待补充 | 静态图 MS_ENABLE_TFT 含 ARF:1,并配置同步 checkpoint |
| UCE 故障恢复 | 对接底层 UCE 检测与恢复流程,从可用 checkpoint 重建状态 | NPU UCE 故障 | ⚠️ | ❌ | ❌ | 待补充 | 静态图设置 UCE:1;检测和故障处置依赖 MindSpore/TFT |
| 临终遗言/故障现场保存 | 在可控故障退出前尽量保存最后训练现场 | 缩短相邻周期 checkpoint 之间的回退步数 | ⚠️ | ❌ | ❌ | 待补充 | 静态图 exception save/TFT save hook 可覆盖部分故障;致命硬件或进程故障不保证成功 |
| TRE 联动 | global norm 异常同步后抛出可被恢复框架识别的错误 | 精度异常自动回退 | ✅ | ❌ | ❌ | 待补充 | 静态图 MS_ENABLE_TFT=TRE:1 配合 global norm health 配置 |
| SDC SilentCheck/CheckSum | 检测静默数据损坏并通过跨 rank 校验确认异常 | 长训练无显式报错但精度漂移 | ⚠️ | ❌ | ❌ | 待补充 | 静态图 MindSpore ≥2.7,设置 NPU_ASD_ENABLE=1、MS_SDC_DETECT_ENABLE=1 并加入 SDCMonitor;当前主要告警,未形成自动恢复闭环 |
| 硬件压力检测 | 周期执行硬件精度/电压压力检测,发现亚健康设备 | 长时间大规模集群训练 | ⚠️ | ❌ | ❌ | 待补充 | 静态图 StressDetectCallBack/StressTestModelMonitor,属于实验能力 |
| 弹性成员变化 | rank 成员变化后重新 rendezvous,并重建 mesh、模型、optimizer 和 dataloader | 节点替换、动态扩缩容 | ❌ | ❌ | ❌ | 待补充 | 三套 Trainer 当前均无完整弹性训练闭环 |
| Checkpoint 失败策略 | 保存或加载失败时 fail-fast、降级或告警,避免无保护运行或假恢复 | 存储不可用、权限和容量异常 | ⚠️ | ⚠️ | ⚠️ | 待补充 | HyperParallel 当前捕获异常后仅 warning 并继续,风险最高;建议策略化并默认 fail-fast |
主要源码入口:
- 静态图:
mindformers/core/callback/callback.py:1604、:1630、:2792、:3360,mindformers/trainer/base_trainer.py:1120、:1434,mindformers/version_control.py:241。 - 动态图:
mindformers/pynative/callback/checkpoint_callback.py:31、mindformers/pynative/trainer/trainer.py:779。 - 共享新格式 checkpoint:
mindformers/checkpoint/checkpoint.py、reshard.py、fully_parallel.py、utils.py:314。 - HyperParallel:
hyper_parallel/trainer/callbacks/base.py:259、:285、:374、:420。
6. HyperParallel 主要能力欠缺
P0:修复已有能力的真实可用性
- 统一剩余 callback 配置访问路径为
args.train.*。TrainingStateMonitor 和 GradientHealth 已正确接线;Profiler、通用 TensorBoard、Memory、MoE、GC、Eval 等仍读取错误层级。 - 实现 Profiler callback:按 step/rank 调度 CPU/NPU、通信、显存、stack、MSTX trace,并保存并行策略 metadata。
- 实现轻量 Memory monitor:current/peak allocated/reserved、逐 step peak reset、rank 聚合,以及 OOM 自动诊断包。
- 实现 TensorBoard callback,并复用现有 logging event,确保终端日志和 TensorBoard 指标同源。
- 扩展现有 NaN/Inf health callback:除 global grad norm 外同时检查 loss 和 local/device norm;异常时所有 rank 协同退出。
- 修复异步 checkpoint 一致性:optimizer step 后创建不可变 CPU staging,再异步写盘;增加临时目录、完成 manifest 和失败策略。
P1:补齐大模型精度与性能诊断
- 在已有 micro/local/device loss 和 local/device grad norm 基础上,补充跨 rank 对比/聚合、weight norm、optimizer moment norm,并完成 DP/TP/PP/FSDP 语义验收。
- 增加 Attention
max_logits和mean_sum。若mean_sum的业务定义不同于现有 MindFormers 的max_attention_logit/mean,需先固定公式、聚合维度和跨 TP/CP 规约语义。 - 增加 MoE
max_vio一等指标;基于同步后的 tokens-per-expert 计算并输出 layer 级、全局最大值和趋势,同时保留原始直方图。 - 增加 global norm spike 检测、连续异常次数、跳数据和健康 checkpoint 联动。
- 自动计算 FLOPs/token、TFLOPS 和 MFU;增加数据等待、PP bubble/stage imbalance、吞吐基线和扩卡线性度。
P2:建立高可用闭环
- 增加 checkpoint keep-max、完整性验证、完成 manifest/hash、latest complete/healthy 自动选择。
- 定义
on_exception生命周期和 last-words checkpoint;诊断包包含配置、日志、最近指标、显存摘要和 profiler 环形缓冲。 - 接入进程/节点故障恢复:rendezvous、重建 process group/device mesh、模型、optimizer 和 dataloader,并建立故障注入测试。
- 建立 health checkpoint、UCE/SDC 检测和自动回退之间的统一状态机。
- 将 Trainer 平台化:分别提供 PyTorch eager 和 MindSpore PyNative adapter;若需要 MindSpore 静态图,再单独建设 graph Trainer adapter。
7. 建议验收矩阵
| 维度 | 最低验收标准 |
|---|---|
| 精度 | 单卡及 DP/TP/PP/FSDP 下 loss、global/local/device norm 语义一致;max_vio、attention max_logits/mean_sum 有明确公式和并行规约;注入 NaN/Inf 后全 rank 有界退出 |
| 性能 | 指定 step/rank 能生成可解析 trace;通信、显存、stack、MSTX 开关有效;持续指标包含 tokens/s、TFLOPS、MFU、数据等待和 PP stage 信息 |
| 显存 | 每 step current/peak 可观测并可跨 rank 对比;构造 OOM 能自动生成诊断包;监控关闭时开销可忽略 |
| 高可用 | 覆盖 kill 单进程/单节点、写盘失败、半 checkpoint、异常 loss 四类故障;只从完整且健康的 checkpoint 恢复;恢复后的数据、RNG 和 loss 与无故障基线一致 |
| Trainer 后端 | PyTorch eager、MindSpore PyNative、MindSpore GRAPH 分别列能力并独立验收,不能将核心库支持误报为 Trainer 支持 |
schema_version: 1
source: gitcode
gitcode_repo: mindspore/hyper-parallel
gitcode_issue: 305
source_url: https://gitcode.com/mindspore/hyper-parallel/issues/305
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the listed MindFormers and HyperParallel callback, trainer, profiler, configuration, and memory-visualizer paths. Verify the capability comparisons against those entry points, including the stated configuration limitations and unsupported features. Done means a consistent training-debugging gap analysis covering monitoring, profiling, memory analysis, recovery, and checkpoint behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- documentation
- Issue type
- Documentation
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100