Prhub

#5782 [megatron, ckpt] fix: handle None param_data in get_megatron_module_device when use_distributed_optimizer=False

原始 PR 作者 khazic 合并时间 2026-06-02 19:11 文件变更 1 提交数 1 评论 1 代码增减 +6 / -0

执行摘要

修复分布式优化器关闭时 checkpoint 保存崩溃

在 PP=4, EP=2, TP=2, ETP=2 + vanilla_mbridge=True 的 MoE 模型训练中,use_distributed_optimizer=True 会导致 NCCL 通信组不兼容的启动错误,只能设为 False。此时 param_data 为 None,原代码 buffer.param_data.storage().size() 直接崩溃,导致 checkpoint 完全无法保存。

该 PR 值得关注,即修补了一个边界条件(distributed optimizer 关闭)导致的崩溃。变动极小、清晰、可追溯。

讨论亮点

review 讨论较少:gemini-code-assist[bot] 给出标准总结后表示无反馈;ETOgaosion 直接批准。没有出现设计争议。

实现拆解

  1. 在 verl/utils/megatron_utils.py 的 get_megatron_module_device 函数中,在已有的 buffer.param_data.storage().size() == 0 判断之前,新增 if buffer.param_data is None: 分支。
  2. 当 param_data 为 None 时,改用 next(model_chunk.module.parameters()).device.type 获取模型参数的 device 类型;若模块无参数则回退为 cpu。
  3. 其他逻辑不变:若 storage size 为 0(空 buffer)则返回 cpu,否则返回 get_device_name()。
文件 模块 状态 重要度
verl/utils/megatron_utils.py 检查点 modified 5.92

关键符号

get_megatron_module_device

关键源码片段

verl/utils/megatron_utils.py core-logic

核心文件,修复 checkpoint 保存时的崩溃,新增对 `param_data is None` 的处理。

def get_megatron_module_device(models: list[Any]) -> str:
    if not models:
        return "cpu"
​
    model_chunk = models[0]
    if not model_chunk.buffers:
        try:
            return next(model_chunk.module.parameters()).device.type
        except StopIteration:
            return "cpu"
​
    buffer = model_chunk.buffers[0]
    # When use_distributed_optimizer=False, param_data is None
    # because no flat param buffer is allocated.
    # Fall back to checking module parameters directly.
    if buffer.param_data is None:
        try:
            return next(model_chunk.module.parameters()).device.type
        except StopIteration:
            return "cpu"
    # Original checks for empty buffer
    if buffer.param_data.storage().size() == 0:
        return "cpu"
    else:
        return get_device_name()

评论区精华

代码变更确认 正确性

gemini-code-assist[bot] 对变更进行总结,确认处理方式,表示无反馈。

结论:无异议,直接批准。 · 已解决

风险与影响

风险低。修改仅限于 get_megatron_module_device 中的新增条件分支,不会影响 use_distributed_optimizer=True 的已有路径。但是回退方案调用 next(model_chunk.module.parameters()) 可能较慢(遍历所有参数),但对于保存 checkpoint 的调用频率而言可接受。同时,当模块参数跨设备时,只会返回第一个参数的 device 类型,可能与实际存储位置不一致(但 checkpoint 保存通常需要统一 device 分配,风险可控)。

直接影响:修复了 use_distributed_optimizer=False + checkpoint 保存的组合崩溃,使得使用该配置的 MoE 模型训练能够正常保存 checkpoint。影响范围有限,仅触发特定并行配置。

边界条件修复 无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论