Prhub

#1762 [Fix] Initialize grad_norm before found_inf skip path

原始 PR 作者 kaysonyu 合并时间 2026-04-07 14:59 文件变更 1 提交数 3 评论 0 代码增减 +1 / -0

执行摘要

修复 Megatron 训练中 found_inf=True 时 grad_norm 未初始化导致的 UnboundLocalError。

根据PR body描述,当启用--no-check-for-nan-in-loss-and-grad参数时,如果optimizer.prepare_grads()返回found_inf=True,代码会跳过optimizer.step(),但grad_norm变量在该分支中未初始化,导致train_one_step()函数返回时引发UnboundLocalError。修复目的是避免训练崩溃,确保异常处理路径的健壮性。

该PR变更简单直接,适合快速浏览以了解Megatron训练中异常处理机制。值得关注的是,它揭示了梯度检查与训练步骤之间的耦合关系,以及如何通过变量初始化避免边界条件错误。对于维护类似训练循环的工程师有参考价值。

讨论亮点

本次PR没有review评论,因此没有讨论记录。

实现拆解

仅修改了slime/backends/megatron_utils/model.py文件中的forward_step函数。在found_inf分支检查之前,添加一行代码将grad_norm初始化为float("nan")。这样,无论是否进入found_inf分支,grad_norm都有定义,避免UnboundLocalError。

文件 模块 状态 重要度
slime/backends/megatron_utils/model.py Megatron 训练后端 modified 8.0

关键符号

forward_step

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低。变更仅涉及单个变量的初始化,不影响核心训练逻辑。grad_norm被初始化为NaN,在found_inf=True时表示无效梯度范数,符合语义。需注意:如果其他代码依赖grad_norm为有效数值,在found_inf路径下可能产生意外行为,但根据PR描述,该路径本应跳过参数更新,因此风险可控。

对用户:修复了特定配置下的训练崩溃问题,提升系统稳定性。对系统:确保异常处理路径不会导致进程中断,支持更健壮的大规模训练。对团队:维护了Megatron训练模块的代码质量,避免潜在bug。影响范围限于使用--no-check-for-nan-in-loss-and-grad参数且遇到梯度异常的用户。

边界条件处理

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论